Flutter分类列表展示插件list_with_categories的使用

Flutter分类列表展示插件list_with_categories的使用

简介

ListViewWithCategories 是一个灵活的 Flutter 包,提供了可自定义的带分类的列表视图。开发人员可以轻松地在他们的 Flutter 应用程序中实现带有分类的列表视图。该包支持水平和垂直布局,适用于各种不同的应用场景。

特性

  • 可定制的尺寸:设置宽度、高度和分类之间的间距以适应您的用户界面设计。
  • 方向支持:可以选择列或行布局来组织您的分类和列表视图。
  • 滚动控制器:集成了 ScrollablePositionedList 用于精确控制滚动位置,并通过 ItemPositionsListener 处理滚动事件。
  • 动态项目构建:使用自定义的构建器函数来构建列表项和分类,为内容渲染提供灵活性。

List with Cats Example

开始使用

要使用此包,在您的 pubspec.yaml 文件中添加 ListViewWithCategories 作为依赖项。

dependencies:
  list_with_categories: latest_version

使用方法

ListViewWithCategories 小部件允许创建具有可定制尺寸、方向和项目构建器的分类列表视图。以下是使用它的步骤:

基本设置

首先,确保在 Dart 文件中导入该包:

import 'package:list_with_categories/list_with_categories.dart';

接下来,使用 ListViewWithCategories 小部件创建一个分类列表视图:

ListViewWithCategories(
  controller: controller,
  scrollListener: listScrollListener,
  itemsLength: cats.length,
  itemBuilder: (_, index) {
    final sectionLetter = cats[index];
    final animal = groupedBrands[sectionLetter] ?? [];
    return Column(
      crossAxisAlignment: CrossAxisAlignment.start,
      children: [
        Padding(
          padding: const EdgeInsets.symmetric(horizontal: 20),
          child: Text(
            sectionLetter,
            style: const TextStyle(fontWeight: FontWeight.bold),
          ),
        ),
        ...animal.map(
          (e) => ListTile(
            title: Text(e),
          ),
        )
      ],
    );
  },
  categoryBuilder: (_, index) {
    return InkWell(
        onTap: () {
          controller.scrollTo(
              index: index,
              duration: const Duration(milliseconds: 200));
        },
        child: Padding(
          padding: const EdgeInsets.all(8.0),
          child: Text(cats[index]),
        ));
  },
)

示例代码

以下是一个完整的示例代码,展示了如何在 Flutter 项目中使用 ListViewWithCategories

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

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({
    super.key,
  });

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  late ListScrollController controller;
  late ListScrollListener listScrollListener;

  final List<String> animals = [
    'Aardvark',
    'Baboon',
    'Cheetah',
    'Dolphin',
    'Elephant',
    'Flamingo',
    'Giraffe',
    'Hippopotamus',
    'Iguana',
    'Jaguar',
    'Koala',
    'Lion',
    'Meerkat',
    'Narwhal',
    'Ocelot',
    'Panda',
    'Quokka',
    'Raccoon',
    'Sloth',
    'Tiger',
    'Umbrellabird',
    'Vulture',
    'Wallaby',
    'Xerus',
    'Yak',
    'Zebra',
    'Antelope',
    'Buffalo',
    'Cougar',
    'Duck',
    'Eagle',
    'Falcon',
    'Gorilla',
    'Hyena',
    'Impala',
    'Jackal',
    'Kangaroo',
    'Lemur',
    'Mongoose',
    'Numbat',
  ];

  [@override](/user/override)
  void initState() {
    controller = ListScrollController();
    listScrollListener = ListScrollListener();
    super.initState();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    animals.sort((a, b) => a.compareTo(b));
    final cats = animals.map((e) => e[0].toUpperCase()).toSet().toList();
    final Map<String, List<String>> groupedBrands = {};
    for (final letter in cats) {
      groupedBrands[letter] =
          animals.where((e) => e.toUpperCase().startsWith(letter)).toList();
    }
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: const Text("List with Cats Example"),
      ),
      body: ListViewWithCategories(
        controller: controller,
        scrollListener: listScrollListener,
        itemsLength: cats.length,
        itemBuilder: (_, index) {
          final sectionLetter = cats[index];
          final animal = groupedBrands[sectionLetter] ?? [];
          return Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              Padding(
                padding: const EdgeInsets.symmetric(horizontal: 20),
                child: Text(
                  sectionLetter,
                  style: const TextStyle(fontWeight: FontWeight.bold),
                ),
              ),
              ...animal.map(
                (e) => ListTile(
                  title: Text(e),
                ),
              )
            ],
          );
        },
        categoryBuilder: (_, index) {
          return InkWell(
              onTap: () {
                controller.scrollTo(
                    index: index,
                    duration: const Duration(milliseconds: 200));
              },
              child: Padding(
                padding: const EdgeInsets.all(8.0),
                child: Text(cats[index]),
              ));
        },
      ),
    );
  }
}

更多关于Flutter分类列表展示插件list_with_categories的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter分类列表展示插件list_with_categories的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


list_with_categories 是一个用于在 Flutter 应用中展示分类列表的插件。它可以帮助你轻松地创建带有分类标题的列表,类似于联系人列表或设置页面中的分类。以下是如何使用 list_with_categories 插件的基本步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 list_with_categories 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  list_with_categories: ^1.0.0  # 请使用最新版本

然后运行 flutter pub get 来获取依赖。

2. 导入插件

在你的 Dart 文件中导入 list_with_categories 插件:

import 'package:list_with_categories/list_with_categories.dart';

3. 创建分类列表

使用 ListWithCategories 组件来创建带有分类的列表。你可以通过 categories 属性来定义分类和对应的列表项。

class MyHomePage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('分类列表示例'),
      ),
      body: ListWithCategories(
        categories: [
          Category(
            title: '水果',
            items: [
              ListTile(title: Text('苹果')),
              ListTile(title: Text('香蕉')),
              ListTile(title: Text('橙子')),
            ],
          ),
          Category(
            title: '蔬菜',
            items: [
              ListTile(title: Text('胡萝卜')),
              ListTile(title: Text('菠菜')),
              ListTile(title: Text('番茄')),
            ],
          ),
          Category(
            title: '饮料',
            items: [
              ListTile(title: Text('水')),
              ListTile(title: Text('果汁')),
              ListTile(title: Text('茶')),
            ],
          ),
        ],
      ),
    );
  }
}

4. 自定义样式

你可以通过 ListWithCategoriescategoryHeaderStyleitemStyle 属性来自定义分类标题和列表项的样式。

ListWithCategories(
  categories: [
    // 你的分类和列表项
  ],
  categoryHeaderStyle: TextStyle(
    fontSize: 18,
    fontWeight: FontWeight.bold,
    color: Colors.blue,
  ),
  itemStyle: TextStyle(
    fontSize: 16,
    color: Colors.black,
  ),
);

5. 处理点击事件

你可以为每个列表项添加点击事件处理程序。例如,使用 onItemTap 属性来处理点击事件:

ListWithCategories(
  categories: [
    Category(
      title: '水果',
      items: [
        ListTile(title: Text('苹果'), onTap: () => print('苹果被点击')),
        ListTile(title: Text('香蕉'), onTap: () => print('香蕉被点击')),
        ListTile(title: Text('橙子'), onTap: () => print('橙子被点击')),
      ],
    ),
    // 其他分类
  ],
);

6. 完整示例

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

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter 分类列表示例',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('分类列表示例'),
      ),
      body: ListWithCategories(
        categories: [
          Category(
            title: '水果',
            items: [
              ListTile(title: Text('苹果'), onTap: () => print('苹果被点击')),
              ListTile(title: Text('香蕉'), onTap: () => print('香蕉被点击')),
              ListTile(title: Text('橙子'), onTap: () => print('橙子被点击')),
            ],
          ),
          Category(
            title: '蔬菜',
            items: [
              ListTile(title: Text('胡萝卜'), onTap: () => print('胡萝卜被点击')),
              ListTile(title: Text('菠菜'), onTap: () => print('菠菜被点击')),
              ListTile(title: Text('番茄'), onTap: () => print('番茄被点击')),
            ],
          ),
          Category(
            title: '饮料',
            items: [
              ListTile(title: Text('水'), onTap: () => print('水被点击')),
              ListTile(title: Text('果汁'), onTap: () => print('果汁被点击')),
              ListTile(title: Text('茶'), onTap: () => print('茶被点击')),
            ],
          ),
        ],
        categoryHeaderStyle: TextStyle(
          fontSize: 18,
          fontWeight: FontWeight.bold,
          color: Colors.blue,
        ),
        itemStyle: TextStyle(
          fontSize: 16,
          color: Colors.black,
        ),
      ),
    );
  }
}
回到顶部