Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 颤振:具有多个滚动控制器的多个列表_Flutter_Dart - Fatal编程技术网

Flutter 颤振:具有多个滚动控制器的多个列表

Flutter 颤振:具有多个滚动控制器的多个列表,flutter,dart,Flutter,Dart,我想创建一个包含多个小部件的可滚动页面,每个小部件代表一个ListView。其中一些列表具有用于加载多个项目的滚动控制器。我希望能够控制每个小部件中的滚动,但我也希望在页面上滚动 类似于: 主页(我尝试过专栏): -Widget1>列表视图。用滚动方向分隔:轴。水平 -Widget2>列表视图。用滚动方向分隔:轴。水平 -Widget3>滚动方向为Axis.vertical的ListView.builder;列表中的每个项目都包含一个GridView.builder;此列表具有用于加载多个项目的

我想创建一个包含多个小部件的可滚动页面,每个小部件代表一个ListView。其中一些列表具有用于加载多个项目的滚动控制器。我希望能够控制每个小部件中的滚动,但我也希望在页面上滚动

类似于:
主页(我尝试过专栏):
-Widget1>列表视图。用滚动方向分隔:轴。水平
-Widget2>列表视图。用滚动方向分隔:轴。水平
-Widget3>滚动方向为Axis.vertical的ListView.builder;列表中的每个项目都包含一个GridView.builder;此列表具有用于加载多个项目的滚动控制器
-Widget4>idem Widget3(具有scrollDirection:Axis.vertical的ListView.builder;此列表还具有用于加载更多元素的滚动控制器)

主页:

  Column(
   children: <Widget>[
    DocumentsFiltersWidget() //Widget1,
    ReportsListWidget() //Widget2,
    Expanded(child: DocumentsListWidget()) //Widget3,
    Expanded(child: DocumentsListWidget()) //also Widget3
   ]
 )
列(
儿童:[
DocumentsFiltersWidget()//Widget1,
ReportsListWidget()//Widget2,
已展开(子项:DocumentsListWidget())//Widget3,
已展开(子项:DocumentsListWidget())//也可为Widget3
]
)
寡妇3

  ScrollController _scrollController = new ScrollController();

  @override
  void initState() {
    _scrollController.addListener(() async {
      double maxScroll = _scrollController.position.maxScrollExtent;
      double currentScroll = _scrollController.position.pixels;

      if (currentScroll == maxScroll) { 
        print("loadMore");
      }
    });

    super.initState();
  }

  @override
  void dispose() {
    _scrollController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return 
    ListView.builder(
      controller: _scrollController,
      shrinkWrap: true,
      itemCount: 2,
      itemBuilder: (BuildContext context, int index) {
        return Padding(
          padding: EdgeInsets.fromLTRB(12.0, 0.0, 12.0, 0.0),
          child: Column(
            children: <Widget>[
              SizedBox(height: 10.0),
              Row(
                mainAxisAlignment: MainAxisAlignment.spaceBetween,
                children: <Widget>[
                  Text("List ${index.toString()}"),
              ]),
              Container(
                margin: EdgeInsets.fromLTRB(0.0, 10.0, 0.0, 10.0),
                decoration: new BoxDecoration(
                  border: new Border.all(color: Colors.grey, width: 0.3)
                )
              ),
              GridView.builder(
                physics: NeverScrollableScrollPhysics(),
                shrinkWrap: true,
                itemCount: 10,
                gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 3, mainAxisSpacing: 5.0, childAspectRatio: 0.75),
                itemBuilder: (BuildContext context, int index) {
                  return Card(
                    shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(2.0)),
                    child: Padding(
                      padding: EdgeInsets.all(5.0),
                      child: Text("DocumentCard ${index.toString()}")
                    )
                  );
                }
              )
            ],
        ),
      );
    });
  }
ScrollController\u ScrollController=new ScrollController();
@凌驾
void initState(){
_scrollController.addListener(()异步{
double maxScroll=\u scrollController.position.maxScrollExtent;
双currentScroll=\u scrollController.position.pixels;
如果(currentScroll==maxScroll){
打印(“加载更多”);
}
});
super.initState();
}
@凌驾
无效处置(){
_scrollController.dispose();
super.dispose();
}
@凌驾
小部件构建(构建上下文){
返回
ListView.builder(
控制器:\ u滚动控制器,
收缩膜:对,
物品计数:2,
itemBuilder:(构建上下文,int索引){
返回填充(
填充:来自LTRB(12.0,0.0,12.0,0.0)的边缘设置,
子:列(
儿童:[
尺寸箱(高度:10.0),
划船(
mainAxisAlignment:mainAxisAlignment.spaceBetween,
儿童:[
文本(“List${index.toString()}”),
]),
容器(
边距:从LTRB(0.0,10.0,0.0,10.0)开始的边距集,
装饰:新盒子装饰(
边框:新边框。全部(颜色:颜色。灰色,宽度:0.3)
)
),
GridView.builder(
物理学:NeverscrollableScroll物理学(),
收缩膜:对,
物品计数:10,
gridDelegate:SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount:3,mainAxisSpacing:5.0,childAspectRatio:0.75),
itemBuilder:(构建上下文,int索引){
回程卡(
形状:RoundedRectangleBorder(borderRadius:borderRadius.circular(2.0)),
孩子:填充(
填充:所有边缘设置(5.0),
子项:文本(“DocumentCard${index.toString()}”)
)
);
}
)
],
),
);
});
}

一切正常,只是我无法滚动整个页面,Widget1和Widget2被卡住了。喜欢我认为这是因为列和扩展小部件,但如果我用ListView替换列,Widget3\u scrollController.addListener将不再触发。

有两种方法。使用
ListView
SingleChildScrollView

实现相同目的的另一种方法是使用SingleChildScrollView:

return new Container(
  child: new ListView(
    children: <Widget>[
      Column(
      children: <Widget>[
        Child1(),
        Child2(),
        ...
        ChildN()
      ]
    ),
  ],
  )
);
返回新容器(
子:新列表视图(
儿童:[
纵队(
儿童:[
Child1(),
Child2(),
...
ChildN()
]
),
],
)
);
或:

返回新容器(
子:新的SingleChildScrollView(
子:新列(
儿童:[
_showChild1(),
_showChild2(),
...
_showChildN()
]
)
)
);

让我知道这是否有效,如果您有任何问题。

谢谢您的回答。不幸的是,这些解决方案都不起作用。如果我使用它们,来自Wigdet3的scrollController.addListener将不再触发;这样我就不能在滚动上加载更多的项目。
return new Container(
  child: new SingleChildScrollView(
    child: new Column(
      children: <Widget>[
        _showChild1(),
        _showChild2(),
        ...
        _showChildN()
      ]
    )
  )
);