滚动时,ListView内部的水平SingleChildScrollView位置会发生变化



我有一个ListView,里面有一些项,包括一个SingleChildScrollView:

ListView(
children: [
SingleChildScrollView(
scrollDirection: Axis.horizontal,
physics: const ClampingScrollPhysics(),
primary: false,
child: Padding(
padding: const EdgeInsets.only(bottom: 10),
child: Row(
children: [
// Container(height: 50, width: 200)
],
),
),
),
Container(height: 1000),
],
)

当我向下和向上滚动时,SingleChildScrollView会自行滚动项目到最后。我知道ListView缓存它显示的内容,但是否可以将SingleChildScrollView的滚动位置保留为用户滚动到的位置?

我知道两种方法,一种是用ListView上的addAutomaticKeepAlives值增加cacheExtent,另一种是使用AutomaticKeepAliveClientMixin

ListView(
cacheExtent: 2122,// depend on your case
addAutomaticKeepAlives: true,
children: [
SingleChildScrollView(
restorationId: "Scroll Item",
scrollDirection: Axis.horizontal,
physics: const ClampingScrollPhysics(),

第二种方法是使用AutomaticKeepAliveClientMixin

class MyHorizontalListView extends StatefulWidget {
const MyHorizontalListView({super.key});
@override
State<MyHorizontalListView> createState() => _MyHorizontalListViewState();
}
class _MyHorizontalListViewState extends State<MyHorizontalListView>
with AutomaticKeepAliveClientMixin {
@override
bool get wantKeepAlive => true;

@override
Widget build(BuildContext context) {
super.build(context);
return SingleChildScrollView(

并将其放置在ListView上。可能有一些捷径,idk,

最新更新