Flutter BLoC:如何使用空值更新状态?
Flutter BLoC : how to update state with null values?
在 BLoC 中更新状态时如何处理“接受的空值”?
我使用 flutter_bloc 包。
我有一个表单,其中数字变量可以为空,这样我就可以在提交表单之前检查它们的有效性。
但是当我发出一个新状态时,我使用 state.copyWith(var1?, var2?)... 所以当一个空值被用来更新一个参数时,这个值不会被更新。
面对这一点,我为每个字段使用自定义的 FieldStatus 枚举。在我的表单提交中,我可以检查每个字段的状态。但这有点冗长...而且它需要为每个字段使用 2 个值而不是 1 个值,这不是很令人满意。
我也可以根据它的FieldStatus的新值强制为null,但是有点棘手,不是很满意。
你会如何处理这种情况?
这是我所做的:
状态:
part of 'phhfgroup_bloc.dart';
class PhhfGroupState extends Equatable
{
final double? height;
final FieldStatus heightStatus;
const PhhfGroupState({this.height, this.heightStatus = FieldStatus.initial});
@override
List<Object?> get props => [height, heightStatus];
PhhfGroupState copyWith({double? height, FieldStatus? heightStatus})
{
return PhhfGroupState(
height: height ?? this.height,
heightStatus: heightStatus ?? this.heightStatus
);
}
}
活动:
part of 'phhfgroup_bloc.dart';
abstract class PhhfGroupEvent extends Equatable
{
const PhhfGroupEvent();
@override
List<Object> get props => [];
}
class HeightChanged extends PhhfGroupEvent
{
const HeightChanged({required this.height});
final String height;
@override
List<Object> get props => [height];
}
处理程序:
import 'package:equatable/equatable.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:myapp/models/statuses.dart';
part 'phhfgroup_event.dart';
part 'phhfgroup_state.dart';
class PhhfGroupBloc extends Bloc<PhhfGroupEvent, PhhfGroupState>
{
PhhfGroupBloc() : super()
{
on<HeightChanged>(_mapHeightEventToState);
}
void _mapHeightEventToState(HeightChanged event, Emitter<PhhfGroupState> emit)
{
if(event.height.isEmpty)
{
emit(this.state.copyWith(
height: null,
heightStatus: FieldStatus.empty
));
}
else
{
double? height = double.tryParse(event.height);
if(height == null)
emit(this.state.copyWith(
height: null,
heightStatus: FieldStatus.nonnumeric
));
else emit(this.state.copyWith(
height: height,
heightStatus: FieldStatus.numeric
));
}
}
}
谢谢!
通过使用freeze,您可以进行如下操作:
void main() {
var person = Person('Remi', 24);
// `age` not passed, its value is preserved
print(person.copyWith(name: 'Dash')); // Person(name: Dash, age: 24)
// `age` is set to `null`
print(person.copyWith(age: null)); // Person(name: Remi, age: null)
}
如果您不想使用其他包,我建议添加一个参数来控制可空值。
class PhhfGroupState extends Equatable
{
final double? height;
final FieldStatus heightStatus;
const PhhfGroupState({this.height, this.heightStatus = FieldStatus.initial});
@override
List<Object?> get props => [height, heightStatus];
PhhfGroupState copyWith({double? height, FieldStatus? heightStatus, bool clearHeight = false})
{
return PhhfGroupState(
height: clearHeight == true ? null : height ?? this.height,
heightStatus: heightStatus ?? this.heightStatus
);
}
}
如果你有一堆 nullable
个字段,我会强烈推荐 freeze,但对于其他人,只需为其添加一个标志即可。
非常感谢,因为这正是我所需要的!避免大量样板代码来实现这个简单的目标...
因此,为了实现我的需要,我将使用:
- 冻结以帮助管理状态/事件
- 我的 FieldStatus 枚举使一些信息在视图中可用
在 BLoC 中更新状态时如何处理“接受的空值”? 我使用 flutter_bloc 包。
我有一个表单,其中数字变量可以为空,这样我就可以在提交表单之前检查它们的有效性。 但是当我发出一个新状态时,我使用 state.copyWith(var1?, var2?)... 所以当一个空值被用来更新一个参数时,这个值不会被更新。
面对这一点,我为每个字段使用自定义的 FieldStatus 枚举。在我的表单提交中,我可以检查每个字段的状态。但这有点冗长...而且它需要为每个字段使用 2 个值而不是 1 个值,这不是很令人满意。
我也可以根据它的FieldStatus的新值强制为null,但是有点棘手,不是很满意。
你会如何处理这种情况?
这是我所做的:
状态:
part of 'phhfgroup_bloc.dart';
class PhhfGroupState extends Equatable
{
final double? height;
final FieldStatus heightStatus;
const PhhfGroupState({this.height, this.heightStatus = FieldStatus.initial});
@override
List<Object?> get props => [height, heightStatus];
PhhfGroupState copyWith({double? height, FieldStatus? heightStatus})
{
return PhhfGroupState(
height: height ?? this.height,
heightStatus: heightStatus ?? this.heightStatus
);
}
}
活动:
part of 'phhfgroup_bloc.dart';
abstract class PhhfGroupEvent extends Equatable
{
const PhhfGroupEvent();
@override
List<Object> get props => [];
}
class HeightChanged extends PhhfGroupEvent
{
const HeightChanged({required this.height});
final String height;
@override
List<Object> get props => [height];
}
处理程序:
import 'package:equatable/equatable.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:myapp/models/statuses.dart';
part 'phhfgroup_event.dart';
part 'phhfgroup_state.dart';
class PhhfGroupBloc extends Bloc<PhhfGroupEvent, PhhfGroupState>
{
PhhfGroupBloc() : super()
{
on<HeightChanged>(_mapHeightEventToState);
}
void _mapHeightEventToState(HeightChanged event, Emitter<PhhfGroupState> emit)
{
if(event.height.isEmpty)
{
emit(this.state.copyWith(
height: null,
heightStatus: FieldStatus.empty
));
}
else
{
double? height = double.tryParse(event.height);
if(height == null)
emit(this.state.copyWith(
height: null,
heightStatus: FieldStatus.nonnumeric
));
else emit(this.state.copyWith(
height: height,
heightStatus: FieldStatus.numeric
));
}
}
}
谢谢!
通过使用freeze,您可以进行如下操作:
void main() {
var person = Person('Remi', 24);
// `age` not passed, its value is preserved
print(person.copyWith(name: 'Dash')); // Person(name: Dash, age: 24)
// `age` is set to `null`
print(person.copyWith(age: null)); // Person(name: Remi, age: null)
}
如果您不想使用其他包,我建议添加一个参数来控制可空值。
class PhhfGroupState extends Equatable
{
final double? height;
final FieldStatus heightStatus;
const PhhfGroupState({this.height, this.heightStatus = FieldStatus.initial});
@override
List<Object?> get props => [height, heightStatus];
PhhfGroupState copyWith({double? height, FieldStatus? heightStatus, bool clearHeight = false})
{
return PhhfGroupState(
height: clearHeight == true ? null : height ?? this.height,
heightStatus: heightStatus ?? this.heightStatus
);
}
}
如果你有一堆 nullable
个字段,我会强烈推荐 freeze,但对于其他人,只需为其添加一个标志即可。
非常感谢,因为这正是我所需要的!避免大量样板代码来实现这个简单的目标...
因此,为了实现我的需要,我将使用:
- 冻结以帮助管理状态/事件
- 我的 FieldStatus 枚举使一些信息在视图中可用