2017-10-18 75 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

是的,我是在迴應你的跟進問題。我編輯了我的回答,提到這一點。 –