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

标签 dart flutter

我有一个 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/

相关文章:

flutter - 这个类可以重新配置为接受 Flutter 中的命名参数吗?

firebase - Flutter,Firebase 在电子邮件和密码身份验证时崩溃应用程序

android - 在 VS Code 上模拟 Android 时为 "Invalid Argument(s): Cannot find executable for null"- Mac OS X

date - 更改 Dart 上的日期格式

flutter - 如何在 Flutter 中对连接包进行单元测试

dart - 如何指定函数参数的默认值?

dart - 生成 SDK dartdoc

android - 如何修复不在 flutter 中心的应用栏

flutter - 如何在 Flutter 上使用 iOS 键盘上按钮更改 TextField 焦点

flutter - 更改抽屉的颜色在悬停时不会显示颜色