gpt4 book ai didi

dart - Flutter - 更新 ListView 并重置滚动位置

转载 作者:IT王子 更新时间:2023-10-29 06:48:44 27 4
gpt4 key购买 nike

我有一个 ListView,我可以通过单击按钮更改列表中的项目。现在的问题是,当我向下滚动到列表的末尾然后单击按钮时,项目发生变化但列表的位置仍然相同(所以当我向下滚动并且我之前列表的第 2 项位于顶部,那么新列表的第 2 项也将位于顶部)。我想要的是列表再次从顶部开始,我必须再次向下滚动。

我的 main.dart:

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
List _list;
List _list1 = ['Item 1', 'Item 2', 'Item 3', 'Item 4', 'Item 5', 'Item 6'];
List _list2 = ['Element A', 'Element B', 'Element C', 'Element D', 'Element E', 'Element F'];
bool _isList1;

@override
void initState() {
_list = _list1;
_isList1 = true;
super.initState();
}

void _changeList() {
setState(() {
if (_isList1) {
_list = _list2;
_isList1 = false;
} else {
_list = _list1;
_isList1 = true;
}
});
}

@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Schürer',
home: Scaffold(
appBar: AppBar(
title: Text('ListView'),
),
body: Column(
children: <Widget>[
RaisedButton(
child: Text("Change List"),
onPressed: _changeList,
),
Expanded(
child: ListView(
children: _list
.map(
(item) => Card(
child: Container(
padding: EdgeInsets.all(50),
color: Colors.black26,
child: Text(item),
),
),
)
.toList(),
),
),
],
),
));
}
}

最佳答案

这里你必须为ListView提供key来区分两个不同的listview。如果您不提供 key,那么 flutter 会认为两者是相同的 ListView ,并且它会使用它的索引继续跟踪 ListView 。

如果我们将列表的第一个元素视为键,您的情况可能是什么解决方案。

....
child: ListView(
key: ObjectKey(_list[0]),
children: _list
.....

关于dart - Flutter - 更新 ListView 并重置滚动位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55718202/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com