2017-10-18 6 views
0

ListView 안에 NestedScrollView이 있고 SliverAppBar이 축소되어 있습니다. 그러나 컨트롤러를 ListView에 추가하면 작동이 멈 춥니 다 (AppBar 접히지 않습니다). 다음은 왼쪽 ListViewSliverAppBar에 영향을 미치지 않지만 오른쪽은 ListView에 영향을주는 예제입니다. SliverAppBar 및 컨트롤러가있는 목록보기

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

아, 맞습니다. 기본적으로 컨트롤러가있는 경우 ListView 대신 NestedScrollView에 연결해야합니다. scrollview 대신에 컨트롤러를 listview에 연결하고 싶다면 어떻게해야할까요? 가능한지 아십니까? –

+0

무엇을하려고합니까? – aziza

답변

2

NestedScrollView을 사용하는 경우 각 자식 Scrollable의 스크롤 위치를 모두 스크롤 가능한 것처럼 관리하도록 선택합니다. 컨트롤러가있는 개별 어린이의 위치를 ​​제어 할 수있는 방법이 없습니다. 그렇게하면 NestedScrollView을 혼란스럽게 할 수 있기 때문에 도전적 일 것입니다. 그러나, 당신은 완전히 운이 아니야 :

  • NestedScrollView에 컨트롤러를 지정할 수 있습니다.
  • 중첩 스크롤보기에 스크롤 이벤트가있을 때 현재 스크롤 위치 또는 업데이트에 대한 알림을 받으려면 NotificationListenerScrollable을 래핑하여 ScrollNotification을 수신 할 수 있습니다.
  • Scrollable을 0 초의 초기 위치로 "재설정"하려면 그 key을 변경하여 상태를 날려 버릴 수 있습니다.
+0

예, @ aziza 대답에 따라 컨트롤러를 NestedScrollView로 이동했습니다. –

+0

예, 후속 질문에 응답했습니다. 나는 그 대답을 편집했다. –