1. Введение
FlutterКак одна из самых популярных технологий в настоящее время, она уже привлекла внимание большого количества энтузиастов технологий, и даже некоторых闲鱼,美团,腾讯И другие крупные компании были введены в эксплуатацию. Хотя его экология еще не полностью созрела,GoogleБлаго, скорость его развития уже достаточно поразительна, можно предвидеть, что в будущемFlutterСпрос на разработчиков также будет расти.
Будь то первопроходцы текущей технологии или будущая тенденция, ей 9102 года. Именно с таким менталитетом автор и начал изучатьFlutter, и построилсклад, весь последующий код будет размещаться на нем, добро пожаловать звездочка, учитесь вместе. Это серия статей о Flutter, которую я написал:
- Создание красивых интерфейсов пользовательского интерфейса с помощью Flutter — основные компоненты
- Компонент контейнера прокрутки Flutter — ListView
- Макет сетки Flutter — статьи GridView
- Использование пользовательского значка во Flutter
проходить черезПредыдущийправильноListViewКомпонентное обучение, у нас есть предварительное понимание использования компонентов прокрутки, что очень важно для сегодняшнего обучения.GridViewКомпоненты очень помогают. потому что оба наследуют отBoxScrollView, так что более 80% свойств у них совпадают, и использование очень похоже.
И как показано на рисунке ниже,GridViewМакет сетки на самом деле очень часто используется в приложениях, поэтому давайте взглянем наFlutterКак это использовать~
2. Первое знакомство с GridView
Наш герой сегодняGridViewВсего имеется 5 конструкторов:GridView,GridView.builder,GridView.count,GridView.extentа такжеGridView.custom. Но не паникуйте, потому что можно сказать, что вы действительно можете освоить его конструктор по умолчанию~
посмотриGridViewКонструктор (нечастые свойства опущены):
GridView({
Key key,
Axis scrollDirection = Axis.vertical,
bool reverse = false,
ScrollController controller,
ScrollPhysics physics,
bool shrinkWrap = false,
EdgeInsetsGeometry padding,
@required this.gridDelegate,
double cacheExtent,
List<Widget> children = const <Widget>[],
})
Хотя атрибутов много, большинство из них знакомые, старые друзья~ за исключением одного обязательного параметраgridDelegateснаружи, общая суммаListViewПараметры конструктора по умолчанию такие же, поэтому в статье в начале написано masteredListViewучиться сноваGridViewОчень простая причина.
Тогда давайте сосредоточимся наgridDelegateЭтот параметр, на самом делеGridViewДелегат того, как компонент управляет расположением дочерних элементов. Чтобы отслеживать исходный код, мы можем найти его вscroll_view.dartвидеть в,gridDelegateТипSliverGridDelegate, следить дальшеsliver_grid.dartможно увидетьSliverGridDelegateПо сути, это абстрактный класс, и есть два класса реализации:
-
SliverGridDelegateWithFixedCrossAxisCount: для сценариев с фиксированным количеством столбцов; -
SliverGridDelegateWithMaxCrossAxisExtent: используется в сценариях, где дочерние элементы имеют ограничение по максимальной ширине;
2.1 SliverGridDelegateWithFixedCrossAxisCount
Давайте сначала посмотримSliverGridDelegateWithFixedCrossAxisCount, по названию класса также можно примерно догадаться, для чего он используется: если ваш макет每一行的列数是固定的, то вы должны использовать его.
Взгляните на его конструктор:
SliverGridDelegateWithFixedCrossAxisCount({
@required this.crossAxisCount,
this.mainAxisSpacing = 0.0,
this.crossAxisSpacing = 0.0,
this.childAspectRatio = 1.0,
})
-
crossAxisCount: количество столбцов, то есть сколько дочерних элементов в строке; -
mainAxisSpacing: Расстояние между зазорами в направлении главной оси; -
crossAxisSpacing: расстояние между зазорами в направлении вторичной оси; -
childAspectRatio: Соотношение сторон дочернего элемента.
Вы должны были видеть пример изображения выше, и вы поймете значение каждого параметра за считанные секунды. Однако здесь есть на что обратить особое внимание:Если соотношение сторон вашего дочернего элемента не равно 1, вы должны установитьchildAspectRatioАтрибуты.
2.2 SliverGridDelegateWithMaxCrossAxisExtent
SliverGridDelegateWithMaxCrossAxisExtentВ практических приложениях может быть и меньше, давайте взглянем на его конструктор:
SliverGridDelegateWithMaxCrossAxisExtent({
@required this.maxCrossAxisExtent,
this.mainAxisSpacing = 0.0,
this.crossAxisSpacing = 0.0,
this.childAspectRatio = 1.0,
})
можно увидеть, кромеmaxCrossAxisExtentКроме того, другие параметры иSliverGridDelegateWithFixedCrossAxisCountвсе так же. ТакmaxCrossAxisExtentДля чего это? Давайте посмотрим на пример:
Если ширина экрана телефона375,crossAxisSpacingзначение0,
-
maxCrossAxisExtentзначение125, количество столбцов сетки будет3. потому что125 * 3 = 375, в самый раз, ширина каждого столбца375/3. -
maxCrossAxisExtentзначение126, количество столбцов сетки будет3. потому что126 * 3 > 375, не отображается, ширина каждого столбца будет375/3. -
maxCrossAxisExtentзначение124, количество столбцов сетки будет4. потому что124 * 3 < 375, еще есть избыток, ширина каждого столбца будет375/4.
можно увидеть,maxCrossAxisExtentНа самом деле скажиGridViewКакова максимальная ширина дочерних элементов компонента, а затем рассчитайте соответствующую ширину столбца (на самом деле мы редко используем это, поэтому этот метод используется не часто).
3. Практическое применение
После предыдущего введения имеемGrdiViewИмея предварительное представление о компонентах, давайте рассмотрим, как их использовать. помни раньшеGridViewразличные конструкторы? фактически:
-
GridViewКонструктор по умолчанию можно сравнить сListViewКонструктор по умолчанию, подходит дляконечное число подэлементовсцена, потому чтоGridViewКомпоненты визуализируются одновременноchildrenкомпоненты дочерних элементов в ; -
GridView.builderКонструктор может быть аналогомListView.builderКонструктор, длядлинный переченьсцена, потому чтоGridViewКомпоненты будут динамически создаваться и уничтожаться в зависимости от появления на экране дочерних элементов, что снижает потребление памяти и повышает эффективность рендеринга; -
GridView.countКонструкторGrdiViewиспользоватьSliverGridDelegateWithFixedCrossAxisCountВ сокращении (синтаксический сахар) эффект точно такой же; -
GridView.extentСтиль конструктораGridViewиспользоватьSliverGridDelegateWithMaxCrossAxisExtentВ сокращении (синтаксический сахар) эффект точно такой же.
Давайте сначала рассмотрим простой пример, в котором используетсяGridView.countКонструктор имитирует список услуг на главной странице Meituan Takeaway (код пункта сервисного меню можно увидеть наздесь, что можно рассматривать как дальнейшее закрепление использования базовых компонентов):
код (адрес файла)
GridView.count(
crossAxisCount: 5,
padding: EdgeInsets.symmetric(vertical: 0),
children: serviceList.map((item) => ServiceItem(data: item)).toList(),
)
/*************/
/* 完全等同于 */
/************/
GridView(
padding: EdgeInsets.symmetric(vertical: 0),
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 5,
),
children: serviceList.map((item) => ServiceItem(data: item)).toList(),
)
предварительный просмотр
Давайте взглянем на список перекрестных разговоров в Гималаях.GridView.builderКонкретный пример создания макета сетки (код карты перекрестных помех можно найти вздесь):
код (адрес файла)
GridView.builder(
shrinkWrap: true,
itemCount: programmeList.length,
physics: NeverScrollableScrollPhysics(),
padding: EdgeInsets.symmetric(horizontal: 16),
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 3,
mainAxisSpacing: 10,
crossAxisSpacing: 10,
childAspectRatio: 0.7,
),
itemBuilder: (context, index) {
return Programme(data: programmeList[index]);
},
)
предварительный просмотр
4. Резюме
Эта статья впервые знакомитGridViewЗначение атрибутов компонента, и акцент делается на объясненииSliverGridDelegateWithFixedCrossAxisCountа такжеSliverGridDelegateWithMaxCrossAxisExtentПрименимые сценарии применения. Затем, через два примера практического применения, представленныхGridViewЧасто используемые конструкторы для компонентов. Я надеюсь, что благодаря введению в эту статью вы сможете освоитьFlutterИспользование макета сетки~
Весь код в этой статье размещен по адресуздесь, вы также можете подписаться на мойBlog, добро пожаловать, чтобы обменяться и учиться вместе~