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

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

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

cupertino_listview 是一个用于在Flutter中显示垂直列表(分组项的集合)并遵循iOS UX设计的库。它等同于iOS中的UITableView,但仅支持简单的分组。

主要组件

该库包含一个名为 CupertinoListView 的小部件,其用法类似于 [ListView] 小部件。您有两种构建方式:

  • 动态构建:使用 CupertinoListView.builder
  • 静态子组件:使用 CupertinoListView 构造函数

示例代码

动态构建示例

CupertinoListView.builder(
  sectionCount: _data.length,
  itemInSectionCount: (section) => _data[section].items.length,
  sectionBuilder: (context, sectionPath, _) => Text(_data[sectionPath.section].name),
  childBuilder: (context, indexPath) => Text(_data[indexPath.section].items[indexPath.child]),
  separatorBuilder: (context, indexPath) => Divider(indent: 20.0),
  controller: _scrollController,
);

静态子组件示例

CupertinoListView(
  children: _data.fold([], (list, section) {
    return [
      Text(_data[section].name),
      ..._data[section].items.map((item) => Text(item)).toList(),
    ];
  }),
  padding: const EdgeInsets.all(4.0),
);

完整示例Demo

import 'package:cupertino_listview/cupertino_listview.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter CupertinoListView Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(title: 'Flutter CupertinoListView Demo'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key? key, required this.title}) : super(key: key);

  final String title;

  @override
  State createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final _data = Section.allData(); // 假设有一个Section类和allData方法来获取数据
  late final ScrollController _scrollController;

  @override
  void initState() {
    super.initState();
    _scrollController = ScrollController();
  }

  @override
  void dispose() {
    _scrollController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text(widget.title)),
      body: CupertinoListView.builder(
        sectionCount: _data.length,
        itemInSectionCount: (section) => _data[section].itemCount,
        sectionBuilder: _buildSection,
        childBuilder: _buildItem,
        separatorBuilder: _buildSeparator,
        controller: _scrollController,
      ),
    );
  }

  Widget _buildSeparator(BuildContext context, IndexPath index) {
    return Divider(indent: 20.0, endIndent: 20.0);
  }

  Widget _buildSection(BuildContext context, SectionPath index, bool isFloating) {
    final style = Theme.of(context).textTheme.headlineMedium;
    return Container(
      height: 80.0,
      alignment: Alignment.centerLeft,
      padding: EdgeInsets.only(left: 20.0),
      color: Theme.of(context).primaryColorDark,
      child: Text(_data[index.section].name,
          style: style!.copyWith(color: Colors.white)),
    );
  }

  Widget _buildItem(BuildContext context, IndexPath index) {
    final attribute = _data[index.section][index.child];
    return Container(
      padding: const EdgeInsets.all(20.0),
      constraints: BoxConstraints(minHeight: 50.0),
      child: Row(
        crossAxisAlignment: CrossAxisAlignment.center,
        children: [
          SizedBox(child: Text(attribute.console), width: 120.0),
          Expanded(child: Text(attribute.attribute)),
        ],
      ),
    );
  }
}

属性说明

以下是 CupertinoListView 的主要属性及其描述:

参数 描述 默认值
children 分组列表。每个分组以标题作为第一个元素,后面跟着分组的项。分组可以为空。 -
floatingSectionBuilder 创建浮动分组的小部件,区分列表和浮动分组。 -
sectionCount 分组数量。 -
itemInSectionCount 获取分组中的项数。 -
sectionBuilder 构建分组标题。 -
childBuilder 构建分组中的项。 -
separatorBuilder 构建分组项之间的分隔符。 -
controller 控制滚动位置。 -
cacheExtent 缓存元素以加快和更流畅地显示列表。 -
clipBehavior 同 [ListView].clipBehavior: “裁剪小部件内容的方式”。 Clip.hardEdge
dragStartBehavior 同 [ListView].dragStartBehavior: “确定拖动手势开始行为的方式”。 DragStartBehavior.start
physics 同 [ListView].physics: “滚动视图对用户输入的响应方式”。 -
restorationId 同 [ListView].restorationId: 用于保存和恢复可滚动组件的滚动偏移量。 -
padding 子组件周围的内边距。 -
keyboardDismissBehavior 定义列表如何自动关闭键盘。 manual

通过这些属性和方法,您可以创建出符合iOS风格的列表视图,并根据需要进行定制。希望这个介绍能帮助您更好地理解和使用 cupertino_listview 插件!


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

1 回复

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


当然,下面是一个关于如何在Flutter中使用cupertino_listview插件来创建iOS风格列表视图的示例代码。需要注意的是,cupertino_listview 并不是一个广泛认知的官方或主流Flutter插件。Flutter自带的cupertino包中已经包含了iOS风格的组件,比如CupertinoScrollViewCupertinoSliverNavigationBar等,这些通常足够用来创建iOS风格的列表视图。

不过,为了展示一个iOS风格的列表视图,我们可以使用Flutter的CupertinoListTileCupertinoScrollView。以下是一个示例代码,展示了如何创建一个简单的iOS风格列表视图:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return CupertinoApp(
      title: 'Cupertino ListView Demo',
      home: CupertinoPageScaffold(
        child: SafeArea(
          child: CupertinoScrollView(
            child: Column(
              children: <Widget>[
                // CupertinoSliverNavigationBar can be used if you need a navigation bar
                // CupertinoSliverNavigationBar(
                //   largeTitle: Text('List Title'),
                // ),
                
                // List of CupertinoListTiles
                CupertinoListTile.withLeading(
                  leading: Icon(CupertinoIcons.home),
                  title: Text('Home'),
                  onTap: () {
                    // Handle tap on Home tile
                  },
                ),
                CupertinoListTile.withLeading(
                  leading: Icon(CupertinoIcons.search),
                  title: Text('Search'),
                  onTap: () {
                    // Handle tap on Search tile
                  },
                ),
                CupertinoListTile.withLeading(
                  leading: Icon(CupertinoIcons.add),
                  title: Text('Add'),
                  onTap: () {
                    // Handle tap on Add tile
                  },
                ),
                // Add more tiles as needed
              ],
            ),
          ),
        ),
      ),
    );
  }
}

代码解释

  1. CupertinoApp: 这是Flutter中用于创建iOS风格应用的顶级组件。
  2. CupertinoPageScaffold: 提供了一个iOS风格的页面结构,包括导航栏和安全区域(SafeArea)。
  3. CupertinoScrollView: 提供了滚动视图的功能,类似于iOS中的UIScrollView
  4. CupertinoListTile: 这是Flutter中用于创建iOS风格列表项的组件。CupertinoListTile.withLeading方法允许我们在列表项前添加图标。

注意事项

  • 如果你需要导航栏,可以使用CupertinoSliverNavigationBar。在上面的代码中,它被注释掉了,但你可以根据需要取消注释并进行配置。
  • CupertinoIcons提供了iOS风格的图标集,你可以根据需要选择使用。
  • CupertinoListTile还有许多其他方法,比如CupertinoListTile.withTrailing,允许你在列表项后添加内容。

通过上述代码,你应该能够创建一个基本的iOS风格列表视图。如果需要更复杂的功能,可以查阅Flutter的官方文档或相关插件的文档。

回到顶部