Flutter BLoC `buildWhen` 属性
Flutter BLoC `buildWhen` property
我在这段代码的最后一行遇到 _CastError
错误
BlocBuilder buildUsernameField() {
return BlocBuilder<ProfileBloc, ProfileState>(
buildWhen: (previous, current) => previous != current && current is EditingUserInfo,
builder: (context, state) => TextField(
keyboardType: TextInputType.name,
controller: TextEditingController(
text: (state as EditingUserInfo).username.value),
这么说
I/flutter (26787): The following _CastError was thrown building BlocBuilder<ProfileBloc, ProfileState>(dirty, state:
I/flutter (26787): _BlocBuilderBaseState<ProfileBloc, ProfileState>#25b87):
I/flutter (26787): type 'Success' is not a subtype of type 'EditingUserInfo' in type cast
因此,当我处于另一种状态(成功)时,它会尝试构建该小部件。但是在 buildWhen
参数中,我指定小部件只应在状态为 EditingUserInfo
.
时构建
所以据我了解,这个错误应该不会发生。
这是我的 ProfileState
:
part of 'profile_bloc.dart';
abstract class ProfileState extends Equatable {
const ProfileState();
@override
List<Object> get props => [];
}
class ProfileInitial extends ProfileState {}
class EditingUserInfo extends ProfileState {
final Username username;
final Bio bio;
final PhotoUrl photoUrl;
final City city;
final FormzStatus status;
const EditingUserInfo({
this.username = const Username.pure(),
this.bio = const Bio.pure(),
this.photoUrl = const PhotoUrl.pure(),
this.city = const City.pure(),
this.status = FormzStatus.pure,
});
EditingUserInfo copyWith({Username username, Bio bio, PhotoUrl photoUrl, City city, FormzStatus status}){
return EditingUserInfo(
username: username ?? this.username,
bio: bio ?? this.bio,
photoUrl: photoUrl ?? this.photoUrl,
city: city ?? this.city,
status: status ?? this.status,
);
}
@override
List<Object> get props => [username, bio, photoUrl, city];
}
class Loading extends ProfileState {}
class Error extends ProfileState {
final String message;
const Error({this.message});
@override
List<Object> get props => [message];
}
class Success extends ProfileState {
final String message;
const Success({this.message});
@override
List<Object> get props => [message];
}
您仍然需要检查状态变量是否处于正确的状态。每次更改时都会检查状态,因此状态变量仍然可以是不同的状态,除非 buildWhen 条件为真,否则它不会重建。
BlocBuilder buildUsernameField() {
return BlocBuilder<ProfileBloc, ProfileState>(
buildWhen: (previous, current) => previous != current && current is EditingUserInfo,
builder: (context, state) {
if(state is EditingUserInfo) {
return TextField(
keyboardType: TextInputType.name,
controller: TextEditingController(
text: state.username.info)
}
}
我在这段代码的最后一行遇到 _CastError
错误
BlocBuilder buildUsernameField() {
return BlocBuilder<ProfileBloc, ProfileState>(
buildWhen: (previous, current) => previous != current && current is EditingUserInfo,
builder: (context, state) => TextField(
keyboardType: TextInputType.name,
controller: TextEditingController(
text: (state as EditingUserInfo).username.value),
这么说
I/flutter (26787): The following _CastError was thrown building BlocBuilder<ProfileBloc, ProfileState>(dirty, state:
I/flutter (26787): _BlocBuilderBaseState<ProfileBloc, ProfileState>#25b87):
I/flutter (26787): type 'Success' is not a subtype of type 'EditingUserInfo' in type cast
因此,当我处于另一种状态(成功)时,它会尝试构建该小部件。但是在 buildWhen
参数中,我指定小部件只应在状态为 EditingUserInfo
.
所以据我了解,这个错误应该不会发生。
这是我的 ProfileState
:
part of 'profile_bloc.dart';
abstract class ProfileState extends Equatable {
const ProfileState();
@override
List<Object> get props => [];
}
class ProfileInitial extends ProfileState {}
class EditingUserInfo extends ProfileState {
final Username username;
final Bio bio;
final PhotoUrl photoUrl;
final City city;
final FormzStatus status;
const EditingUserInfo({
this.username = const Username.pure(),
this.bio = const Bio.pure(),
this.photoUrl = const PhotoUrl.pure(),
this.city = const City.pure(),
this.status = FormzStatus.pure,
});
EditingUserInfo copyWith({Username username, Bio bio, PhotoUrl photoUrl, City city, FormzStatus status}){
return EditingUserInfo(
username: username ?? this.username,
bio: bio ?? this.bio,
photoUrl: photoUrl ?? this.photoUrl,
city: city ?? this.city,
status: status ?? this.status,
);
}
@override
List<Object> get props => [username, bio, photoUrl, city];
}
class Loading extends ProfileState {}
class Error extends ProfileState {
final String message;
const Error({this.message});
@override
List<Object> get props => [message];
}
class Success extends ProfileState {
final String message;
const Success({this.message});
@override
List<Object> get props => [message];
}
您仍然需要检查状态变量是否处于正确的状态。每次更改时都会检查状态,因此状态变量仍然可以是不同的状态,除非 buildWhen 条件为真,否则它不会重建。
BlocBuilder buildUsernameField() {
return BlocBuilder<ProfileBloc, ProfileState>(
buildWhen: (previous, current) => previous != current && current is EditingUserInfo,
builder: (context, state) {
if(state is EditingUserInfo) {
return TextField(
keyboardType: TextInputType.name,
controller: TextEditingController(
text: state.username.info)
}
}