Flutter列表管理插件list_manager的使用

Flutter列表管理插件list_manager的使用

项目名称

  • GitHub仓库大小:GitHub repo size
  • 贡献者数量:GitHub contributors
  • 星标数量:GitHub stars
  • 分叉数量:GitHub forks
  • 关注者数量:Twitter Follow

list_manager 是一个帮助开发者高效地实现分页、过滤和搜索功能的 Flutter 包。该包可以单独或组合使用这些操作。

如何使用

步骤一:添加依赖

pubspec.yaml 文件中添加 list_manager 依赖:

dependencies:
  list_manager: ^latest_version

步骤二:定义数据模型

定义用于存储数据的模型类:

class PostDataModel {
  PostDataModel({
    required this.userId,
    required this.id,
    required this.title,
    required this.body,
  });

  int userId;
  int id;
  String title;
  String body;
}

步骤三:定义控制器

定义分页控制器和过滤控制器:

late PagingController<PostDataModel> controller;
late FilterController<PostDataModel> filterController;

步骤四:配置分页控制器

配置分页控制器以加载数据:

controller = PagingController(
  pagingHelper: PagingHelper.init(error: error, loader: loader()),
  loadData: ({
    required PagingHelper helper,
  }) async {
    return Future.delayed(
      const Duration(seconds: 1),
      () {
        List<PostDataModel> list = [];
        int page = (helper.page ?? 0);
        for (int i = 10 * (page); i < 10 * (page + 1); i++) {
          var model = PostDataModel.fromMap(postData["data"][i]); // postData 是本地存储的 JSON 数据
          list.add(model);
        }
        controller.setPagingConfig(
          helper.copyWith(
            hasNext: true,
            loadNext: true,
            page: (page + 1),
            nextUrl: "nextUrl",
          ) ??
              PagingHelper.init(),
        );
        return Success(data: list);
      },
    );
  },
);

步骤五:配置过滤控制器

配置过滤控制器以加载过滤选项和处理过滤逻辑:

filterController = FilterController(
  loadFilters: loadFilters,
  pagingController: PagingController(
    pagingHelper: PagingHelper.init(error: filterError, loader: loader()),
    loadData: fetch2,
  ),
  applyFilter: ({
    required List<FilterData> selFilters,
    required String query,
    required PagingHelper helper,
  }) async {
    return Future.delayed(
      const Duration(seconds: 1),
      () {
        List<PostDataModel> list = [];
        int page = (helper.page ?? 0);
        for (int i = 10 * (page); i < 10 * (page + 1); i++) {
          var model = PostDataModel.fromMap(filterData["data"][i]);
          list.add(model);
        }
        if (page == 2) {
          return const Failure(reason: "Custom Error Filter wala");
        }
        filterController.pagingController?.setPagingConfig(
          helper.copyWith(
            hasNext: true,
            loadNext: true,
            page: (page + 1),
            nextUrl: "nextUrl",
          ) ??
              PagingHelper.init(),
        );
        return Success(data: list);
      },
    );
  },
);

步骤六:加载过滤选项

加载过滤选项并传递给过滤组件:

Future<Result<List<FilterData>>> loadFilters() async {
  await Future.delayed(const Duration(seconds: 2));
  final list = [
    FDropdownData(
      title: "用户",
      key: "user_id",
      onChange: () {},
      options: ["user1", "user2"],
    ),
    FDropdownData(
      title: "项目",
      key: "project_id",
      onChange: () {},
      options: ["project1", "project2"],
    ),
    FSliderData(
      title: "金额范围",
      minKey: "amount_less_than",
      maxKey: "amount_greater_than",
      labels: const RangeLabels("0", "20000"),
      values: const RangeValues(0, 20000),
      min: 0,
      max: 100000,
    ),
    FDateData(
      title: "日期",
      startDateKey: "start_date",
      endDateKey: "end_date",
      start: DateTime.now(),
      end: DateTime.now().add(const Duration(days: 34)),
    ),
    FRadioData(
      title: "按金额排序",
      key: "sort_by_amount",
      options: ["升序", "降序"],
    ),
    FRadioData(
      title: "按日期排序",
      key: "sort_by_date",
      options: ["升序", "降序"],
    ),
  ];
  return Success(data: list);
}

步骤七:加载数据

加载分页数据:

Future<Result<List<PostDataModel>>> fetch(PagingHelper? helper) async {
  return Future.delayed(
    const Duration(seconds: 1),
    () {
      List<PostDataModel> list = [];
      int page = (helper?.page ?? 0);
      for (int i = 10 * (page); i < 10 * (page + 1); i++) {
        var model = PostDataModel.fromMap(postData["data"][i]);
        list.add(model);
      }
      controller.setPagingConfig(
        helper?.copyWith(
          hasNext: true,
          loadNext: true,
          page: (page + 1),
          nextUrl: "nextUrl",
        ) ??
            PagingHelper.init(),
      );
      return Success(data: list);
    },
  );
}

步骤八:使用带有配置的过滤和分页控制器的组件

将配置好的过滤和分页控制器用于 ListManager 组件:

ListManager<PostDataModel>(
  itemBuilder: (
    BuildContext context,
    PostDataModel data,
    int index,
  ) {
    return Container(
      margin: const EdgeInsets.symmetric(vertical: 10),
      padding: const EdgeInsets.symmetric(vertical: 30, horizontal: 10),
      decoration: BoxDecoration(
        color: Colors.grey.shade300,
        borderRadius: BorderRadius.circular(10),
      ),
      child: Text("${data.id}. ${data.title}"),
    );
  },
  pagingController: controller,
  filterController: filterController,
  loader: const Center(
    child: Text(
      "Loading",
      style: TextStyle(
        fontSize: 22,
        fontWeight: FontWeight.bold,
      ),
    ),
  ),
  error: (context, error) {
    return Center(
      child: Text(
        "$error =&gt; Some Error Occured",
        style: const TextStyle(color: Colors.red),
      ),
    );
  },
)

步骤九:添加搜索和过滤按钮

添加搜索框和过滤按钮:

Row(
  children: [
    Expanded(
      child: SearchWidget(
        filterController: filterController,
        inputBorder: const OutlineInputBorder(),
      ),
    ),
    IconButton(
      icon: const Icon(Icons.filter_alt),
      onPressed: () async {
        showFilterBottomSheet();
      },
    ),
  ],
)

步骤十:显示底部过滤面板

显示底部过滤面板:

void showFilterBottomSheet() async {
  filterController.startLoadingFilters();
  showModalBottomSheet(
    context: context,
    isDismissible: false,
    showDragHandle: true,
    scrollControlDisabledMaxHeightRatio: 0.8,
    builder: (context) {
      return FilterComponent(
        title: "Filters",
        controller: filterController,
      );
    },
  );
}

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

1 回复

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


list_manager 是一个用于管理列表的 Flutter 插件,它可以帮助你更方便地处理列表数据的增删改查等操作。以下是如何使用 list_manager 插件的基本步骤和示例。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  list_manager: ^0.1.0  # 请使用最新版本

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

2. 导入包

在你的 Dart 文件中导入 list_manager 包:

import 'package:list_manager/list_manager.dart';

3. 使用 ListManager

ListManager 是一个用于管理列表的类。你可以使用它来添加、删除、更新和查询列表中的项。

初始化 ListManager

你可以通过传递一个初始列表来初始化 ListManager

ListManager<int> listManager = ListManager([1, 2, 3]);

添加项

使用 add 方法向列表中添加一个项:

listManager.add(4);

删除项

使用 remove 方法从列表中删除一个项:

listManager.remove(2);

更新项

使用 update 方法更新列表中的一个项:

listManager.update(3, 5);  // 将3更新为5

查询项

使用 contains 方法检查列表中是否包含某个项:

bool contains = listManager.contains(5);  // 检查是否包含5

获取列表

使用 list 属性获取当前的列表:

List<int> currentList = listManager.list;

4. 使用 ListManagerListView 结合

你可以将 ListManagerListView 结合使用,动态地更新列表视图。

class MyListWidget extends StatefulWidget {
  [@override](/user/override)
  _MyListWidgetState createState() => _MyListWidgetState();
}

class _MyListWidgetState extends State<MyListWidget> {
  ListManager<int> listManager = ListManager([1, 2, 3]);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Column(
      children: [
        Expanded(
          child: ListView.builder(
            itemCount: listManager.list.length,
            itemBuilder: (context, index) {
              return ListTile(
                title: Text('Item ${listManager.list[index]}'),
              );
            },
          ),
        ),
        ElevatedButton(
          onPressed: () {
            setState(() {
              listManager.add(listManager.list.length + 1);
            });
          },
          child: Text('Add Item'),
        ),
      ],
    );
  }
}

5. 其他功能

ListManager 还提供了其他一些有用的功能,例如:

  • clear(): 清空列表。
  • insert(index, item): 在指定位置插入项。
  • removeAt(index): 删除指定位置的项。

6. 注意事项

  • ListManager 是一个通用的类,可以用于管理任何类型的列表。
  • 在使用 ListManager 时,记得在 setState 中更新状态,以便 Flutter 能够重新构建 UI。

7. 示例代码

以下是一个完整的示例代码,展示了如何使用 ListManager 管理列表并与 ListView 结合使用:

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MyListWidget(),
    );
  }
}

class MyListWidget extends StatefulWidget {
  [@override](/user/override)
  _MyListWidgetState createState() => _MyListWidgetState();
}

class _MyListWidgetState extends State<MyListWidget> {
  ListManager<int> listManager = ListManager([1, 2, 3]);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('ListManager Example'),
      ),
      body: Column(
        children: [
          Expanded(
            child: ListView.builder(
              itemCount: listManager.list.length,
              itemBuilder: (context, index) {
                return ListTile(
                  title: Text('Item ${listManager.list[index]}'),
                );
              },
            ),
          ),
          ElevatedButton(
            onPressed: () {
              setState(() {
                listManager.add(listManager.list.length + 1);
              });
            },
            child: Text('Add Item'),
          ),
        ],
      ),
    );
  }
}
回到顶部