Requêtes sur Flutter ListView

Sep 18 2020

Je suis en train d'apprendre les listes de vues et j'ai les deux fichiers de fléchettes ci-dessous, l'un utilisant le générateur ListView et l'autre Listview. Les deux produisent le même résultat. J'ai suivi le guide listview:https://pusher.com/tutorials/flutter-listviews

Voici mes requêtes sur listview:

  1. Je comprends que dans le monde réel les données proviendront d'une API et je voulais savoir laquelle des options ci-dessous sera utilisée et pourquoi?
  2. Ai-je raison de comprendre que tout widget comme un conteneur, le texte peut être enfant de dans une listView?
  3. Dans l'option 1, l'enfant ListView est une fonction _buildListItemsFromLocation (). Est-ce une bonne pratique ou devrions-nous déplacer le code _buildListItemsFromLocation () vers un fichier de fléchettes séparé?

Option 1: ListView

class LocationListView extends StatefulWidget {
  @override
  _LocationListViewState createState() => _LocationListViewState();
}

class _LocationListViewState extends State<LocationListView> {

  List<Container> _buildListItemsFromLocation() {
    int index = 0;
    return locationData.map((location) {
      var container = Container(
          child: Row(
            children: [
              Container(
                margin: EdgeInsets.all(10.0),
                child: Image(
                  image: AssetImage(location.imagePath),
                  width: 100.0,
                  height: 100.0,
                  fit: BoxFit.cover,
                ),
              ),
              Container(
                child: Text(location.name),
              )
            ],
          ),
      );
      return container;
    }).toList();
  }

  @override
  Widget build(BuildContext context) {
    return ListView(
      children: _buildListItemsFromLocation(),
    );
  }
}


Option 2 - ListView.builder

class LocationList extends StatefulWidget {
  @override
  _LocationListState createState() => _LocationListState();
}

class _LocationListState extends State<LocationList> {

  @override
  Widget build(BuildContext context) {
        return ListView.builder(
          itemCount: locationData.length,
          itemBuilder: (context, index) {
            
            return Row(
              children: [
                Container(
                  margin: EdgeInsets.all(10.0),
                  child: Image(
                    image: AssetImage(locationData[index].imagePath),
                    width: 100.0,
                    height: 100.0,
                    fit: BoxFit.cover,
                  ),
                ),
                Container(
                  child: Text(locationData[index].name),
                )
              ],
            );
        }
        );
      }
  }


Réponses

2 Souvenir Sep 18 2020 at 09:04
  1. J'utilise la méthode 2 car elle est facile à comprendre et suit l'ordre de haut en bas, donc il est facile de lire le code.
  2. Tout widget peut être un enfant d'un autre widget. Selon comment et pour quoi vous les utilisez.
  3. Beaucoup de gens disent que nous devrions créer une autre classe, puis la rappeler plutôt que la scinder comme ci-dessus, car cela affecte les performances de l'application. Si vous en utilisez beaucoup mais sur un seul écran, vous pouvez utiliser la même méthode que la vôtre. La réponse peut être erronée, n'avez rien à vous donner.
1 Autocrab Sep 18 2020 at 09:01
  1. Si vous ne connaissez pas à l'avance la taille de la liste, créez-la via le générateur

1.1 Si vous créez une liste et que vous savez que le nombre d'éléments ne sera pas supérieur à dix ou douze, vous pouvez créer à ListViewpartir de l'exemple1

  1. N'importe quel widget peut être inclus ListView. Pour plus de commodité, il existe un widget appelé ListTile, qui contient des widgets de début, de fin, de titre et de sous-titre
  2. c'est ok