【问题标题】:Arguments of a constant creation must be constant expressions while implement a model using freezed在使用 freezed 实现模型时,常量创建的参数必须是常量表达式
【发布时间】:2021-03-08 19:20:18
【问题描述】:

我在使用 freezed 转换这个类时遇到了一个小问题,因为不可能有一个不是常量的默认值,所以不能将行 DateTime nocache= DateTime.now() 转换为 @Default(DateTime.now()) DateTime nocache

这里有完整的代码

import 'package:equatable/equatable.dart';

abstract class DynamicLinkState extends Equatable {
  const DynamicLinkState();

  @override
  List<Object> get props => [];
}

class DynamicLinkInitial extends DynamicLinkState {
  @override
  String toString() => 'DynamicLinkInitial';
}

class DynamicLinkToNavigate extends DynamicLinkState {
  final String path;
  final DateTime nocache = DateTime.now();

  DynamicLinkToNavigate({this.path});

  @override
  List<Object> get props => [path, nocache];

  @override
  String toString() => 'DynamicLinkToNavigate';
}

我最终该怎么做?

附加上下文 我在这里使用了nocache 属性,因为bloc 被优化为不会多次发送相同的事件,但在这种情况下这是一个有效的用例,因为我可能希望用户收到不止一次相同的动态关联。所以我们找到的解决方案就是通过传递一个不断变化的nocache 参数来使这种优化失效。

因此,此问题的有效解决方案也可能是简单地删除此解决方法以支持更可靠的解决方案。

【问题讨论】:

  • 您能否在问题中添加您的冻结代码

标签: flutter flutter-bloc freezed


【解决方案1】:

今天早上我遇到了同样的问题。我没有直接的方法可以实现这一目标。但是,可能需要采用不同的方法来解决问题。

希望您在应用中使用状态管理解决方案。就我而言,它是 RiverPod。因此,我选择让我的 RiverPod 状态提供程序在创建模型时生成值,而不是让模型直接知道如何为属性生成默认值。

所以有了这样的模型......

@freezed class Pix with _$Pix {
  const factory Pix({String? id, String? description, String? uri}) = _Pix;
}

...在我需要生成 id 的地方(在我的情况下它是一个 uuid),我有一个 StateNotifier 句柄供我使用

class PixList extends StateNotifier<List<Pix>> {
  PixList([List<Pix>? initialPixList]) : super(initialPixList ?? []);

  void add(String description, String uri) {
    state = [...state, 
    Pix(
      id: _uuid.v4(), 
      description: description, 
      uri: uri
      )
    ];
  }
}

由于应该由我的状态提供者来处理创建对象,因此我有效地委派了将初始 id 值分配给提供者的责任,而不是保持良好和精简的模型本身

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-09
    • 2014-11-09
    • 2014-11-13
    相关资源
    最近更新 更多