Flutter自由滚动列表插件free_scroll_listview的使用

Flutter自由滚动列表插件free_scroll_listview的使用

在Flutter中,free_scroll_listview 是一个非常实用的插件,用于创建自由滚动的列表。该插件允许你在列表顶部或底部添加数据,并且可以自由地滚动到任何指定的索引位置。

使用步骤

  1. 安装插件 首先,在你的 pubspec.yaml 文件中添加 free_scroll_listview 依赖:

    dependencies:
      free_scroll_listview: ^1.0.0
    
  2. 初始化控制器 创建一个 FreeScrollListViewController 实例来控制列表的行为。

    final FreeScrollListViewController _controller = FreeScrollListViewController();
    
  3. 创建列表视图 使用 FreeScrollListView 组件创建列表视图,并配置头部和尾部视图。

    FreeScrollListView(
      controller: _controller,
      headerView: Container(
        height: 60,
        color: Colors.redAccent,
      ),
      footerView: Container(
        height: 60,
        color: Colors.blue,
      ),
      reverse: false,
    
      /*willReachTail: () {
        return _checkAddTail();
      },
      willReachHead: () {
        return _checkAddHead();
      },*/
      builder: (context, index) {
        return Container(
          height: 75,
          decoration: BoxDecoration(
            border: Border(
              bottom: BorderSide(
                color: Colors.black.withAlpha(20),
                width: 0.5,
              ),
            ),
          ),
          alignment: Alignment.center,
          child: Text(
            _controller.dataList[index],
          ),
        );
      },
    )
    
  4. 添加数据 可以通过调用 _controller.addDataToTail_controller.addDataToHead 方法分别向列表尾部和头部添加数据。

    Future _checkAddTail() {
      int last = int.tryParse(_controller.dataList.last) ?? 0;
      List<String> dataList = [];
      for (int s = 0; s < 100; s++) {
        dataList.add((s + last + 1).toString());
      }
      return _controller.addDataToTail(dataList);
    }
    
    Future _checkAddHead() {
      int first = int.tryParse(_controller.dataList.first) ?? 0;
      List<String> dataList = [];
      for (int s = 0; s < 100; s++) {
        dataList.add((first - s - 1).toString());
      }
      return _controller.addDataToHead(dataList.reversed.toList());
    }
    
  5. 滚动到指定索引 使用 _controller.scrollToIndex 方法滚动到列表中的指定索引位置。

    _controller.scrollToIndex(
      80,
    );
    

完整示例代码

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

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(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key});

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

class _MyHomePageState extends State<MyHomePage> {
  ///controller
  final FreeScrollListViewController _controller = FreeScrollListViewController();

  [@override](/user/override)
  void initState() {
    List<String> dataList = [];
    for (int s = 0; s < 100; s++) {
      dataList.add((s).toString());
    }
    _controller.dataList = dataList;
    super.initState();
  }

  ///add data to tail
  Future _checkAddTail() {
    int last = int.tryParse(_controller.dataList.last) ?? 0;
    List<String> dataList = [];
    for (int s = 0; s < 100; s++) {
      dataList.add((s + last + 1).toString());
    }
    return _controller.addDataToTail(dataList);
  }

  ///add data to head
  Future _checkAddHead() {
    int first = int.tryParse(_controller.dataList.first) ?? 0;
    List<String> dataList = [];
    for (int s = 0; s < 100; s++) {
      dataList.add((first - s - 1).toString());
    }
    return _controller.addDataToHead(dataList.reversed.toList());
  }

  ///reset data and scroll align
  Future _resetDataAndScrollAlign() {
    List<String> dataList = [];
    for (int s = 0; s < 100; s++) {
      dataList.add(s.toString());
    }
    return _controller.setDataAndScrollTo(
      dataList.toList(),
      index: 94,
      align: FreeScrollAlign.directJumpTo,
    );
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
        children: [
          Container(
            color: Colors.grey,
            child: GestureDetector(
              behavior: HitTestBehavior.translucent,
              onTap: () {
                _controller.scrollToIndex(
                  0,
                );
                //_resetDataAndScrollAlign();
              },
              child: Container(
                width: double.infinity,
                height: 35,
                margin: EdgeInsets.fromLTRB(
                    20, 20 + MediaQuery.of(context).padding.top, 20, 20),
                decoration: BoxDecoration(
                  color: Colors.blue,
                  borderRadius: BorderRadius.circular(17.5),
                ),
              ),
            ),
          ),
          Container(
            color: Colors.grey,
            child: GestureDetector(
              behavior: HitTestBehavior.translucent,
              onTap: () {
                _controller.scrollToIndex(
                  99,
                );
              },
              child: Container(
                width: double.infinity,
                height: 35,
                margin: const EdgeInsets.fromLTRB(20, 0, 20, 20),
                decoration: BoxDecoration(
                  color: Colors.blue,
                  borderRadius: BorderRadius.circular(17.5),
                ),
              ),
            ),
          ),
          Expanded(
            child: FreeScrollListView(
              controller: _controller,
              headerView: Container(
                height: 60,
                color: Colors.redAccent,
              ),
              footerView: Container(
                height: 60,
                color: Colors.blue,
              ),
              reverse: false,
              onIndexChange: (int index) {
                print("A" + index.toString());
              },
              onItemShow: (List<int> dataList) {
                print(dataList);
              },
              /*willReachTail: () {
                return _checkAddTail();
              },
              willReachHead: () {
                return _checkAddHead();
              },*/
              builder: (context, index) {
                return Container(
                  height: 75,
                  decoration: BoxDecoration(
                    border: Border(
                      bottom: BorderSide(
                        color: Colors.black.withAlpha(20),
                        width: 0.5,
                      ),
                    ),
                  ),
                  alignment: Alignment.center,
                  child: Text(
                    _controller.dataList[index],
                  ),
                );
              },
            ),
          ),
        ],
      ),
    );
  }
}

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

1 回复

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


当然,下面是一个关于如何使用Flutter中的free_scroll_listview插件的示例代码。这个插件允许你创建一个可以自由滚动的列表视图,这在一些特定场景下非常有用,比如需要实现类似阅读器翻页效果的界面。

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

dependencies:
  flutter:
    sdk: flutter
  free_scroll_listview: ^最新版本号  # 请替换为实际可用的最新版本号

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

接下来,你可以在你的Flutter项目中这样使用FreeScrollListView

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

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

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

class FreeScrollListDemo extends StatefulWidget {
  @override
  _FreeScrollListDemoState createState() => _FreeScrollListDemoState();
}

class _FreeScrollListDemoState extends State<FreeScrollListDemo> {
  final List<String> items = List.generate(100, (index) => "Item $index");

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Free Scroll ListView Demo'),
      ),
      body: FreeScrollListView(
        itemCount: items.length,
        itemBuilder: (BuildContext context, int index) {
          return Container(
            height: 200.0,  // 每个item的高度
            color: index % 2 == 0 ? Colors.blueGrey[100] : Colors.blueGrey[300],
            alignment: Alignment.center,
            child: Text(
              items[index],
              style: TextStyle(fontSize: 24.0),
            ),
          );
        },
        // 可选参数,设置物理滚动行为
        scrollPhysics: BouncingScrollPhysics(),
        // 可选参数,设置滚动方向
        scrollDirection: Axis.vertical,
        // 可选参数,是否允许拖动手势触发滚动
        dragStartBehavior: DragStartBehavior.start,
      ),
    );
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,其中包含一个FreeScrollListView。这个列表视图包含100个项,每个项都是一个带有文本和背景色的容器。你可以根据需要调整每个项的高度、颜色和其他属性。

参数说明

  • itemCount:列表中的项数。
  • itemBuilder:一个函数,用于构建列表中的每一项。它接收上下文和当前项的索引,并返回一个Widget。
  • scrollPhysics:控制滚动的物理行为。这里我们使用了BouncingScrollPhysics,它允许滚动到边界时有弹跳效果。
  • scrollDirection:滚动的方向,可以是Axis.vertical(垂直)或Axis.horizontal(水平)。
  • dragStartBehavior:控制拖动手势何时开始。这里我们使用了DragStartBehavior.start,表示在拖动开始时立即响应。

你可以根据具体需求调整这些参数,以实现所需的滚动效果。

回到顶部