【问题标题】:Flutter and Sembast - Method returns nullFlutter 和 Sembast - 方法返回 null
【发布时间】:2020-10-27 17:52:16
【问题描述】:

我尝试将颤振与 sembast nosql 数据库结合起来。我创建了一个方法来获取所有 db 文档并编辑给定的数据。

我的方法是这样的:

Future<List<Minute>> getAll() async {
    final finder = Finder(sortOrders: [SortOrder('timestamp')]);
    final recordSnapshots = await store.find(await _db, finder: finder);

    return recordSnapshots.map((snapshot) {
      final minute = Minute.fromMap(snapshot.value);

      minute.id = snapshot.key;
      return minute;
    }).toList();
  }

get getSum {
    getAll().then((value) {
      int total = value.fold(
          0, (previousValue, element) => previousValue + element.value);
      print(total); // The correct value
      return total; // Here I dont retrieve the value
    });
  }

print(total) 向我显示了正确的值,但在小部件中我没有检索到它。我只检索null。这里有什么问题?

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    我认为您不应该在 then(...) 中返回值,可能只返回未来并将 FutureBuilder 用作小部件

    【讨论】:

    • 我该怎么做?实际上我需要一个字符串作为返回值。
    • 是的,但是您正在从数据库的异步操作中获取它,并且实际上返回的是 Future。所以你可以只返回这个 Future 并将它传递给一个 FutureBuilder ,它负责异步处理,如果数据作为列表到达,你可以对其进行一些操作并在另一个小部件中显示它
    【解决方案2】:

    您应该使用 pedantic/strong 模式,因为它应该显示 lint 警告(缺少返回类型和缺少返回值),这可以帮助您在不运行它的情况下解决您的问题。

    基于您的代码的未优化解决方案:

    Future<int> getSum() async {
      var minutes = await getAll();
      var total = minutes.fold<int>(
          0, (previousValue, element) => previousValue + element.value);
      return total;
    }
    

    可能的优化:

    • 在计算总和时避免排序
    • 只读取值字段而不是转换整个对象

    例子:

    Future<int> getSum() async {
      var total = 0;
      (await store.find(await _db)).forEach((snapshot) {
        total += snapshot['value'] as int;
      });
      return total;
    }
    

    很遗憾,返回值不能是 String,但它可能是 Future&lt;String&gt;(即 db 调用是异步的)。

    正如 Julian2611 所说,您需要使用 FutureBuilder 和例如 .toString() 将值转换为字符串。

    【讨论】:

    • 非常感谢。我现在明白 FutureBuilder 做了什么。它适用于您的示例。只有一个问题:有没有办法只监听存储在变量中的值?我正在使用一个图表作为我的 FutureBuilder 的孩子。我不需要使用开始动画重新生成整个图表。我只需要监听变量中传递的值。你有实现这一目标的想法吗?谢谢! :)
    猜你喜欢
    • 2020-01-28
    • 2019-07-09
    • 2022-09-30
    • 2020-08-23
    • 2021-09-28
    • 2020-11-10
    • 2020-07-12
    • 2021-06-14
    • 2021-04-19
    相关资源
    最近更新 更多