是否有与 Bootstrap Scrollspy 等效的 Flutter?

Posted

技术标签:

【中文标题】是否有与 Bootstrap Scrollspy 等效的 Flutter?【英文标题】:Is there a Flutter equivalent to Bootstrap Scrollspy? 【发布时间】:2021-05-30 12:32:35 【问题描述】:

我在找一个和Bootstrap的Scrollspy相当的flutter包:

https://getbootstrap.com/docs/4.0/components/scrollspy/

预期的功能是有一个垂直可滚动的项目列表,上面有一个粘性的水平可滚动“标题/导航栏菜单”。当用户滚动垂直列表并到达一个新的“部分”时,这会通过突出显示导航栏中的“部分名称”并在必要时滚动到它来反映在水平导航栏中。当用户按下水平导航栏中的部分名称时,它应该滚动到垂直列表中该部分的开头。

例如:

Section1 !!!Section2!!! Section3 Section4 ——————————————————————— (Section1 不可见)

!!!Section2!!!

Item3

Item4

第 3 节

Item1

Item2

第 4 节

Item5

Item6

【问题讨论】:

【参考方案1】:

我认为您可以使用 Google Fuchsia Authors 制作的 scrollable_positioned_list package 来实现这一点。

ScrollablePositionedList 提供了一个ItemPositionsListener

_itemPositionsListener.itemPositions.addListener(() 
  final positions = _itemPositionsListener.itemPositions.value;
  setState(() 
    _topItem = positions.isNotEmpty ? positions.first.index : null;
  );
);

完整源代码

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

void main() 
  runApp(
    MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'Flutter Demo',
      home: HomePage(),
    ),
  );


class HomePage extends StatefulWidget 
  @override
  _HomePageState createState() => _HomePageState();


class _HomePageState extends State<HomePage> 
  final _nbItems = 6;
  final _itemHeight = 200.0;
  final _itemPositionsListener = ItemPositionsListener.create();

  int _topItem = 0;

  @override
  void initState() 
    super.initState();
    _itemPositionsListener.itemPositions.addListener(() 
      final positions = _itemPositionsListener.itemPositions.value;
      setState(() 
        _topItem = positions.isNotEmpty ? positions.first.index : null;
      );
    );
  

  @override
  Widget build(BuildContext context) 
    return Scaffold(
      body: Column(
        children: [
          Row(
            mainAxisAlignment: MainAxisAlignment.end,
            children: List.generate(
              _nbItems,
              (index) => Padding(
                padding: const EdgeInsets.all(8.0),
                child: Container(
                  padding: EdgeInsets.all(4.0),
                  decoration: _topItem == index
                      ? BoxDecoration(
                          color: Colors.black26,
                          border: Border.all(color: Colors.black54),
                        )
                      : BoxDecoration(),
                  child: Text(
                    'S$index',
                    style: TextStyle(
                      fontWeight: _topItem == index
                          ? FontWeight.bold
                          : FontWeight.normal,
                    ),
                  ),
                ),
              ),
            ),
          ),
          Expanded(
            child: ScrollablePositionedList.builder(
              itemCount: _nbItems,
              itemBuilder: (context, index) => SizedBox(
                height: _itemHeight,
                child: Card(
                  child: Text('Item $index'),
                ),
              ),
              itemPositionsListener: _itemPositionsListener,
            ),
          ),
        ],
      ),
    );
  

【讨论】:

以上是关于是否有与 Bootstrap Scrollspy 等效的 Flutter?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Bootstrap、Scrollspy 和 Collapse 嵌套、折叠侧边栏导航?

html Bootstrap ScrollSpy

html Bootstrap ScrollSpy示例

JavaScript Bootstrap ScrollSpy替代动画

html Bootstrap ScrollSpy的中文ID目标错误

如何使用 scrollspy 制作 Twitter Bootstrap 2.x 导航栏