#flutter
#flutter
Вопрос:
Я изучаю listviews, и у меня есть следующие два файла dart, один с использованием ListView builder, а другой Listview. Оба выдают одинаковый результат. Я следовал руководству по просмотру списка:https://pusher.com/tutorials/flutter-listviews
Ниже приведены мои запросы к listview:
- Я понимаю, что в реальном мире данные будут поступать из API, и хотел бы знать, какой из приведенных ниже вариантов будет использоваться и почему?
- Правильно ли я понимаю, что любой виджет, подобный контейнеру, текст может быть дочерним элементом в ListView?
- В варианте 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:
- Я использую метод 2, потому что он прост для понимания и следует порядку сверху вниз, поэтому легко читать код.
- Любой виджет может быть дочерним по отношению к другому виджету. В зависимости от того, как и для чего вы их используете.
- Многие люди говорят, что мы должны создать другой класс, а затем вызвать его снова, а не разделять, как указано выше, потому что это влияет на производительность приложения. В случае использования большого количества, но только на одном экране, вы можете использовать тот же метод, что и ваш собственный. Ответ может быть ошибочным, вам нечего дать себе.
Ответ №2:
- Если вы заранее не знаете размер списка, то создайте его с помощью builder
1.1 Если вы создаете список и знаете, что количество элементов не будет больше десяти или двенадцати, вы можете создать ListView
из example1
- Любой виджет может быть в
ListView
. Для удобства есть виджет под названиемListTile
, который содержит виджеты «начало», «конец», «заголовок», «субтитры» - все в порядке