3

我在转换这个类时遇到了一个小问题,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参数来使这种优化无效。

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

4

1 回答 1

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 值分配给提供者的责任,而不是模型本身,它仍然很好而且很薄

于 2022-01-06T09:00:11.930 回答