pth*_*fan 2 dart flutter flutter-freezed
在以下代码片段中,state.copyWith 函数不可用。
@freezed
class MyState with _$MyState {
@JsonSerializable(fieldRename: FieldRename.snake, explicitToJson: true)
const factory MyState({@Default(0) int counter,}) = _MyState;
const factory MyState.initial({@Default(0) int counter}) = Initial;
const factory MyState.loading() = Loading;
const factory MyState.one() = One;
const factory MyState.two() = Two;
factory MyState.fromJson(Map<String, dynamic> json) =>
_$MyStateFromJson(json);
}
class MyStateNotifier extends StateNotifier<MyState> {
MyStateNotifier() : super(MyState.initial());
Future<void> one() async {
state = MyState.loading();
await Future.delayed(Duration(seconds: 5));
state.copyWith(counter: 1);
}
}
Run Code Online (Sandbox Code Playgroud)
但是,当我删除密封类时,copyWith 函数可用。
@freezed
class MyState with _$MyState {
@JsonSerializable(fieldRename: FieldRename.snake, explicitToJson: true)
const factory MyState({@Default(0) int counter,}) = _MyState;
// const factory MyState.initial({@Default(0) int counter}) = Initial;
// const factory MyState.loading() = Loading;
// const factory MyState.one() = One;
// const factory MyState.two() = Two;
factory MyState.fromJson(Map<String, dynamic> json) =>
_$MyStateFromJson(json);
}
class MyStateNotifier extends StateNotifier<MyState> {
MyStateNotifier() : super(MyState());
Future<void> one() async {
await Future.delayed(Duration(seconds: 5));
state.copyWith(counter: 1);
}
}
Run Code Online (Sandbox Code Playgroud)
我需要更改什么才能使 copyWith 在第一个片段中可用?
只有所有构造函数共有的属性才会生成copyWith
方法,如README 文档中所述。
We can use copyWith with properties defined on all constructors...
Run Code Online (Sandbox Code Playgroud)
假设您有一个 的实例Loading
,copyWith
您希望它有什么方法?它没有属性,因此它不能有任何copyWith
方法,因此所有类型的联合也不能。
但是,您可以使用模式匹配来调用copyWith
正确类型的实例。
在你的例子中,这样的事情会起作用:
MyState myState = ...;
myState.maybeMap(
initial: (v: Initial) => v.copyWith(counter: v.counter + 1),
orElse: () => ...,
);
Run Code Online (Sandbox Code Playgroud)
或者使用when
:
MyState myState = ...;
myState.when(
(int counter) => MyState.initial(counter + 1),
loading: () => loading,
one: () => one,
two: () => two,
);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
5333 次 |
最近记录: |