use*_*948 9 listview dart flutter
我有一个客户列表视图,用户可以在其中选中/取消选中每个客户以将他们标记为“收藏夹”。但是,每次点击 ListItem 时,ListView 都会跳回到屏幕顶部。
我如何防止这种情况发生?我只希望 Checkbox 刷新,而不是整个屏幕,并防止屏幕每次都跳到顶部。
@override
Widget build(BuildContext context) {
customers = getAllCustomers();
return Scaffold(
appBar: _getAppBar(),
body: customers != null
? FutureBuilder(
future: getFavouriteCustomers(), // contains IDs of favourite customers
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
if (snapshot.hasData) {
List<String> favouriteCustomersList = snapshot.data;
return ListView.builder(
itemCount: customers?.length ?? 0,
itemBuilder: (BuildContext context, int index) {
customer c = customers?.elementAt(index);
if (favouriteCustomersList.contains(c.id)) {
c.isSelected = true;
}
return ListTile(
title: Text(c.name),
trailing: Checkbox(
value: c.isFavourite,
onChanged: (newValue) {}),
onTap: () {
if (c.isSelected) {
setState(() {
c.setFavourite(false);
});
} else {
setState(() {
c.setFavourite(true);
}
}
},
);
});
}
} else {
return CircularProgressIndicator();
}
})
: Center(
child: CircularProgressIndicator(),
);
);
Run Code Online (Sandbox Code Playgroud)
}
确保您在 StatefulWidget 中执行此操作。
ScrollController在状态类(不是小部件类)中创建一个as 字段:
_controller = ScrollController(keepScrollOffset: true);
Run Code Online (Sandbox Code Playgroud)
这样,控制器将保留在状态中,并且不会在重建时重新创建。
controller: _controller,
Run Code Online (Sandbox Code Playgroud)
@override
void dispose() {
_controller.dispose();
super.dispose();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1559 次 |
| 最近记录: |