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