Flutter:为什么这个流构建器不起作用?

2024-03-21

所以,我刚刚开始从事一个 flutter 项目,对整个体验还很陌生。我刚刚通过创建几个更新、删除和添加文档的按钮,成功地将 firebase firestore 集成到我的项目中。但是,我还想添加一个 Streambuilder 以及在同一页面上更新的列表。我分别尝试了每个任务,它们都工作得很好,但是当我将两者结合起来时,流构建器不显示任何数据,并且按钮不会单击。如何将按钮和 Streambuilder 合并到一个正文或一页中?我可以做什么来将这两个元素合并到小部件构建方法中的一个页面上?同样,如果我在主体中使用 Streambuilder 而不是子小部件标签,这两个元素似乎可以单独工作。

不工作页面的图片。请注意,当鼠标悬停在按钮上时,按钮不会被选择,并且 Streambuilder 会无限加载:https://i.stack.imgur.com/XnfVJ.png https://i.stack.imgur.com/XnfVJ.pngFirebase数据截图(安全设置允许用户访问数据):https://i.stack.imgur.com/oSsOL.png https://i.stack.imgur.com/oSsOL.png

这是我的 main.dart 代码:


  final databaseReference = Firestore.instance;
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('FireStore Demo'),
      ),
      body: Center(
          child: Column(
        crossAxisAlignment: CrossAxisAlignment.stretch,

        children: <Widget>[

          RaisedButton(
            child: Text('Create Record'),
            onPressed: () {
              createRecord();
            },
          ),
          RaisedButton(
            child: Text('View Record'),
            onPressed: () {
              getData();
            },
          ),
          RaisedButton(
            child: Text('Update Record'),
            onPressed: () {
              updateData();
            },
          ),
          RaisedButton(
            child: Text('Delete Record'),
            onPressed: () {
              deleteData();
            },
          ),
          StreamBuilder<QuerySnapshot>(
        stream: databaseReference.collection('books').snapshots(),
        builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
          if (!snapshot.hasData) return new Text('Loading...');
          return new ListView(
            children: snapshot.data.documents.map((DocumentSnapshot document) {
              return new ListTile(
                title: new Text(document['title']),
                subtitle: new Text('${document['description']} description'),
              );
            }).toList(),
          );
        },
      )
        ],
      )),
       //center
    );
  }

  void createRecord() async {
    await databaseReference.collection("books")
        .document("1")
        .setData({
          'title': 'Mastering Flutter',
          'description': 'Programming Guide for Dart'
        });

    DocumentReference ref = await databaseReference.collection("books")
        .add({
          'title': 'Flutter in Action',
          'description': 'Complete Programming Guide to learn Flutter'
        });
    print(ref.documentID);
  }

  void getData() {
    databaseReference
        .collection("books")
        .getDocuments()
        .then((QuerySnapshot snapshot) {
      snapshot.documents.forEach((f) => print('${f.data}}'));
    });
  }

  void updateData() {
    try {
      databaseReference
          .collection('books')
          .document('1')
          .updateData({'description': 'Head First Flutter'});
    } catch (e) {
      print(e.toString());
    }
  }

  void deleteData() {
    try {
      databaseReference
          .collection('books')
          .document('1')
          .delete();
    } catch (e) {
      print(e.toString());
    }
  }
}




仍然不知道为什么上面的代码不起作用,但是将 StreamBuilder 放在 Expanded 块中似乎可以解决问题!到目前为止,这两个小部件都运行良好。

import 'package:flutter/material.dart';

导入'包:cloud_firestore / cloud_firestore.dart';

无效主()=> runApp(新MediaQuery( 数据:new MediaQueryData(),子:new MaterialApp(home: new MyApp())));

      child: Column(
    crossAxisAlignment: CrossAxisAlignment.stretch,

    children: <Widget>[

      RaisedButton(
        child: Text('Create Record'),
        onPressed: () {
          createRecord();
        },
      ),
      RaisedButton(
        child: Text('View Record'),
        onPressed: () {
          getData();
        },
      ),
      RaisedButton(
        child: Text('Update Record'),
        onPressed: () {
          updateData();
        },
      ),
      RaisedButton(
        child: Text('Delete Record'),
        onPressed: () {
          deleteData();
        },
      ),
  new Expanded(child:
    new StreamBuilder<QuerySnapshot>(
    stream: databaseReference.collection('books').snapshots(),
    builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
      if (!snapshot.hasData) return new Text('Loading...');
      return new ListView(
        children: snapshot.data.documents.map((DocumentSnapshot document) {
          return new ListTile(
            title: new Text(document['title']),
            subtitle: new Text('${document['description']} description'),
          );
        }).toList(),
      );
    },
    )
  )
    ],
  )),
   //center
);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Flutter:为什么这个流构建器不起作用? 的相关文章

随机推荐

  • 用于管理阻止/限制 google/Gsuite 中加载项的策略的 google API 是什么

    我需要阻止 限制用户访问特定的加载项 我可以使用谷歌管理门户 安全 gt API 控制 来阻止加载项 这解决了问题 但我不想手动执行此操作 而是想使用谷歌 API 来自动执行相同的操作 我尝试探索用户 令牌等 API 但找不到选项 如果您能
  • iCloud 和 NSFileWrapper:在“设置”中显示为 2 个不同的文件

    我有一个使用基于 NSFileWrapper 的 UIDocument 的应用程序 我的文件包装器是一个名为 XXX cp 的目录 其中有两个子文件 photo data 和 photo metadata 它似乎可以很好地保存和加载文档 但
  • Python 中的循环命名

    我最近读过这个问题 https stackoverflow com questions 886955 breaking out of nested loops in java 886979 886979其中有一个关于 Java 中标记循环的
  • 丢失 .idea 文件夹后如何在 Android Studio 中重新创建项目?

    我一直试图通过尝试一些东西来了解 Android Studio IDE 的工作原理 我从 Google 存储库导入了示例项目之一 Android DataLayer 它附带了一些配置的模块 然后我删除了 idea文件夹并想再次打开该项目 但
  • 我们可以使用 data.table 按组设置顺序吗?

    简单的问题 我想用data table setorder在我的 DT 上 但我不能按组执行此操作 是否可以 在此示例中 我订购了整个 DT DT data table a rep c C A D B E each 4 b sample 1
  • 在自定义格式化程序中访问 rowObejct

    在 jqgrid wikki 中 我读到 虽然使用 xml 数据类型 rowobject 将不是一个数组 在 json 中 我使用 rowobject 1 2 等获取了列值 但是如何使用 xml 数据类型来实现这一点 请提供使用 xml 数
  • 确定在哪个表视图中按下了单元格按钮?

    我有像测验这样的表格视图单元格 在每个单元格中我都有一个按钮 我如何识别按下了哪个单元格按钮 也许通过 IndexPath 这就是我将按钮连接到的方式 func tableView tableView UITableView cellFor
  • 带有 SDK 4.2 的 Xcode 始终启动 iPad 模拟器

    为什么 Xcode 在更新到 SDK 4 2 后总是在 iPad Simulator 而不是 iPhone 中运行我的应用程序 如果我选择 iPhone Simulator 作为活动可执行文件 它不会存储我的首选项 并在任何新的 构建和运行
  • 应用程序关闭后无法保持 Android 服务处于活动状态

    我正在尝试生成一个始终保持活动状态的服务 即使用户关闭应用程序也是如此 根据这些线程 当应用程序关闭时保持位置服务处于活动状态 https stackoverflow com questions 21441232 keep location
  • 如何判断在touchesBegan中哪个对象被触摸了?

    我知道这是一个非常常见的问题 但每个网站上的所有答案都不起作用 如果你还是不明白我的意思 那么也许这行代码会帮助你理解 void touchesBegan NSSet touches withEvent UIEvent event UITo
  • 有没有办法将 Google Sheets 工作簿中的值绘制到 TradingView pinescript 中?

    我正在尝试将 GoogleSheets 工作簿中计算的值绘制在交易视图图表上 我无法在 Tradingview 中进行相同的计算 因为这些值来自动态网页 所以我在 excel 中进行计算 并且想知道是否可以以某种方式将这些值发送到 Trad
  • PySpark 时间戳的毫秒数

    我试图获取两个时间戳列之间的差异 但毫秒消失了 如何纠正这个问题 from pyspark sql functions import unix timestamp timeFmt yyyy MM dd HH mm ss SSS data 1
  • 在 C# 中实现套接字侦听器的最佳方法

    我已经搜索过答案 但找不到类似的东西 我对 C 相当陌生 我需要使用 WinForms 在 C 中创建一个程序 它基本上有 2 个组件 UI 然后我需要一个永久侦听套接字 TCP 端口的进程 如果收到任何内容 那么我需要引发一个事件或类似的
  • 计算一年中第一周的星期一的最简单方法是什么

    我想过去一年并得到一个代表第一周第一个星期一的日期 so 如果一个传入2011 我会回来的2011 年 1 月 3 日 如果一个传入2010 我会回来的2010 年 1 月 4 日 private DateTime GetFirstMond
  • Images.xcassets 违反目标法则

    好吧 所以我正在为这个问题拔牙 我真诚地希望我犯了一个愚蠢的错误 涉及到一些深夜 简短的背景故事 我们正在构建一个需要品牌化的产品 因为多个客户将共享 90 相同的 UI 和代码 并使用一些配置选项来打开 关闭以及不同的颜色 字体和图像等
  • 当我第二次运行测试时,为什么在 Mongoose 中出现错误“无法覆盖编译后的模型”?

    我读过相关帖子 编译 Mongoose 后无法覆盖模型 https stackoverflow com questions 19051041 cannot overwrite model once compiled mongoose 问题是
  • 改变排序对象行为

    使用映射到 Linux 共享的驱动器时 文件名区分大小写 PowerShell 按预期处理此问题 但我想以类似于 C 语言环境中使用的排序顺序的方式对输出进行排序 这意味着按字符值从 U 0000 一直到 U 升序排序10FFFF 例如 0
  • HTML 标签的正则表达式 [重复]

    这个问题在这里已经有答案了 我有一个 HTML 页面 tr 类 我需要捕获这些标签之间的文本 我尝试过Regex i tr
  • Javascript:拖放图像标签

    我想知道如何使用 javascript 拖放图像标签 我知道 html5 每个元素都可以拖动 但我想让它在旧浏览器上工作 我已经使用javascript进行了拖放操作 除了在ie和firefox中 当鼠标按下时 它工作得很好 除非用户单击它
  • Flutter:为什么这个流构建器不起作用?

    所以 我刚刚开始从事一个 flutter 项目 对整个体验还很陌生 我刚刚通过创建几个更新 删除和添加文档的按钮 成功地将 firebase firestore 集成到我的项目中 但是 我还想添加一个 Streambuilder 以及在同一