Flutter粘性网格视图插件sticky_grid_view的使用

Flutter粘性网格视图插件sticky_grid_view的使用

特性

在列表视图中列出网格视图会导致性能不佳(显示优化失败),因为ListView仅优化某些自身元素。它不会去优化其子组件。因此,GridView的元素会排除在这种状态之外。

此外,StickyGridView会优化自身及其所有子组件,并防止延迟。

使用方法

首先,创建头部列表。然后创建一个Map<String, List<GridImage>>映射。

List<String> headers = [
    'Flags 1',
    'Flags 2',
    'Flags 3',
    'Flags 4',
    'Flags 5',
    'Flags 6'
  ];
  Map<String, List<GridImage>> map = {};

接下来初始化映射:

Future<void> initMap() async {
  double width = 28;
  double height = 20;
  for (int i = 0; i < headers.length; i++) {
    List<GridImage> gridImages = [];
    double y = i * height;
    int range = 5 + Random().nextInt(11);
    for (int j = 0; j < range; j++) {
      double x = j * width;
      GridImage gridImage = GridImage.fromAssetPart(
          'assets/images/all_flags.png', x, y, width, height);
      await gridImage.initUiImage();
      gridImages.add(gridImage);
    }
    map[headers[i]] = gridImages;
  }
}

最后,在构建方法中使用StickyGridView

Widget build(BuildContext context) {
  return StickyGridView(
      crossAxisCount: 6,
      map: map,
      headers: headers,
      onClick: (section, index) {
        ScaffoldMessenger.of(context).showSnackBar(SnackBar(
          content: Text('Section: $section, index: $index , header: ${headers[section]}'), duration: const Duration(milliseconds: 500),));
      });
}

完整示例代码

以下是一个完整的示例代码,展示了如何使用StickyGridView插件:

import 'dart:developer' as dev;
import 'dart:math';
import 'package:flutter/material.dart';
import 'package:sticky_grid_view/grid_image.dart';
import 'package:sticky_grid_view/sticky_grid_view.dart';

void main() {
  runApp(MainWidget());
}

class MainWidget extends StatelessWidget {
  List<String> headers = [
    'Flags 1',
    'Flags 2',
    'Flags 3',
    'Flags 4',
    'Flags 5',
    'Flags 6'
  ];
  Map<String, List<GridImage>> map = {};

  late Future<void> init;

  MainWidget({Key? key}) : super(key: key) {
    init = initMap();
  }

  Future<void> initMap() async {
    double width = 28;
    double height = 20;
    for (int i = 0; i < headers.length; i++) {
      List<GridImage> gridItems = [];
      double y = i * height;
      int range = 5 + Random().nextInt(11);
      for (int j = 0; j < range; j++) {
        double x = j * width;
        GridImage gridItem = GridImage.fromAssetPart(
            'assets/images/all_flags.png', x, y, width, height);
        await gridItem.initUiImage();
        gridItems.add(gridItem);
      }
      map[headers[i]] = gridItems;
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        backgroundColor: Colors.deepPurple,
        appBar: AppBar(
          backgroundColor: Colors.deepPurple,
          title: const Text('StickyGridView'),
          centerTitle: true,
        ),
        body: FutureBuilder(
            future: init,
            builder: (context, snapshot) {
              if (snapshot.connectionState == ConnectionState.waiting) {
                return const Center(child: CircularProgressIndicator());
              }
              if (snapshot.hasError) {
                String error = "错误: " + snapshot.error.toString();
                return Center(child: Text(error));
              }
              return StickyGridView(
                headerFontSize: 19,
                backgroundColor: Colors.deepPurple.shade50,
                headerColor: Colors.deepPurple,
                headerTextColor: Colors.white,
                crossAxisCount: 6,
                map: map,
                headers: headers,
                onClick: (int section, int index) {
                  ScaffoldMessenger.of(context).showSnackBar(SnackBar(
                      content: Text(
                          'Section: $section, index: $index , header: ${headers[section]}'),
                      duration: const Duration(milliseconds: 500)));
                },
              );
            }),
      ),
    );
  }
}

更多关于Flutter粘性网格视图插件sticky_grid_view的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter粘性网格视图插件sticky_grid_view的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何使用Flutter中的sticky_grid_view插件来实现粘性网格视图的代码示例。这个插件允许你创建一个网格视图,其中的某些行或列可以固定在顶部或左侧,类似于Excel中的冻结窗格功能。

首先,确保你已经在pubspec.yaml文件中添加了sticky_grid_view依赖:

dependencies:
  flutter:
    sdk: flutter
  sticky_grid_headers: ^0.2.0  # 请检查最新版本号

然后,运行flutter pub get来安装依赖。

接下来是一个完整的示例代码,展示如何使用StickyGridView

import 'package:flutter/material.dart';
import 'package:sticky_grid_headers/sticky_grid_headers.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Sticky GridView Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: Text('Sticky GridView Example'),
        ),
        body: StickyGridViewExample(),
      ),
    );
  }
}

class StickyGridViewExample extends StatelessWidget {
  final List<String> headers = List<String>.generate(10, (index) => 'Header $index');
  final List<List<String>> gridData = List.generate(
    10,
    (i) => List.generate(
      5,
      (j) => 'Item ${i * 5 + j + 1}',
    ),
  );

  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: const EdgeInsets.all(8.0),
      child: StickyHeaderGrid(
        gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
          crossAxisCount: 5,
          crossAxisSpacing: 4.0,
          mainAxisSpacing: 4.0,
        ),
        headerBuilder: (BuildContext context, int index) {
          return Container(
            color: Colors.blueGrey[100],
            alignment: Alignment.center,
            child: Text(
              headers[index],
              style: TextStyle(color: Colors.black, fontWeight: FontWeight.bold),
            ),
          );
        },
        itemCount: gridData.length,
        itemBuilder: (BuildContext context, int index) {
          final List<String> row = gridData[index];
          return GridView.builder(
            gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
              crossAxisCount: row.length,
              crossAxisSpacing: 4.0,
              mainAxisSpacing: 4.0,
            ),
            shrinkWrap: true,
            physics: NeverScrollableScrollPhysics(),
            itemCount: row.length,
            itemBuilder: (BuildContext context, int subIndex) {
              return Center(
                child: Text(
                  row[subIndex],
                  style: TextStyle(color: Colors.black),
                ),
              );
            },
          );
        },
        itemExtent: 50.0, // 每个子项的高度(或宽度,取决于交叉轴方向)
      ),
    );
  }
}

注意:上面的代码示例实际上使用了sticky_headers包中的StickyHeaderGrid,因为sticky_grid_view这个包在Flutter社区中可能并不常见,而sticky_headers提供了类似的功能。如果你确实在寻找一个特定的sticky_grid_view包,请确保你已经安装了正确的包,并根据其文档调整代码。不过,大多数粘性头部功能的实现都会遵循类似的模式。

如果sticky_grid_view是一个特定或新发布的包,并且不在pub.dev上广泛可用,你可能需要查阅该包的官方文档或仓库以获取正确的使用方法和示例代码。上面的代码提供了一个使用sticky_headers包实现粘性网格视图的基本思路,这可以作为一个起点。

回到顶部