首页 > 解决方案 > Fauna DB 和颤动,无法在 Select 上使用区区数据库 http 包获取默认值

问题描述

我正在使用 zoodb_http 包,如果集合中不存在该字段,我希望从 Fauna DB 返回该值。我只是无法弄清楚我应该在这个包的默认参数中放入什么,以便将其作为默认值取回。

我尝试了默认参数的以下两种变体,第一个出现“路径未找到值”错误,第二个出现空 Object {}。

'itemPrice': Select(["data", "itemPrice"], Var("postDoc"), default_: null),
'itemLocation': Select(["data", "itemLocation"], Var("postDoc"), default_: Obj({})),

有人可以帮我理解我应该传递给 default_ 什么,以便我得到一个 String 或 Int 作为响应。

这是包中 Select 类的代码

@JsonSerializable()
class Select extends Expr {
  @JsonKey(name: 'select')
  final Object path;

  final Expr from;

  @JsonKey(name: 'default', disallowNullValue: true, includeIfNull: false)
  final Expr? default_;

  Select(this.path, this.from, {this.default_});

  factory Select.fromJson(Map<String, dynamic> json) => _$SelectFromJson(json);

  @override
  Map<String, dynamic> toJson() => _$SelectToJson(this);
}

这是针对 Expr 类的

class Expr {
  static Object? wrap_value(dynamic value) {
    if (value is List) {
      return wrap_values(value);
    } else if (value is Map<String, dynamic>) {
      return Obj(value);
    } else if (value is DateTime) {
      return Time(value.toUtc().toIso8601String());
    } else {
      return value;
    }
  }

  static Object? wrap_values(Object? data) {
    if (data == null) return null;

    if (data is List) {
      return List.generate(
        data.length,
        (e) => wrap_value(data[e]),
        growable: false,
      );
    } else if (data is Map<String, dynamic>) {
      return data.map(
        (key, value) => MapEntry(key, wrap_value(value)),
      );
    }

    return data;
  }

  Expr();

  factory Expr.fromJson(Map<String, dynamic> json) => _$ExprFromJson(json);

  Map<String, dynamic> toJson() => _$ExprToJson(this);

  @override
  String toString() {
    return json.encode(this).toString();
  }
}

标签: flutterfaunadb

解决方案


由于我不熟悉 Dart,因此我将搁置特定于语言的方面。

也就是说,当我阅读您的帖子时,它似乎定义Select()工作。第三个参数是未找到您的数据时返回的内容,例如.null

在第一种情况下,您null显式返回,并且 Fauna 删除具有空值的键,因此确实找不到该值。

在第二种情况下,您返回一个空对象,并且您收到一个空对象,因此这似乎也按定义工作。

有人可以帮我理解我应该传递给 default_ 什么,以便我得到一个 String 或 Int 作为响应。

在这种情况下,您需要显式设置一个Expr将评估为字符串或 Int 的值。如果空字符串""和零0是合理的默认值,那么您会想要:

'itemPrice': Select(["data", "itemPrice"], Var("postDoc"), default_: 0),

'itemLocation': Select(["data", "itemLocation"], Var("postDoc"), default_: ""),

推荐阅读