Запросы в Flutter ListView

#flutter

#flutter

Вопрос:

Я изучаю listviews, и у меня есть следующие два файла dart, один с использованием ListView builder, а другой Listview. Оба выдают одинаковый результат. Я следовал руководству по просмотру списка:https://pusher.com/tutorials/flutter-listviews

Ниже приведены мои запросы к listview:

  1. Я понимаю, что в реальном мире данные будут поступать из API, и хотел бы знать, какой из приведенных ниже вариантов будет использоваться и почему?
  2. Правильно ли я понимаю, что любой виджет, подобный контейнеру, текст может быть дочерним элементом в ListView?
  3. В варианте 1 дочерним элементом ListView является функция _buildListItemsFromLocation(). Является ли это хорошей практикой или нам следует переместить код _buildListItemsFromLocation() в отдельный файл dart?

Вариант 1: Просмотр списка

 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(),
    );
  }
}


  

Вариант 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),
                )
              ],
            );
        }
        );
      }
  }


  

Ответ №1:

  1. Я использую метод 2, потому что он прост для понимания и следует порядку сверху вниз, поэтому легко читать код.
  2. Любой виджет может быть дочерним по отношению к другому виджету. В зависимости от того, как и для чего вы их используете.
  3. Многие люди говорят, что мы должны создать другой класс, а затем вызвать его снова, а не разделять, как указано выше, потому что это влияет на производительность приложения. В случае использования большого количества, но только на одном экране, вы можете использовать тот же метод, что и ваш собственный. Ответ может быть ошибочным, вам нечего дать себе.

Ответ №2:

  1. Если вы заранее не знаете размер списка, то создайте его с помощью builder

1.1 Если вы создаете список и знаете, что количество элементов не будет больше десяти или двенадцати, вы можете создать ListView из example1

  1. Любой виджет может быть в ListView . Для удобства есть виджет под названием ListTile , который содержит виджеты «начало», «конец», «заголовок», «субтитры»
  2. все в порядке