数据更新后 Flutter listview 不更新

2023-12-25

我在 BottomSheet 中有一个 ListView,它是使用元素数组构建的。目前我有一项“空”,然后.clear()在异步数据库调用后编辑并填充。

变量更新是正确的,我尝试使用setState((){})但 ListView 根本没有更新。我需要关闭bottomSheet,重新打开它,然后ListView 就有正确的项目。

我需要打电话吗setState或者bottomSheet构建器是否需要标记为更新?

主要列表视图部分:

 @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('My Map'),
          backgroundColor: Colors.green[700],
        ),

        //Put in a stack widget so can layer other widgets on top of map widget
        body: Stack(
          children: <Widget>[
            GoogleMap(
              mapType: _currentMapType,
              markers: _markers,
              onMapCreated: _onMapCreated,
              onCameraMove: _onCameraMove,
              initialCameraPosition: CameraPosition(
                target: _center,
                zoom: 11.0,
              ),
            ),
            Padding(
              padding: const EdgeInsets.all(16.0),
              child: Align(
                  alignment: Alignment.bottomCenter,
                  child: Row(mainAxisSize: MainAxisSize.min, children: <Widget>[
                    SizedBox(width: 16.0),

                    Builder(
                      builder: (context) => FloatingActionButton(   
                          ...
                      ),

                    ),

                    SizedBox(width: 16.0),

                    FloatingActionButton(
                      ...
                    ),

                    SizedBox(width: 16.0),

                    Builder(
                      builder: (context) => FloatingActionButton(
                          child: Icon(Icons.file_download, size: 36.0),
                          backgroundColor: Colors.green,
                          onPressed: () {
                            showBottomSheet(
                                context: context,
                                builder: (context) {
                                  return ListView(
                                    padding: EdgeInsets.all(15.0),
                                    children: <Widget>[

                                         ...

                                      Divider(),

                                      ListTile(
                                        title: Text("Remote JSON Download"),
                                        trailing:
                                        Icon(Icons.refresh),
                                        selected: true,
                                        onTap: _OnPressedReloadJSON,               <-------------
                                      ),

                                      Divider(),

                                      Container(
                                        height: 150.0,
                                        child: ListView.builder(               <-------------
                                          scrollDirection: Axis.horizontal,

                                          itemCount : testList.length, 
                                          itemBuilder: (BuildContext context, int index) {
                                              return Container(
                                                padding: EdgeInsets.all(5.0),
                                                margin: EdgeInsets.all(5.0),
                                                width: 150.0,
                                                color: Colors.red,
                                                child: Text(testList[index]),
                                              );
                                          },

                                        ),
                                      ),

异步获取:

class _MyAppState extends State<MyApp> {

  ...

  _OnPressedReloadJSON() {
    fetchJSONAndMakeListTile();
  }

  ...

  List<String> testList= ["empty"];

  Future<http.Response> fetchJSONAndMakeListTile() async {
    final response = await http.get('https://..... file.json');

    // If the server did return a 200 OK response, then parse the JSON.
    if (response.statusCode == 200) {
      List<db_manager.MyObject> myObjects = (json.decode(response.body) as List)
          .map((e) => db_manager.MyObject.fromJson(e))
          .toList();

      testList.clear();
      myObjects.forEach((db_manager.MyObject al) {
        testList.add(al.code);
        print("debug:"+al.code+" - "+al.name);        <------------- prints correctly
      });

      //TODO Does this even work?
      //Trigger update of state - ie redraw/reload UI elements
      setState(() {});

    } else {
      // If the server did not return a 200 OK response, then throw an exception.
      print(response);
      throw Exception('Failed to load json');
    }
  }

UPDATE:

我已将 BottomSheet 构建器抽象为另一个类(根据另一个答案)作为其自己的 StatefulWidget 但我似乎无法访问void onPress()我的主 dart 文件中的方法。如果 BottomSheet 创建/构建器位于这个单独的 dart 文件中,我如何调用它来构建,然后使用async调用更新listview内容List?

底表 Widget.dart

class BottomSheetDatabases extends StatefulWidget {
  @override
  _BottomSheetDatabases createState() => _BottomSheetDatabases();
}

class _BottomSheetDatabases extends State<BottomSheetDatabases> {

  void _onpress() {

  }

  void loadMe() {

  }

  List<String> testList= ["empty"];

  @override
  Widget build(BuildContext context) {
    return BottomSheet(

        builder: (context) {
          return ListView(
            padding: EdgeInsets.all(15.0),
            children: <Widget>[
              ListTile(
                ...

              ),

              Divider(),

              Container(
                height: 150.0,
                child: ListView.builder(
                  scrollDirection: Axis.horizontal,

                  itemCount: testList.length,
                  itemBuilder: (BuildContext context, int index) {
                    return Container(
                      key: UniqueKey(),
                      //TODO  ??
                      padding: EdgeInsets.all(5.0),
                      margin: EdgeInsets.all(5.0),
                      width: 150.0,
                      color: Colors.red,
                      child: Text(testList[index]),
                    );
                  },

                ),
                //),
                //),
              ),

              ...

主dart:

  void _loadSheetDatabases() {
    BottomSheetWidget bottomSheetwidget = BottomSheetWidget();
    bottomSheetwidget.loadMe();
  }

在我看来,一个KeyListView.Builder 返回的小部件中缺少,请尝试放置一个UniqueKey()或 ValueKey 到容器或文本中:

Container(
   key: UniqueKey(),
   padding: EdgeInsets.all(5.0),
   margin: EdgeInsets.all(5.0),
   width: 150.0,
   color: Colors.red,
   child: Text(testList[index]),
);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据更新后 Flutter listview 不更新 的相关文章

随机推荐

  • EF Core 种子数据库与预定义列表的一对多关系

    我试图在我的数据库中使用定义的 List 建立 OneToMany 关系 并收到以下错误消息 无法添加实体类型 Country 的种子实体 因为它设置了导航 WineRegions 要种子关系 您需要将相关实体种子添加到 WineRegio
  • Scala 的线性代数库? [复制]

    这个问题在这里已经有答案了 可能的重复 Scala 有好的数学 统计库吗 https stackoverflow com questions 8760925 is there a good math stats library for sc
  • 创建对象时防止 m2m_changed 触发

    当使用 Django 信号时 例如post save您可以通过执行以下操作来防止它在首次创建对象时触发 receiver post save sender MyModel def my signal sender instance crea
  • WPF UserControl 如何继承 WPF UserControl?

    以下 WPF UserControl 称为数据类型整数这有效 现在我想做一个名为的 UserControl数据类型日期时间 and 数据类型电子邮件 etc 许多依赖属性将由所有这些控件共享 因此我想把将它们的常用方法转换为 BaseDat
  • Windows Phone 8:本地化不起作用

    我已将我的应用程序从 WP7 本地化没有问题 转移到 WP8 现在 无论手机设置如何 都仅显示英语 我的设置是 取自http www geekchamp com articles localizing a windows phone app
  • 将 Postgresql 数据存储在外部驱动器上

    我在使用 Windows 10 的台式机和笔记本电脑上安装了 Postgresql 14 有人可以告诉我如何将数据存储在外部 SSD 驱动器上 以便我可以将驱动器移动到另一台计算机而无需恢复吗 我正在考虑学习 Ubuntu 因为网上有人说
  • ListField 中文本右侧的复选框

    我想要带有图像的列表字段和文本右侧的复选框 我在左侧获得了图像 但无法在右侧获得复选框 如果可能的话 复选框应该是不可见的 只能看到刻度线 我想实现 Image text1 chechbox Image text2 Image text3
  • 在meteor.com 上拥有一个子域

    如果我将我的应用程序发布到子域 例如 spartan meteor com 我是否拥有该子域 或者其他用户可以从我这里拿走它吗 如果我可以拥有它 是否有相关文档 您可以为您的应用程序设置部署密码 meteor deploy P sparta
  • 为什么这里不遵循运算符优先级? [复制]

    这个问题在这里已经有答案了 在此代码中 int y 10 int z y y 5 我所期望的 First y 5由于最内层括号的优先级 将被执行 所以值y将为 11 该表达式的值将为 15 然后 y 将被执行 所以 12 15 180 所以
  • Magento 自定义支付网关

    我正在尝试为 Magento 编写一个自定义支付网关 该模块在管理后端 系统 配置 付款方式 中被识别 但在前端到达 付款信息 时 没有出现选择该模块的选项 下面包含我创建的三个 XML 文件以及它们所在的目录 任何帮助将非常感激 谢谢 根
  • 在hibernate(springboot)中使用左连接和分页编写sql本机查询[重复]

    这个问题在这里已经有答案了 我正在使用 spring data JPA 我想在我的存储库中编写 SQL 查询 我有以下 SQL 查询 注意 LEFT JOIN SELECT FROM institution LEFT JOIN select
  • MySQL 查询运行两次

    我有一个 php 文件 其中包含 PHP 简单 HTML DOM 解析器 include simple html dom php 这种包容性使我mysql query query 在我的页面上执行两次 如果我删除包含内容 mysql que
  • 无法加载 x64 和 x86 的文件或程序集“CefSharp.Wpf”;只有一部作品

    当我跑步时我得到 Could not load file or assembly CefSharp Wpf Version 41 0 0 0 Culture neutral PublicKeyToken 40c4b6fc221f4138 o
  • 将 pandas DataFrame 中带逗号的数字字符串转换为 float

    我有一个 DataFrame 其中包含数字作为字符串 并用逗号表示千位标记 我需要将它们转换为浮点数 a 1 200 4 200 7 000 0 03 5 0 df pandas DataFrame a 我猜我需要使用 locale ato
  • 在 Swift 中从字典中获取值或键时保留循环

    当我从字典中获取值并将它们放入数组时 我无法再释放内存 我尝试从数组和字典中删除所有对象 但这些对象仍然存在于某处 未调用 deinit 我是按照以下方式玩的 class MyData let i 0 init NSLog Init dei
  • 检索关联数据时出错。仅限Linux

    在这个问题之前 我有另一个与同一主题相关的问题 感谢 ndm 问题已得到解决 链接上一个问题 Cakephp 3 Windows和Linux操作系统在查询数据库时返回不同的结果 https stackoverflow com questio
  • 我们应该如何使用 pad_sequences 在 keras 中填充文本序列?

    我已经编码了序列到序列 https stackoverflow com questions 41933958 how to code a sequence to sequence rnn in keras我自己使用从网络教程中获得的知识和我
  • 如何正确取消闹钟应用程序中 AlarmManager 设置的 AlarmClock 闹钟?

    这个问题已经有答案了here https stackoverflow com q 16999343 5993712 here https stackoverflow com q 20159649 5993712 and here https
  • FragmentPagerAdapter 的第二个片段中的访问受限

    我有两个类似的onViewCreated结构片段 1st Override public void onViewCreated NonNull View view Nullable Bundle savedInstanceState sup
  • 数据更新后 Flutter listview 不更新

    我在 BottomSheet 中有一个 ListView 它是使用元素数组构建的 目前我有一项 空 然后 clear 在异步数据库调用后编辑并填充 变量更新是正确的 我尝试使用setState 但 ListView 根本没有更新 我需要关闭