2017-10-15 7 views
0

J'ai créé une version de mon application de démonstration de défilement en utilisant Flutter. Je me demande pourquoi le défilement listview de mon application n'est pas aussi lisse que l'application flutter gallery. J'ai utilisé LG G5 pour ce test.Pourquoi la liste de lecture de mon application de flutter ne défile pas aussi facilement que l'application de galerie de flutter?

est ici a link to my app's demo

Edit: est le code ici.

class ListViewSample extends StatelessWidget { 
@override 
Widget build(BuildContext buidContext) { 
return new Container(
    child: new Center(
    child: new ListView(
     children: createListTiles(), 
    ), 
    ) 
); 
} 

List<Widget> createListTiles() { 
List<Widget> tiles = <Widget>[]; 
    for(int i = 0; i < 40; i++) { 
    int count = i + 1; 
    tiles.add(
    new ListTile(
     leading: new CircleAvatar(
     child: new Text("$count"), 
     backgroundColor: Colors.lightGreen[700], 
    ), 
     title: new Text("Title number $count"), 
     subtitle: new Text("This is the subtitle number $count"), 
    ) 
); 
} 
return tiles; 
} 

Est-ce que quelqu'un connaît la même chose?

Merci!

+0

Comment avez-vous implémenté votre ListView? Pouvez-vous s'il vous plaît partager du code? –

Répondre

2

Le problème avec votre code est que vous utilisez le ListView normal, ce qui n'est pas approprié pour les listes qui ont beaucoup d'éléments. Tous ces 40 widgets sont gardés en mémoire, ce qui provoque l'expérience de défilement janky dont vous souffrez.

Si vous avez un grand nombre ou un nombre indéfini d'éléments, vous devez utiliser ListView.builder à la place. Il construit uniquement les éléments de liste visibles à la demande, ce qui permet de faire défiler les listes encore plus volumineuses.

Voici un exemple complet comment vous migrer votre liste d'utiliser l'approche du constructeur:

import 'package:flutter/material.dart'; 

class ListViewSample extends StatelessWidget { 
    @override 
    Widget build(BuildContext context) { 
    return new Scaffold(
     body: new Center(
     child: new ListView.builder(
      itemCount: 200, 
      itemBuilder: (context, index) { 
      final count = index + 1; 

      return new ListTile(
       leading: new CircleAvatar(
       child: new Text("$count"), 
       backgroundColor: Colors.lightGreen[700], 
      ), 
       title: new Text("Title number $count"), 
       subtitle: new Text("This is the subtitle number $count"), 
      ); 
      }, 
     ), 
    ), 
    ); 
    } 
} 

Notez qu'il ya beaucoup d'éléments, dans ce cas 200, mais le défilement est encore beurré lisse.

+0

@Liro, merci! Je n'ai aucune idée de cette approche. C'est comme le recyclerview pour flutter. Je vais essayer cela, puis accepter votre réponse si j'ai le rouleau lisse que je cherche. –

+0

@Liro J'ai essayé votre code. Il a en effet amélioré le défilement mais encore, pas aussi lisse que les applications natives Android. Est-ce vraiment attendu pour flutter? –

+0

L'avez-vous essayé en mode debug ou release? D'après ce que je comprends, les applications de débogage utilisent la compilation JIT et sont un peu plus lentes, d'où la bannière "Slow Mode". Mais les applications de publication sont compilées en code natif, elles doivent donc être généralement au moins aussi fluides que les applications natives, sinon meilleures. –