Flutter 如何将这个 BLoC 旧版本代码迁移到 Bloc 新版本
Flutter how to migrate this BLoC old version code to Bloc new version
我必须如何在 bloc v.8 中编写此代码我不知道我如何看到一些搜索但我不明白这是我的代码 类 他们给我错误 => StateError(错误状态: add(DoFetchEvent) 在没有注册事件处理程序的情况下被调用。
确保通过 on((event, emit) {...})):
注册处理程序
class PostBloc extends Bloc<PostEvent, PostState> {
PostRepository repo;
PostBloc(PostState initialState, this.repo) : super(initialState);
Stream<PostState> mapEventToState(PostEvent event) async* {
if (event is DoFetchEvent) {
yield LoadingState();
try {
var posts = await repo.fetchPosts();
yield FetchSuccess(posts: posts);
} catch (e) {
yield ErrorState(message: e.toString());
}
}
}
}
import 'package:equatable/equatable.dart';
class PostEvent extends Equatable {
@override
List<Object?> get props => [];
}
class DoFetchEvent extends PostEvent {}
class PostState extends Equatable {
@override
List<Object?> get props => [];
}
class InitialState extends PostState {}
class LoadingState extends PostState {}
class FetchSuccess extends PostState {
List<PostModel> posts;
FetchSuccess({required this.posts});
}
class ErrorState extends PostState {
String message;
ErrorState({required this.message});
}
void main() {
runApp(MaterialApp(
home: BlocProvider(
create: (context) => PostBloc(InitialState(), PostRepository()),
child: MyApp(),
),
));
}
您可以直接在 super
构造函数中设置 InitialState
,而无需像这样手动传递它。
PostBloc(this.repo) : super(InitialState()) {
on<DoFetchEvent>(_onDoFetchEvent);
}
那么你在BlocProvider
中的任何状态都不再通过
BlocProvider<PostBloc>(
create: (BuildContext context) => PostBloc(PostRepository()),
...
然后你的 mapEventToState
被替换为一个方法,该方法接受相关的 event
和一个 Emitter<PostState>
作为参数。 yield
然后在方法中被替换为 emit
。
你的整个 class 看起来像这样。
PostBloc(this.repo) : super(InitialState()) {
on<DoFetchEvent>(_onDoFetchEvent);
}
_onDoFetchEvent(
DoFetchEvent event,
Emitter<PostState> emit,
) async {
emit(LoadingState());
try {
var posts = await repo.fetchPosts();
emit(FetchSuccess(posts: posts));
} catch (e) {
emit(ErrorState(message: e.toString()));
}
}
}
应该可以了。
除此之外,您可能会在您的状态 classes 上收到关于 must_be_immutable 的 linter 警告,因为 PostState
扩展了 Equatable
.
所以我建议将所有 PostState
参数设置为 final
并将 props
覆盖从 Equatable
添加到您的状态 classes。
class ErrorState extends PostState {
final String message;
ErrorState({required this.message});
@override
List<Object?> get props => [message];
}
我必须如何在 bloc v.8 中编写此代码我不知道我如何看到一些搜索但我不明白这是我的代码 类 他们给我错误 => StateError(错误状态: add(DoFetchEvent) 在没有注册事件处理程序的情况下被调用。 确保通过 on((event, emit) {...})):
注册处理程序 class PostBloc extends Bloc<PostEvent, PostState> {
PostRepository repo;
PostBloc(PostState initialState, this.repo) : super(initialState);
Stream<PostState> mapEventToState(PostEvent event) async* {
if (event is DoFetchEvent) {
yield LoadingState();
try {
var posts = await repo.fetchPosts();
yield FetchSuccess(posts: posts);
} catch (e) {
yield ErrorState(message: e.toString());
}
}
}
}
import 'package:equatable/equatable.dart';
class PostEvent extends Equatable {
@override
List<Object?> get props => [];
}
class DoFetchEvent extends PostEvent {}
class PostState extends Equatable {
@override
List<Object?> get props => [];
}
class InitialState extends PostState {}
class LoadingState extends PostState {}
class FetchSuccess extends PostState {
List<PostModel> posts;
FetchSuccess({required this.posts});
}
class ErrorState extends PostState {
String message;
ErrorState({required this.message});
}
void main() {
runApp(MaterialApp(
home: BlocProvider(
create: (context) => PostBloc(InitialState(), PostRepository()),
child: MyApp(),
),
));
}
您可以直接在 super
构造函数中设置 InitialState
,而无需像这样手动传递它。
PostBloc(this.repo) : super(InitialState()) {
on<DoFetchEvent>(_onDoFetchEvent);
}
那么你在BlocProvider
BlocProvider<PostBloc>(
create: (BuildContext context) => PostBloc(PostRepository()),
...
然后你的 mapEventToState
被替换为一个方法,该方法接受相关的 event
和一个 Emitter<PostState>
作为参数。 yield
然后在方法中被替换为 emit
。
你的整个 class 看起来像这样。
PostBloc(this.repo) : super(InitialState()) {
on<DoFetchEvent>(_onDoFetchEvent);
}
_onDoFetchEvent(
DoFetchEvent event,
Emitter<PostState> emit,
) async {
emit(LoadingState());
try {
var posts = await repo.fetchPosts();
emit(FetchSuccess(posts: posts));
} catch (e) {
emit(ErrorState(message: e.toString()));
}
}
}
应该可以了。
除此之外,您可能会在您的状态 classes 上收到关于 must_be_immutable 的 linter 警告,因为 PostState
扩展了 Equatable
.
所以我建议将所有 PostState
参数设置为 final
并将 props
覆盖从 Equatable
添加到您的状态 classes。
class ErrorState extends PostState {
final String message;
ErrorState({required this.message});
@override
List<Object?> get props => [message];
}