带控制器的SliverAppBar和Listview

Mar*_*łek 4 dart flutter

我想有一个ListView内部NestedScrollView已经SliverAppBar崩溃了.但是,如果我添加一个控制器ListView,它将停止工作(AppBar不会崩溃).这是左边ListView不影响的例子SliverAppBar,但是右边的例子ListView.

import 'package:flutter/material.dart';

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

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

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key}) : super(key: key);

  @override
  _MyHomePageState createState() => new _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  ScrollController scrollController = new ScrollController();
  List<String> entries = ["a", "b", "c", "d", "e", "a", "b", "c", "d", "e"];

  @override
  Widget build(BuildContext context) {
    return new DefaultTabController(
      length: 2,
      child: new Scaffold(
        body: new NestedScrollView(
          headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) {
            return <Widget>[
              new SliverAppBar(
                  title: new Text("My app"),
                  pinned: true,
                  expandedHeight: 150.0,
                  floating: true,
                  forceElevated: innerBoxIsScrolled,
                  bottom: new TabBar(
                    tabs: <Tab>[
                      new Tab(text: "FIRST"),
                      new Tab(text: "SECOND"),
                    ],
                  )),
            ];
          },
          body: new TabBarView(
            children: <Widget>[
              new ListView.builder(
                itemCount: entries.length,
                controller: scrollController,
                itemExtent: 60.0,
                itemBuilder: (buildContext, index) {
                  return new Text(entries[index]);
                },
              ),
              new ListView.builder(
                itemCount: entries.length,
                itemExtent: 60.0,
                itemBuilder: (buildContext, index) {
                  return new Text(entries[index]);
                },
              ),
            ],
          ),
        ),
      ),
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

您是否知道是否可以将控制器连接到a ListView并仍然通知NestedScrollView

Col*_*son 11

如果您正在使用NestedScrollView,则选择让它管理每个孩子的滚动位置,Scrollable就好像它们都是统一的可滚动一样.没有办法Scrollable用控制器来驱动个别孩子的位置; 这样做会很有挑战性,因为它可能会NestedScrollView陷入困惑状态.但是,你并非完全没有运气:

  • 你可以给一个控制器NestedScrollView.
  • 如果您只是希望在嵌套滚动视图中有滚动事件时收到有关当前滚动位置或更新的通知,您可以将其包装Scrollable在一个NotificationListener侦听中ScrollNotification.
  • 如果你想让孩子Scrollable"重置"到零初始滚动位置,你可以改变它key以吹走它的状态.