如何在 StreamBuilder 中更新 Flutter 卡而不重置状态?

2024-02-23

我让 StreamBuilder 正常工作。 1 件事,每次 1 个元素更改时,整个列表都会重置。例如,每张卡都有一个计数器,我希望在不改变屏幕的情况下看到它的加法和减法。我怎样才能做到这一点?这是我的代码(使用完整文件堆栈更新)...

    final FirebaseAuth _auth = FirebaseAuth.instance;
final fb = FirebaseDatabase.instance.reference();
final falQuery = fb.child('NumberOnes').orderByChild('Value');
final streamQuery = fb.child('NumberOnes').orderByChild('Value').onValue;

class NumberOnesPage extends StatefulWidget {
  @override
  NumberOnesPageState createState() => new NumberOnesPageState();
}

class NumberOnesPageState extends State<NumberOnesPage> {
  List names = new List();
  List numbers = new List();
  List ids = new List();
  List vidImages = new List();

  void _handleJson(value) {
    Map myMap = value; //store each map
    var titles = myMap.values;
    for (var items in titles) {
      names.add(items['vidTitle']);
      numbers.add(items['Value']);
      ids.add(items['vidId']);
      vidImages.add(items['vidImage']);
    }
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
        appBar: new AppBar(
          backgroundColor: Colors.amber,
          title: new Text(
            'Number Ones',
            style:
                new TextStyle(fontWeight: FontWeight.bold, color: Colors.black),
          ),
        ),
        body: new Container(
          child: new Center(
              child: new Column(
            children: <Widget>[
              new Flexible(
                  child: new FirebaseAnimatedList(
                      query: falQuery,
                      padding: new EdgeInsets.all(15.0),
                      //sort: (a, b) => b.key.compareTo(a.key),
                      reverse: false,
                      itemBuilder: (_, DataSnapshot followerSnap,
                          Animation<double> animation, int Index) {
                        return new StreamBuilder<Event>(
                            stream: streamQuery,
                            builder: (BuildContext context,
                                AsyncSnapshot<Event> event) {
                              switch (event.connectionState) {
                                case ConnectionState.none:
                                  return new Card(
                                    child: new Text('Loading...',
                                        style: new TextStyle(
                                            fontSize: 12.0,
                                            fontWeight: FontWeight.bold,
                                            fontStyle: FontStyle.italic)),
                                  );
                                case ConnectionState.waiting:
                                  return new Card(
                                    child: new Text('Awaiting Results...',
                                        style: new TextStyle(
                                            fontSize: 12.0,
                                            fontWeight: FontWeight.bold,
                                            fontStyle: FontStyle.italic)),
                                  );
                                default:
                                  if (event.hasError)
                                    return new Card(
                                      child: new Text('Error: ${event.error}',
                                          style: new TextStyle(
                                              fontSize: 12.0,
                                              fontWeight: FontWeight.bold,
                                              fontStyle: FontStyle.italic)),
                                    );
                                  else
                                    _handleJson(event.data.snapshot.value);
                                  return new InkWell(
                                    splashColor: Colors.blueAccent,
                                    onTap: () {
                                      Navigator.push(
                                          context,
                                          new MaterialPageRoute(
                                              builder: (_) =>
                                                  new Video.VideoPage()));
                                      Video.id = ids[Index];
                                      Video.title = names[Index];
                                      Video.videoImage = vidImages[Index];
                                    },
                                    child: new Card(
                                      child: new Column(
                                        children: <Widget>[
                                          new Padding(
                                              padding: new EdgeInsets.all(5.0)),
                                          new Image.network(vidImages[Index]),
                                          new Padding(
                                              padding: new EdgeInsets.all(3.0)),
                                          new Text(
                                              '${numbers[Index]} MyFavKPopers Have Made This Their #1'),
                                          new Padding(
                                              padding: new EdgeInsets.all(3.0)),
                                          new Text(
                                            names[Index],
                                            style: new TextStyle(
                                                fontSize: 18.0,
                                                fontWeight: FontWeight.bold,
                                                color: Colors.black),
                                            //textAlign: TextAlign.center,
                                          ),
                                          new Padding(
                                              padding: new EdgeInsets.all(5.0)),
                                        ],
                                      ),
                                    ),
                                  );
                              }
                            });
                      }))
            ],
          )),
        ));
  }
}

例如,我想numbers[Index]更改甚至卡片根据数字值上下移动,而无需完全更改 UI。


有一个小部件可以做到这一点:索引栈 https://api.flutter.dev/flutter/widgets/IndexedStack-class.html,它保留堆栈中所有子级的状态,同时允许您在它们之间切换:

IndexedStack(
index: _widgetIndex,
children: [
 WidgetOne(),
 WidgetTwo()
]
)

您可以在代码中的任何位置使用 setState() 通过修改 _ widget Index 的值来更改应显示的小部件

setState(() => _widgetIndex = 2);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 StreamBuilder 中更新 Flutter 卡而不重置状态? 的相关文章

随机推荐

  • 每次将图像推送到 GCR 时自动更新 Pod

    我有一个 docker 镜像被推送到 Container Registrydocker push gcr io go demo servertime和一个用以下命令创建的 podkubectl run servertime image gc
  • Windows Phone 8 应用程序栏按钮长按事件

    我正在开发 Windows Phone 8 C 应用程序 我必须获取已放置在应用程序栏中的前进和后退按钮的长按事件 但只发现应用程序栏按钮的单击事件 请让我知道如何捕获应用程序栏按钮的长按事件 提前致谢 这不可能 ApplicationBa
  • 使用 apollo graphql 反应 firebase 身份验证

    我发现一篇很棒的文章将身份验证添加到反应中 文章 https www robinwieruch de complete firebase authentication react tutorial https www robinwieruc
  • 处理训练和测试数据中的不同因子水平

    我有一个 20 列的训练数据集 所有这些都是我必须用于训练模型的因素 我已经获得了测试数据集 我必须在该数据集上应用我的模型进行预测并提交 我正在进行初始数据探索 只是出于好奇检查了训练数据和测试数据级别 因为我们正在处理所有类别变量 令我
  • 我可以使用 Selenium IDE 生成 Cucumber/Capybara 步骤吗?

    我已经安装了 Selenium IDE Firefox 插件 和 Capybara gem 我现在在我的 Rails 应用程序中从 Cucumber Capybara 步骤 javascript 驱动 Selenium 问题是 我可以将 S
  • Safari 浏览器中的 codeigniter 会话

    我们正在使用以下内容来检查所有控制器功能的会话 this gt session gt userdata Admin logged in https www codeigniter com user guide libraries sessi
  • 将 Interact.js 与 Angular 项目集成

    我需要在 Angular 项目中使用 Interact js 提供的功能 例如可拖动 可调整大小等 但我找不到在打字稿中导入它的可靠方法 我已经通过将其定义为函数来阅读一些解决方法 但我只想知道这是否是正确的方法 添加了 Interactj
  • Try-Catch 并“继续”——这可能吗?

    我的代码中有一部分正在查询网络上的所有 SQL Server 数据库 我首先尝试使用 SQL 登录来访问 SQL Server 实例 但如果失败 那么我想尝试使用我的 Windows 凭据进行连接 之后 如果我仍然无法连接 那么我希望代码失
  • 错误:安装 R 依赖包时未找到 gdal-config,而 gdal 已安装

    请指出我遗漏的一点 开放SUSE 11 3 xx linux y3pi Desktop R gt sudo R CMD INSTALL rgdal 0 7 12 tar gz root s password installing to li
  • 如何在c#中使用多个未选中的

    有没有办法对整个程序或整个块使用 unchecked 我正在从 java 翻译一些类型为 long 的东西 并且与无符号长常量进行大量比较 有些地方有一些开关有 20 30 个案例 我是否必须单独取消选中每个案例或者是否有有更快 更简单的方
  • 当我按下数字时,如何使用 EditText onTextChanged 事件?

    我有一个EditText with text 0 00 当我按数字 3 时 应该是这样的0 03当我第二次按数字 5 时 文本应该是0 35 And 35 0 35 09像这样 这EditText最初的值为0 00 这些都是用相同的方法完成
  • 通过反射执行方法时线程挂起

    我有一个执行器服务 它根据反射运行新线程 我有一种方法 在运行时不会退出线程并且会挂起程序执行 我不确定这是为什么 有人能指出我缺少什么吗 另外 如果任何并发专家注意到我可能遇到的任何问题 请告诉我 我在并发方面相当新手 Notes con
  • 等待IShellDispatch2.ShellExecute启动的进程

    我在用IShellDispatch2 ShellExecute https learn microsoft com en us windows desktop shell ishelldispatch2 shellexecute从我的提升进
  • C#:在txt文件中搜索关键字

    我在读取逗号分隔的 TXT 文件时遇到问题 这就是我正在努力做的事情 我正在文本文件中搜索关键字 然后 当我找到包含该关键字的行时 将整行逗号分隔的关键字放入字符串数组中 我怎样才能做到这一点 Thanks System IO Stream
  • FragmentTabHost 未在 Android 中的 Fragment 内创建视图

    我在选项卡主机上更改视图时遇到问题 当我选择选项卡时 内容保持空白 据我所知 onCreateView子片段没有被调用 onMenuCreate运行良好 因为菜单按预期变化 public class PatientTabFragment e
  • 向 Keras 模型添加图层后无法导入冻结图

    我正在尝试从 h5 文件加载经过训练的 Keras 模型 然后在其周围包裹几个 TensorFlow 层并保存为 ProtoBuf 保存工作正常 但是当我导入图形定义时 出现错误 ValueError 节点batch normalizati
  • 如何将 write 与 stringstream 一起使用?

    我有一个vector
  • 如何从线程函数中获取多个返回值?

    调用了返回多个值的外部函数 def get name full name you code return first name last name 在简单的函数调用中 我可以获得结果 from names import get name f
  • 如何使用 ics 文件取消日历事件?

    我们的要求之一是创建 iCalendar 文件 ics 并将它们作为附件通过电子邮件发送 我们正在使用DDay Ical dll http sourceforge net projects dday ical 创建 ics 文件 如下所示
  • 如何在 StreamBuilder 中更新 Flutter 卡而不重置状态?

    我让 StreamBuilder 正常工作 1 件事 每次 1 个元素更改时 整个列表都会重置 例如 每张卡都有一个计数器 我希望在不改变屏幕的情况下看到它的加法和减法 我怎样才能做到这一点 这是我的代码 使用完整文件堆栈更新 final