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, добро пожаловать, чтобы обменяться и учиться вместе~