【问题标题】:Flutter , building widgets with futures, just getting a value out of the DBFlutter ,用期货构建小部件,只是从数据库中获取价值
【发布时间】:2021-03-12 02:08:07
【问题描述】:

所以我有一个菜单,我想简单地从数据库(版本)中获取一个值来显示......

        ListTile(
              contentPadding: EdgeInsets.fromLTRB(20, 30, 0, 0),
              title: FutureBuilder<Text>(
                  future: getTextDbVersion(context),
                  builder:
                      (BuildContext context, AsyncSnapshot<Text> snapshot) {
                    return snapshot.hasData ? snapshot.data : Text("not ready");
                  }))
        

当然,我得到的是一个带有文本的 Text 小部件

'Future 的一个实例'

getTextDbVersion(context) 方法现在有点好笑,因为我正试图找到自己的方法,但就是这样。

  Future<Text> getTextDbVersion(context) async {
    var val = getDbVersion(context);
    print(val);
    return Text(val.toString());
  }

  Future<int> getDbVersion(context) async {
    final ContactTrackerApp app = Provider.of<ContactTrackerApp>(context);
    var storage = await app.storage;

    if (storage == null) {
      return null;
    }

    return await storage.version();
  }

我对这个完整的异步编程有点陌生,现在我知道我是如何将一个该死的值放入字符串中

任何帮助表示赞赏

【问题讨论】:

  • 只是好奇,是 var val = getDbVersion(context);应该是 var val = await getDbVersion(context); ?因为您正在等待 db 版本进行打印。
  • 我删除了那个 getText 方法,只是我想弄清楚

标签: sqlite flutter dart asynchronous


【解决方案1】:

如下更改您的代码。

ListTile(
              contentPadding: EdgeInsets.fromLTRB(20, 30, 0, 0),
              title: FutureBuilder<String>(
                  future: getTextDbVersion(context),
                  builder:
                      (BuildContext context, AsyncSnapshot<Text> snapshot) {
                    return snapshot.hasData ? Text("${snapshot.data}") : Text("not ready");
                  }))

 Future<String> getTextDbVersion(context) async {
    var val = await getDbVersion(context);
    print(val);
    return val.toString();
  }

在以后的builder中进一步使用initialData参数来显示加载状态。

【讨论】:

  • 在这种情况下,我在 $ 上收到错误。未定义的名称“$”。尝试将名称更正为已定义的名称,或定义名称。 "message": "位置参数过多:应有 1 个,但找到了 2 个。\n尝试删除多余的位置参数,或指定命名参数的名称。"
  • 对不起,这是我的错误。您必须将 ${snapshhot.data} 的引号添加为 "${snapshot.data}"
  • 你能解释一下为什么吗?或者链接到那里发生的事情?
  • 1.您没有等待 getDbVersion 的未来,因此 val.toString 只会将字符串返回为“未来的实例”
  • 答案当然是,只是在这里添加await "var val = await getDbVersion(context);" ,不涉及快照周围的 $。
【解决方案2】:

目前,您正在从您的 getTextDbVersion() 函数返回一个小部件。一个好的做法是,对于数据处理方法,您应该只返回ObjectStringint 等原始数据类型。Text 小部件稍后应在 UI 中使用:

 Future<String> getTextDbVersion(context) async {
    var val = getDbVersion(context);
    print(val);
    return val.toString(); // Make this return a String
  }

在用户界面中:

  ListTile(
              contentPadding: EdgeInsets.fromLTRB(20, 30, 0, 0),
              title: FutureBuilder<String>(
                  future: getTextDbVersion(context),
                  builder:
                      (BuildContext context, AsyncSnapshot<Text> snapshot) {
                    return snapshot.hasData ? Text(snapshot.data) : Text("not ready");
                  }))

【讨论】:

  • 谢谢,试图让它工作有点乱!
  • @MonstersX 是的,习惯使用 Stream 需要一段时间。顺便说一句,您可以选择一个答案来标记为已接受的答案吗^^
  • 嘿!明白了,虽然这里没说什么,补充问题
猜你喜欢
  • 1970-01-01
  • 2021-04-30
  • 2020-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-08
  • 2018-09-08
相关资源
最近更新 更多