2017-10-18 101 views
0

我想NestedScrollViewListViewSliverAppBar折叠。但是,如果我一个控制器添加到ListView,它停止工作(AppBar不塌陷)。在此处,留下ListView不影响SliverAppBar一个例子,但右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]); 
       }, 
      ), 
      ], 
     ), 
     ), 
    ), 
    ); 
    } 
} 

你有什么想法,如果有可能有一个控制器连接到ListView,仍然通知NestedScrollView

+1

它工作正常,你的滚动焦点只转移到孩子提供控制器后,尝试在触摸第一个选项卡,看看我的意思是滚动。你为什么不提供控制器来独占父代? – aziza

+0

哦,你是对的,所以基本上如果我有一个控制器,它需要连接到NestedScrollView而不是ListView控件。如果我真的想将控制器附加到listview而不是scrollview,该怎么办?你知道这有可能吗? –

+0

你想要做什么? – aziza

回答

2

如果您使用的是NestedScrollView,则选择让它管理每个子女Scrollable的滚动位置,就好像它们都是一个统一的可滚动滚动条。没有办法驾驶控制器的个人Scrollable儿童的位置;这样做会很有挑战性,因为它可能会使NestedScrollView进入混乱状态。然而,你并不完全没有运气:

  • 你可以给一个控制器的NestedScrollView
  • 如果您只想通知当前滚动位置或在嵌套滚动视图中存在滚动事件时进行更新,则可以将Scrollable包装在NotificationListener中以侦听ScrollNotification
  • 如果你想使孩子Scrollable“复位”到零初始滚动位置,你可以改变它的key吹走其状态。
+0

是,根据@aziza回答我搬到控制器NestedScrollView –

+0

是的,我是在回应你的跟进问题。我编辑了我的回答,提到这一点。 –