Flutter iOS风格表格视图插件cupertino_table_view的使用

发布于 1周前 作者 h691938207 来自 Flutter

Flutter iOS风格表格视图插件CupertinoTableView的使用

简介

CupertinoTableView 是一个用于在Flutter中实现iOS风格表格视图的插件。它提供了高度可自定义的功能,允许开发者通过Delegate的方式控制表格视图的显示、处理回调等。该插件还支持丰富的Delegate配置选项,如自定义单元格(cell)、表头(header)、表尾(footer)、分割线(separator),以及每个section的装饰(decoration)。此外,CupertinoTableView 还内置了上拉/下拉刷新功能,可以通过传递 RefreshConfig 进行自定义配置。

示例图片

example

完整示例代码

以下是一个完整的示例代码,展示了如何使用 CupertinoTableView 插件来创建一个iOS风格的表格视图,并实现上拉/下拉刷新功能。

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

void main() => runApp(const MyApp());

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Cupertino Table View Demo',
      theme: ThemeData(primarySwatch: Colors.blue),
      home: Scaffold(
        appBar: AppBar(title: const Text('CupertinoTableView')),
        body: CupertinoTableViewDemo(),
      ),
    );
  }
}

class CupertinoTableViewDemo extends StatefulWidget {
  const CupertinoTableViewDemo({Key? key}) : super(key: key);

  [@override](/user/override)
  State<StatefulWidget> createState() => _CupertinoTableViewDemoState();
}

class _CupertinoTableViewDemoState extends State<CupertinoTableViewDemo> {
  late CupertinoTableViewDelegate tableViewDelegate;
  late RefreshConfig refreshConfig;

  int numberOfSections = 5; // 初始section数量

  [@override](/user/override)
  void initState() {
    super.initState();
    tableViewDelegate = generateDelegate(); // 初始化Delegate
    refreshConfig = generateRefreshConfig(); // 初始化刷新配置
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return CupertinoTableView(
      delegate: tableViewDelegate, // 设置Delegate
      backgroundColor: Colors.black12, // 表格背景颜色
      padding: EdgeInsets.only(left: 15, right: 15), // 表格内边距
      refreshConfig: refreshConfig, // 设置刷新配置,如果不想使用刷新功能可以不传
    );
  }

  /// 创建Delegate控制tableView的显示和点击响应等
  CupertinoTableViewDelegate generateDelegate() {
    return CupertinoTableViewDelegate(
      numberOfSectionsInTableView: () => numberOfSections, // 返回section的数量
      numberOfRowsInSection: (section) => section.isOdd ? 1 : section, // 每个section的行数
      cellForRowAtIndexPath: (context, indexPath) => Container(
        height: 60, // 单元格高度
        color: Colors.white, // 单元格背景颜色
        child: Center(child: Text('Section ${indexPath.section}, Row ${indexPath.row}')), // 单元格内容
      ),
      headerInSection: (context, section) => Container(
        height: 30, // 表头高度
        width: double.infinity,
        alignment: Alignment.centerLeft,
        child: Text('This is section $section header'), // 表头内容
      ),
      footerInSection: (context, section) => Container(
        height: 30, // 表尾高度
        width: double.infinity,
        alignment: Alignment.centerLeft,
        child: Text('This is section $section footer'), // 表尾内容
      ),
      decorationForSection: (context, section) => BoxDecoration(
        borderRadius: BorderRadius.circular(12), // section的圆角
        // boxShadow: [
        //   BoxShadow(
        //     color: Colors.black38,
        //     blurRadius: 3,
        //     spreadRadius: 0.5,
        //     offset: Offset(3, 3),
        //   ),
        // ],
      ),
      pressedOpacity: 0.4, // 点击时的透明度
      canSelectRowAtIndexPath: (indexPath) => true, // 是否允许点击
      didSelectRowAtIndexPath: (indexPath) => print('Selected: $indexPath'), // 点击回调
      marginForSection: const EdgeInsets.only(left: 10, right: 10), // section的外边距
    );
  }

  /// 创建RefreshConfig控制tableView的下拉/上拉刷新和其回调
  RefreshConfig generateRefreshConfig() {
    return RefreshConfig(
      refreshHeaderBuilder: (context, status) {
        return DefaultRefreshIndicator(
          text: 'Header ${textFromStatus(status)}', // 下拉刷新文本
          icon: iconFromStatus(status), // 下拉刷新图标
        );
      },
      refreshFooterBuilder: (context, status) {
        return DefaultRefreshIndicator(
          text: 'Footer ${textFromStatus(status)}', // 上拉加载文本
          icon: iconFromStatus(status), // 上拉加载图标
        );
      },
      onRefreshHeaderStatusChange: (controller, status) {
        if (status == RefreshStatus.refreshing) {
          Future.delayed(Duration(seconds: 3), () {
            controller.refreshHeaderStatus = RefreshStatus.completed; // 完成下拉刷新
            setState(() {
              numberOfSections = 10; // 更新section数量
            });
          });
        }
      },
      onRefreshFooterStatusChange: (controller, status) {
        if (status == RefreshStatus.refreshing) {
          Future.delayed(Duration(seconds: 3), () {
            controller.refreshFooterStatus = RefreshStatus.completed; // 完成上拉加载
            setState(() {
              numberOfSections = 15; // 更新section数量
            });
          });
        }
      },
    );
  }

  /// 根据刷新状态返回相应的文本
  String textFromStatus(RefreshStatus status) {
    switch (status) {
      case RefreshStatus.idle:
        return 'Idle';
      case RefreshStatus.prepared:
        return 'Prepared';
      case RefreshStatus.refreshing:
        return 'Refreshing';
      case RefreshStatus.completed:
        return 'Completed';
    }
  }

  /// 根据刷新状态返回相应的图标
  Widget iconFromStatus(RefreshStatus status) {
    switch (status) {
      case RefreshStatus.idle:
        return const Icon(Icons.arrow_upward, color: Colors.grey);
      case RefreshStatus.prepared:
        return const Icon(Icons.arrow_downward, color: Colors.grey);
      case RefreshStatus.refreshing:
        return const SizedBox(
          width: 20,
          height: 20,
          child: CircularProgressIndicator(strokeWidth: 2.0),
        );
      case RefreshStatus.completed:
        return const Icon(Icons.done, color: Colors.grey);
    }
  }
}

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

1 回复

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


当然,以下是一个关于如何使用Flutter的cupertino_table_view插件来创建iOS风格表格视图的代码示例。需要注意的是,cupertino_table_view并不是Flutter官方包的一部分,而是一个社区提供的包。如果你没有安装这个包,首先需要添加它到你的pubspec.yaml文件中:

dependencies:
  flutter:
    sdk: flutter
  cupertino_table_view: ^x.y.z  # 请替换为实际的版本号

然后运行flutter pub get来安装这个包。

以下是一个简单的示例,展示如何使用cupertino_table_view来创建一个iOS风格的表格视图:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'CupertinoTableView Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: CupertinoTableViewDemo(),
    );
  }
}

class CupertinoTableViewDemo extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('CupertinoTableView Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: CupertinoTableView(
          sections: [
            CupertinoTableViewSection(
              header: Text('Section 1'),
              rows: [
                CupertinoTableViewRow(
                  child: Text('Row 1-1'),
                ),
                CupertinoTableViewRow(
                  child: Text('Row 1-2'),
                ),
              ],
            ),
            CupertinoTableViewSection(
              header: Text('Section 2'),
              rows: [
                CupertinoTableViewRow(
                  child: Text('Row 2-1'),
                ),
                CupertinoTableViewRow(
                  child: Text('Row 2-2'),
                ),
                CupertinoTableViewRow(
                  child: Text('Row 2-3'),
                ),
              ],
            ),
          ],
        ),
      ),
    );
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,其中包含一个使用CupertinoTableView的页面。CupertinoTableView接收一个sections列表,每个section代表表格中的一个部分,可以包含一个标题(header)和多个行(rows)。每行使用CupertinoTableViewRow来包装内容。

请注意,cupertino_table_view插件的具体API可能会随着版本的更新而发生变化,因此建议查阅最新的文档和示例代码以确保兼容性。如果插件的API与上述示例有所不同,请参考插件的官方文档进行调整。

回到顶部