Flutter列表展示插件gslist的使用

Flutter列表展示插件gslist的使用

特性

GSList 是一个功能强大的 Flutter 插件,用于高效地展示列表数据。它支持分页加载、占位符(shimmer)效果、空列表提示以及加载状态提示等功能。


开始使用

添加依赖

pubspec.yaml 文件中添加 GSList 的依赖:

dependencies:
  gslist: ^版本号

然后运行以下命令以更新依赖:

flutter pub get

使用示例

以下是完整的示例代码,展示如何使用 GSList 插件来实现一个带有分页加载和占位符效果的列表页面。

示例代码

import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:gslist/gs_list/gs_list.dart';
import 'package:gslist/gs_list/models/shimmer_model.dart';

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'GSList 示例',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  final MainViewModel viewModel = Get.put(MainViewModel());

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('GSList 示例'),
      ),
      body: GSList<ApiResponse>(
        controller: viewModel.controller,
        onItemBuilder: (index) {
          return Item(
            model: viewModel.items[index],
          );
        },
        onLoadData: (int nextPage) {
          viewModel.getList(nextPage);
        },
        paginationEnable: true, // 启用分页
        itemCount: viewModel.items.length,
        enableShimmerLoading: true, // 启用占位符效果
        emptyWidget: const Text('列表为空'), // 空列表提示
        loadingWidget: const CircularProgressIndicator(), // 加载中提示
        shimmerProperties: ShimmerProperties(
          baseColor: Colors.grey[300]!,
          highlightColor: Colors.grey[100]!,
          child: ItemShimmer(),
        ),
      ),
    );
  }
}

class Item extends StatelessWidget {
  const Item({Key? key, required this.model}) : super(key: key);

  final ApiResponse model;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Container(
      height: 70,
      margin: const EdgeInsets.symmetric(vertical: 8, horizontal: 16),
      decoration: BoxDecoration(
        color: Colors.white,
        borderRadius: BorderRadius.circular(8),
      ),
      child: Padding(
        padding: const EdgeInsets.all(8.0),
        child: Row(
          children: [
            const Icon(
              Icons.ac_unit,
              color: Colors.blue,
              size: 50,
            ),
            const SizedBox(width: 12),
            Expanded(
              child: Column(
                mainAxisAlignment: MainAxisAlignment.center,
                crossAxisAlignment: CrossAxisAlignment.start,
                children: [
                  Text(
                    model.title ?? '无标题',
                    style: const TextStyle(fontSize: 16, color: Colors.black54),
                  ),
                  const SizedBox(height: 4),
                  Text(
                    model.description ?? '无描述',
                    style: const TextStyle(fontSize: 14, color: Colors.grey),
                  ),
                ],
              ),
            ),
          ],
        ),
      ),
    );
  }
}

class ItemShimmer extends StatelessWidget {
  const ItemShimmer({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Padding(
      padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16),
      child: Container(
        height: 70,
        decoration: BoxDecoration(
          color: Colors.grey[300]!,
          borderRadius: BorderRadius.circular(8),
        ),
        child: Padding(
          padding: const EdgeInsets.all(8.0),
          child: Row(
            children: [
              Container(
                height: 50,
                width: 50,
                decoration: BoxDecoration(
                  color: Colors.grey[200]!,
                  borderRadius: BorderRadius.circular(8),
                ),
              ),
              const SizedBox(width: 12),
              Expanded(
                child: Column(
                  mainAxisAlignment: MainAxisAlignment.center,
                  crossAxisAlignment: CrossAxisAlignment.start,
                  children: [
                    Container(
                      height: 20,
                      width: double.infinity,
                      decoration: BoxDecoration(
                        color: Colors.grey[100]!,
                        borderRadius: BorderRadius.circular(8),
                      ),
                    ),
                    const SizedBox(height: 4),
                    Container(
                      height: 15,
                      width: double.infinity,
                      decoration: BoxDecoration(
                        color: Colors.grey[100]!,
                        borderRadius: BorderRadius.circular(8),
                      ),
                    ),
                  ],
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

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

1 回复

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


gslist 是一个用于 Flutter 的列表展示插件,它可以帮助你快速创建和管理列表视图。以下是如何使用 gslist 插件的基本步骤:

1. 添加依赖

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

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

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

2. 导入包

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

import 'package:gslist/gslist.dart';

3. 使用 GsList

GsList 是一个简单的列表视图组件,你可以通过传递数据来展示列表。

基本用法

class MyHomePage extends StatelessWidget {
  final List<String> items = [
    'Item 1',
    'Item 2',
    'Item 3',
    'Item 4',
    'Item 5',
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('GsList Example'),
      ),
      body: GsList(
        items: items,
        itemBuilder: (context, index) {
          return ListTile(
            title: Text(items[index]),
          );
        },
      ),
    );
  }
}

自定义列表项

你可以通过 itemBuilder 来自定义每个列表项的展示方式:

GsList(
  items: items,
  itemBuilder: (context, index) {
    return Card(
      child: Padding(
        padding: EdgeInsets.all(16.0),
        child: Text(
          items[index],
          style: TextStyle(fontSize: 18.0),
        ),
      ),
    );
  },
)

分页加载

GsList 还支持分页加载功能。你可以通过 onLoadMore 回调来实现分页加载:

GsList(
  items: items,
  itemBuilder: (context, index) {
    return ListTile(
      title: Text(items[index]),
    );
  },
  onLoadMore: () async {
    // 模拟加载更多数据
    await Future.delayed(Duration(seconds: 2));
    items.addAll([
      'Item 6',
      'Item 7',
      'Item 8',
    ]);
    return true; // 返回 true 表示加载成功,false 表示加载失败
  },
)
回到顶部