Flutter字母列表滚动视图插件alphabet_list_scroll_view的使用

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

Flutter字母列表滚动视图插件alphabet_list_scroll_view的使用

Alphabet List Scroll View 是一个可自定义的列表视图,带有A-Z侧边栏滚动条,可以快速跳转到选定字符的项目。通过拖动字母来快速滚动浏览列表。

API

名称 类型 默认值 描述
strList List - 字符串列表
itemBuilder itemBuilder(context, index) - 与ListView.builder中的itemBuilder相似
highlightTextStyle TextStyle false 高亮显示聚焦的字母框
normalTextStyle Color Colors.black 设置聚焦的字母框的颜色
showPreview bool true 在屏幕上显示预览
keyboardUsage bool true 字母列表将被包装在滚动视图中
indexedHeight double Function(int) 查询具有索引的小部件的高度
headerWidgetList List headers 头部小部件列表

AlphabetScrollListHeader

名称 类型 默认值 描述
widgetList List [] 小部件列表
icon Icon 在侧边字母列表和预览中显示的图标
indexedHeaderHeight double Function(int) 查询具有索引的头部高度

示例图片

示例图片 示例GIF

完整示例代码

import 'package:alphabet_list_scroll_view/alphabet_list_scroll_view.dart';
import 'package:flutter/material.dart';
import 'package:flutter_slidable/flutter_slidable.dart';

void main() => runApp(MainApp());

// 随机生成名字
String getRandomName() {
  final List<String> preFix = ['Aa', 'bo', 'Ce', 'Do', 'Ha', 'Tu', 'Zu'];
  final List<String> surFix = ['sad', 'bad', 'lad', 'nad', 'kat', 'pat', 'my'];
  preFix.shuffle();
  surFix.shuffle();
  return '${preFix.first}${surFix.first}';
}

class User {
  final String name;
  final String company;
  final bool favourite;

  User(this.name, this.company, this.favourite);
}

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

class _MainAppState extends State<MainApp> {
  List<User> userList = [];
  List<String> strList = [];
  List<Widget> favouriteList = [];
  List<Widget> normalList = [];
  TextEditingController searchController = TextEditingController();

  [@override](/user/override)
  void initState() {
    // 初始化用户列表
    for (var i = 0; i < 26; i++) {
      userList.add(User(getRandomName(), getRandomName(), false));
    }
    for (var i = 0; i < 4; i++) {
      userList.add(User(getRandomName(), getRandomName(), true));
    }
    // 按名字排序
    userList.sort((a, b) => a.name.toLowerCase().compareTo(b.name.toLowerCase()));
    filterList();
    searchController.addListener(() {
      filterList();
    });
    super.initState();
  }

  // 过滤列表
  filterList() {
    List<User> users = [];
    users.addAll(userList);
    favouriteList = [];
    normalList = [];
    strList = [];
    if (searchController.text.isNotEmpty) {
      users.retainWhere((user) => user.name.toLowerCase().contains(searchController.text.toLowerCase()));
    }
    users.forEach((user) {
      if (user.favourite) {
        favouriteList.add(
          Slidable(
            actionPane: SlidableDrawerActionPane(),
            actionExtentRatio: 0.25,
            secondaryActions: <Widget>[
              IconSlideAction(
                iconWidget: Icon(Icons.star),
                onTap: () {},
              ),
              IconSlideAction(
                iconWidget: Icon(Icons.more_horiz),
                onTap: () {},
              ),
            ],
            child: ListTile(
              leading: Stack(
                children: <Widget>[
                  CircleAvatar(
                    backgroundImage: NetworkImage("https://placeimg.com/200/200/people"),
                  ),
                  Container(
                      height: 40,
                      width: 40,
                      child: Center(
                        child: Icon(
                          Icons.star,
                          color: Colors.yellow[100],
                        ),
                      ))
                ],
              ),
              title: Text(user.name),
              subtitle: Text(user.company),
            ),
          ),
        );
      } else {
        normalList.add(
          Slidable(
            actionPane: SlidableDrawerActionPane(),
            actionExtentRatio: 0.25,
            secondaryActions: <Widget>[
              IconSlideAction(
                iconWidget: Icon(Icons.star),
                onTap: () {},
              ),
              IconSlideAction(
                iconWidget: Icon(Icons.more_horiz),
                onTap: () {},
              ),
            ],
            child: ListTile(
              leading: CircleAvatar(
                backgroundImage: NetworkImage("https://placeimg.com/200/200/people"),
              ),
              title: Text(user.name),
              subtitle: Text(user.company),
            ),
          ),
        );
        strList.add(user.name);
      }
    });

    setState(() {});
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
        home: Scaffold(
      appBar: AppBar(
        title: const Text('Plugin example app'),
      ),
      body: AlphabetListScrollView(
        strList: strList, // 字符串列表
        highlightTextStyle: TextStyle( // 高亮文本样式
          color: Colors.yellow,
        ),
        showPreview: true, // 显示预览
        itemBuilder: (context, index) {
          return normalList[index]; // 构建每个列表项
        },
        indexedHeight: (i) {
          return 80; // 每个列表项的高度
        },
        keyboardUsage: true, // 是否启用键盘操作
        headerWidgetList: <AlphabetScrollListHeader>[
          AlphabetScrollListHeader(widgetList: [
            Padding(
              padding: const EdgeInsets.all(16.0),
              child: TextFormField(
                controller: searchController, // 搜索控制器
                decoration: InputDecoration(
                  border: OutlineInputBorder(),
                  suffix: Icon(
                    Icons.search,
                    color: Colors.grey,
                  ),
                  labelText: "Search",
                ),
              ),
            )
          ], icon: Icon(Icons.search), indexedHeaderHeight: (index) => 80),
          AlphabetScrollListHeader(
              widgetList: favouriteList, // 收藏列表
              icon: Icon(Icons.star),
              indexedHeaderHeight: (index) {
                return 80; // 收藏列表项的高度
              }),
        ],
      ),
    ));
  }
}

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

1 回复

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


当然,以下是一个关于如何使用 alphabet_list_scroll_view 插件的 Flutter 代码示例。这个插件通常用于创建一个字母列表滚动视图,常用于联系人列表等场景。

首先,确保你已经在 pubspec.yaml 文件中添加了 alphabet_list_scroll_view 依赖:

dependencies:
  flutter:
    sdk: flutter
  alphabet_list_scroll_view: ^最新版本号  # 请替换为最新版本号

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

接下来是一个简单的示例代码,展示了如何使用 alphabet_list_scroll_view

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

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

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

class AlphabetListViewDemo extends StatefulWidget {
  @override
  _AlphabetListViewDemoState createState() => _AlphabetListViewDemoState();
}

class _AlphabetListViewDemoState extends State<AlphabetListViewDemo> {
  final List<String> contacts = List<String>.generate(
    26,
    (index) => 'Contact ${String.fromCharCode(65 + index)}',
  );

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Alphabet List Scroll View Demo'),
      ),
      body: AlphabetListScrollView(
        // 数据源
        items: contacts,
        // 获取每个项目的首字母
        getSectionIdentifier: (String item) => item[0].toUpperCase(),
        // 构建每个项目的 Widget
        itemBuilder: (BuildContext context, String item) {
          return ListTile(
            title: Text(item),
          );
        },
        // 构建每个字母索引的 Widget
        sectionHeaderBuilder: (BuildContext context, String section) {
          return Padding(
            padding: const EdgeInsets.all(8.0),
            child: Text(
              section,
              style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
            ),
          );
        },
      ),
    );
  }
}

代码解释:

  1. 依赖导入

    import 'package:alphabet_list_scroll_view/alphabet_list_scroll_view.dart';
    
  2. 数据准备

    final List<String> contacts = List<String>.generate(
      26,
      (index) => 'Contact ${String.fromCharCode(65 + index)}',
    );
    

    这里我们生成了一个包含26个联系人的列表,每个联系人的名字以字母A到Z开头。

  3. AlphabetListScrollView的使用

    AlphabetListScrollView(
      items: contacts,
      getSectionIdentifier: (String item) => item[0].toUpperCase(),
      itemBuilder: (BuildContext context, String item) {
        return ListTile(
          title: Text(item),
        );
      },
      sectionHeaderBuilder: (BuildContext context, String section) {
        return Padding(
          padding: const EdgeInsets.all(8.0),
          child: Text(
            section,
            style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
          ),
        );
      },
    )
    
    • items:数据源列表。
    • getSectionIdentifier:一个函数,用于获取每个项目的首字母作为索引。
    • itemBuilder:一个函数,用于构建每个项目的Widget。
    • sectionHeaderBuilder:一个函数,用于构建每个字母索引的Widget。

这个示例展示了如何创建一个简单的字母列表滚动视图,其中每个字母作为索引,每个索引下有一个或多个联系人。你可以根据实际需求进一步自定义和扩展这个示例。

回到顶部