Flutter字母索引列表视图插件alphabet_index_listview的使用

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

Flutter字母索引列表视图插件alphabet_index_listview的使用

alphabet_index_listview 是一个Flutter插件,用于创建带有字母索引的列表视图。它可以帮助用户快速定位到特定的字母分组,适用于联系人列表、词典等场景。下面是一个完整的示例demo,展示了如何使用该插件。

1. 引入依赖

首先,在pubspec.yaml文件中添加alphabet_index_listview依赖:

dependencies:
  flutter:
    sdk: flutter
  alphabet_index_listview: ^最新版本号

2. 示例代码

import 'package:alphabet_index_listview/alphabet_index_listview.dart';
import 'package:flutter/material.dart';
import 'dart:math';

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(title: '字母索引列表'),
    );
  }
}

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

  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  // 定义数据列表
  List<String> dataList = List.from({
    "Alpha",
    "AlphaGo",
    "Beta",
    "Black",
    "Crease",
    "Claim",
    "Hello",
    "Hallo",
    "Hero",
    "Words",
    "Work",
    "Woman",
    "Foot",
    "Head",
    "Face",
    "Hair",
    "Nose",
    "Mouth",
    "Eye",
    "Arm",
    "Hand",
    "Finger",
    "Leg",
  });

  // 生成的字母索引分组列表
  List<AlphabetIndexGroup<String>>? generatedList;

  // 生成随机字符串列表
  List<String> generateRandomString() {
    var words = 'abcdefghijklmnopqrstuvwxyz'.split('');
    var rng = Random();
    return List<String>.generate(1000, (index) {
      int length = rng.nextInt(10) + 1; // 随机生成单词长度
      return List<String>.generate(
          length, (index) => words[rng.nextInt(words.length)]).join();
    });
  }

  [@override](/user/override)
  void initState() {
    // 初始化时分析数据并生成字母索引分组
    generatedList = AlphabetIndexTool.analyzeData(dataList, (data) => data);

    super.initState();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: GestureDetector(
          behavior: HitTestBehavior.translucent,
          onTap: () {
            // 点击标题时生成新的随机数据并更新列表
            List<String> newDataList = generateRandomString();
            generatedList = AlphabetIndexTool.analyzeData(newDataList, (data) => data);
            setState(() {});
          },
          child: Text(widget.title),
        ),
      ),
      body: Center(
        child: AlphabetIndexSliverView(
          // 固定头部
          stickHeader: true,
          // 数据源
          dataList: generatedList!,
          // 分组选择回调
          onGroupSelected: (int index) {
            if (kDebugMode) {
              print("Group$index");
            }
          },
          // 侧边栏对齐方式
          sideBarAlign: AlphabetIndexSideAlign.right,
          // 侧边栏样式
          sideBarBuilder: (tag, flag) {
            return Padding(
              padding: const EdgeInsets.fromLTRB(15, 2, 15, 2),
              child: Text(
                tag,
                style: const TextStyle(
                  fontSize: 13,
                  fontWeight: FontWeight.w500,
                  color: Colors.black87,
                ),
              ),
            );
          },
          // 提示框样式
          tipsBuilder: (int index, String tag) {
            return Container(
              decoration: BoxDecoration(
                color: Colors.yellow.withAlpha(50),
                borderRadius: BorderRadius.circular(16),
              ),
              width: 65,
              height: 65,
              alignment: Alignment.center,
              child: Text(
                tag,
                style: const TextStyle(
                  fontSize: 25,
                  fontWeight: FontWeight.w500,
                  color: Colors.black54,
                ),
              ),
            );
          },
          // 分组头样式
          groupBuilder: (int groupIndex, String tag) {
            return Container(
              color: Colors.grey,
              height: 30,
              alignment: Alignment.centerLeft,
              padding: const EdgeInsets.fromLTRB(15, 0, 15, 0),
              child: Text(tag),
            );
          },
          // 列表项样式
          childBuilder: (int groupIndex, int childIndex, String data) {
            return Container(
              decoration: const BoxDecoration(
                color: Colors.white70,
                border: Border(
                  bottom: BorderSide(color: Colors.black54, width: 0.5),
                ),
              ),
              height: 80,
              alignment: Alignment.centerLeft,
              padding: const EdgeInsets.fromLTRB(15, 0, 15, 0),
              child: Text(data),
            );
          },
          // 内边距
          padding: const EdgeInsets.fromLTRB(0, 100, 0, 100),
        ),
      ),
    );
  }
}

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

1 回复

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


当然,下面是一个关于如何使用Flutter中的alphabet_index_listview插件来创建字母索引列表视图的示例代码。这个插件允许你创建一个带有侧边栏索引的列表视图,用户可以通过点击索引快速跳转到列表中的相应部分。

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

dependencies:
  flutter:
    sdk: flutter
  alphabet_index_listview: ^x.y.z  # 请替换为最新版本号

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

接下来是一个完整的示例代码,展示如何使用alphabet_index_listview插件:

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

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

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

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final List<String> _data = List.generate(
    26,
    (index) => 'Item starting with letter ${String.fromCharCode(65 + index)}',
  );

  final Map<String, List<String>> _indexedData = _createIndexedData(_data);

  Map<String, List<String>> _createIndexedData(List<String> data) {
    final Map<String, List<String>> indexedData = {};
    for (final String item in data) {
      final String index = item[0].toUpperCase();
      if (!indexedData.containsKey(index)) {
        indexedData[index] = [];
      }
      indexedData[index]!.add(item);
    }
    // Sort keys alphabetically
    indexedData.keys.sort();
    return indexedData;
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Alphabet Index ListView Demo'),
      ),
      body: AlphabetIndexListView(
        data: _indexedData,
        itemCount: _data.length,
        itemBuilder: (context, index) {
          return ListTile(
            title: Text(_data[index]),
          );
        },
        indexBarData: _indexedData.keys.toList(),
        indexBarBuilder: (context, index, isSelected) {
          final String letter = _indexedData.keys.toList()[index];
          return Container(
            alignment: Alignment.center,
            child: Text(
              letter,
              style: TextStyle(
                color: isSelected ? Colors.blue : Colors.grey,
                fontSize: 16,
              ),
            ),
          );
        },
        onIndexChanged: (index) {
          // Scroll to the start of the selected index section
          final ScrollController controller = AlphabetIndexListView.of(context)!.scrollController;
          final List<String> itemsForSection = _indexedData[_indexedData.keys.toList()[index]]!;
          final int firstItemInSectionIndex = _data.indexOf(itemsForSection.first);
          controller.animateTo(
            firstItemInSectionIndex * 56.0, // Adjust based on your item height
            duration: Duration(milliseconds: 300),
            curve: Curves.easeInOut,
          );
        },
      ),
    );
  }
}

代码说明:

  1. 数据准备

    • _data列表包含了一些示例数据,每个项目以不同的字母开头。
    • _createIndexedData函数将原始数据按首字母索引分组,并返回一个映射。
  2. AlphabetIndexListView

    • data:传递给插件的索引数据。
    • itemCount:列表中项目的总数。
    • itemBuilder:构建每个列表项的回调。
    • indexBarData:索引栏中显示的字母列表。
    • indexBarBuilder:构建索引栏中每个字母的回调。
    • onIndexChanged:当索引改变时的回调,用于滚动到相应的部分。
  3. 滚动到指定部分

    • 使用AlphabetIndexListView.of(context)!.scrollController获取ScrollController
    • 计算要滚动到的第一个项目的索引位置,并调用animateTo方法滚动到该位置。

这个示例展示了如何使用alphabet_index_listview插件创建一个带有字母索引列表视图的应用。你可以根据需要调整数据和样式。

回到顶部