【问题标题】:Flutter - ScrollController with CupertinoSliverNavigationBar, largeTitle to smallTitle not workingFlutter - 带有 CupertinoSliverNavigationBar 的 ScrollController,largeTitle 到 smallTitle 不起作用
【发布时间】:2021-06-16 03:13:27
【问题描述】:

当我在 ListView 中使用 ScrollController 时,它会阻止 CupertinoSliverNavigationBar largeTitle 转换为 smallTitle。但是,如果我删除滚动控制器,问题就会消失。我认为这可能是库比蒂诺图书馆中的一个错误

这段代码演示了这个问题:

 ScrollController scrollController = ScrollController();

  @override
  Widget build(BuildContext context) {
    return CupertinoPageScaffold(
      child: NestedScrollView(
        headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) {
          return <Widget>[
            CupertinoSliverNavigationBar(
              largeTitle: Text('Large Title'),
            ),
          ];
        },
        body: ListView.builder(
            controller: scrollController,
            itemCount: 50,
            itemBuilder: (BuildContext context, int index) {
              return Container(
                height: 50,
                child: Center(child: Text('Entry ${index}')),
              );
            }),
      ),
    );
  }

现在如果我删除滚动控制器,问题就消失了:

ScrollController scrollController = ScrollController();

  @override
  Widget build(BuildContext context) {
    return CupertinoPageScaffold(
      child: NestedScrollView(
        headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) {
          return <Widget>[
            CupertinoSliverNavigationBar(
              largeTitle: Text('Large Title'),
            ),
          ];
        },
        body: ListView.builder(
            //controller: scrollController,
            itemCount: 50,
            itemBuilder: (BuildContext context, int index) {
              return Container(
                height: 50,
                child: Center(child: Text('Entry ${index}')),
              );
            }),
      ),
    );
  }

【问题讨论】:

    标签: flutter flutter-cupertino


    【解决方案1】:

    这是一种预期行为,因为 NestedScrollView 旨在管理所有其他子滚动视图的滚动位置:

    NestedScrollView 类

    其中可以嵌套其他滚动视图的滚动视图, 它们的滚动位置具有内在联系。

    因此,您无法使用单个 ScrollController 控制其子视图的位置。但是,您可以提供一个供NestedScrollView 一次性管理。

    通知监听器

    除了使用ScrollController之外,还有一种方法可以监听内部滚动视图的滚动事件。您可以将ListView 放在NotificationListener 中,然后检查它提供的滚动信息。

    @override
    Widget build(BuildContext context) {
      return CupertinoPageScaffold(
        child: NestedScrollView(
          headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) {
            return <Widget>[
              CupertinoSliverNavigationBar(
                largeTitle: Text('Large Title'),
              ),
            ];
          },
          body: NotificationListener<ScrollNotification>(
            onNotification: (ScrollNotification scrollInfo) {
              if (scrollInfo.metrics.pixels ==
                  scrollInfo.metrics.maxScrollExtent) {
                print('Reached the bottom');
              }
              return;
            },
            child: ListView.builder(
              itemCount: 50,
              itemBuilder: (BuildContext context, int index) {
                return Container(
                  height: 50,
                  child: Center(child: Material(child: Text('Entry $index'))),
                );
              },
            ),
          ),
        ),
      );
    }
    

    【讨论】:

    • 将 scrollController 放在 NestedScrollView(父级)中的问题是我无法检测到用户何时滚动到列表底部。如果控制器放在子listView中,我只能准确检测用户何时滚动到底部。这里提到的解决方案都不起作用:stackoverflow.com/questions/46377779/…
    • 现在,我更好地了解了您的情况,并添加了一个示例来说明您想要做什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-17
    • 1970-01-01
    • 2021-05-11
    • 2021-08-22
    • 2022-10-04
    • 2021-12-19
    • 2019-05-22
    相关资源
    最近更新 更多