首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从v7.2.1迁移到flutter_bloc v8.0.0后不会触发flutter_bloc事件

从v7.2.1迁移到flutter_bloc v8.0.0后不会触发flutter_bloc事件
EN

Stack Overflow用户
提问于 2021-11-21 12:49:39
回答 2查看 640关注 0票数 1

我尝试迁移flutter_bloc v8.0.0。在我阅读了文档之后,我知道我需要将mapEventToState迁移到on。在那之后,我没有得到一个错误,但是_getMonks事件不会被触发。这是我的代码。我还有什么遗漏的吗?

代码语言:javascript
复制
class MonkBloc extends Bloc<MonkEvent, MonkState> {
   final MonkRespository monkRespository;
   late List<Monk> monks;

   MonkBloc({required this.monkRespository}) : super(MonkInitial()) {
       on<GetMonksEvent>((event, emit) => _getMonks);
       on<MonkSearchEvent>((event, emit) => _searchMonks);
   }

   Stream<MonkState> _getMonks(Emitter<MonkState> emit) async* {
     emit(MonkLoading());
     try {
        final List<Monk> monks = await monkRespository.fetchMonks();
        emit(MonkLoaded(monks: monks));
     } catch (e) {
     emit (MonkError(error: (e.toString())));
     }
  }

  Stream<MonkState> _searchMonks(String query, Emitter<MonkState> emit) async* {
emit(MonkLoading());
try {
  final List<Monk> monks = await monkRespository.searchMonks(query);
  emit(MonkLoaded(monks: monks));
} catch (e) {
  emit(MonkError(error: (e.toString())));
}
}
}

class MonkScreen extends StatefulWidget {
  static const routeName = '/monk';
  final String? title;
  final MonkScreenMode? screenMode;
  const MonkScreen({Key? key, this.title, this.screenMode}) : super(key: key);

  @override
  State<MonkScreen> createState() => _MonkScreenState();
  }

  class _MonkScreenState extends State<MonkScreen> {

  _loadMonks() async {

    BlocProvider.of<MonkBloc>(context).add(const GetMonksEvent()); 
  }   

  @override
  void initState() {
    super.initState();
    _loadMonks();
  }

  @override
  Widget build(BuildContext context) {
  return BaseWidget(
  child: Scaffold(
    backgroundColor: Theme.of(context).backgroundColor,
    appBar: AppBar(
      centerTitle: true,
      backgroundColor: Theme.of(context).backgroundColor,
      elevation: 0,
      title: AutoSizeText(
        widget.title!,
        style: Theme.of(context).appBarTheme.titleTextStyle,
      ),
      leading: IconButton(
        onPressed: () {
          Navigator.pop(context);
        },
        icon: Icon(
          Icons.arrow_back,
          color: Theme.of(context).primaryIconTheme.color!,
        ),
      ),
      actions: [
        IconButton(
          onPressed: () {
            showSearch(
                context: context,
                delegate: MonkSearch(screenMode: widget.screenMode!));
          },
          icon: Icon(
            Icons.search,
            color: Theme.of(context).primaryIconTheme.color!,
          ),
        ),
      ],
    ),
    body: BlocBuilder<MonkBloc, MonkState>(
      builder: (BuildContext context, MonkState monkState) {
        if (monkState is MonkError) {
          return const SomethingWentWrongScreen();
        } else if (monkState is MonkLoaded) {
          return listViewBuilder(
              context, monkState.monks, widget.screenMode!);
        }
        return const Center(
          child: CircularProgressIndicator(),
        );
      },
    ),
  ),
);
}
}
EN

回答 2

Stack Overflow用户

发布于 2021-11-21 14:13:33

这就是我迁移代码的方式。以防有人需要它。

代码语言:javascript
复制
class MonkBloc extends Bloc<MonkEvent, MonkState> {
final MonkRespository monkRespository;
late List<Monk> monks;

MonkBloc({required this.monkRespository}) : super(MonkInitial()) {
on<GetMonksEvent>((event, emit) async {
await _getMonks(emit);
});
on<MonkSearchEvent>((event, emit) async {
await _searchMonks(event.query, emit);
});
}

 Future<void> _getMonks(Emitter<MonkState> emit) async {
 emit(MonkLoading());
 try {
 final List<Monk> monks = await monkRespository.fetchMonks();
  emit(MonkLoaded(monks: monks));
 } catch (e) {
 emit (MonkError(error: (e.toString())));
 }
 }

 Future<void> _searchMonks(String query, Emitter<MonkState> emit) async 
 {
 emit(MonkLoading());
  try {
  final List<Monk> monks = await monkRespository.searchMonks(query);
 emit(MonkLoaded(monks: monks));
 } catch (e) {
 emit(MonkError(error: (e.toString())));
 }
 }
 }
票数 0
EN

Stack Overflow用户

发布于 2021-11-22 18:42:29

代码语言:javascript
复制
class APIBloc extends Bloc<APIEvents, APIState> {
  //
  final APIRepo apiRepo;

  APIBloc({required this.apiRepo}) : super(APIInitState()) {
    on<APIEvents>(_addToValue);
  }

  Future<void> _addToValue(APIEvents event, Emitter<APIState> emit) async {
    print("onEvent");
    emit(APILoading());
    emit.forEach(
        Stream.fromFuture(_callAPI(event).catchError((onError) {
          return onError;
        })), onData: (value) {
      if (value is Response)
        return APILoaded(response: value as Response);
      else {
        return value as APIListError;
      }
    });
  }

  Future<Object> _callAPI(APIEvents event) async {
    try {
      if (event is FetchDashBoard) {
        return await apiRepo.getDashboardData(event.requestParams);
      } else if (event is DoLogin) {
        return await apiRepo.doLogin(event.requestParams);
      } else {
        throw (APIListError(
          error: NoInternetException('No Internet'),
        ));
      }
    } on SocketException {
      throw (APIListError(
        error: NoInternetException('No Internet'),
      ));
    } on HttpException {
      throw (APIListError(
        error: NoServiceFoundException('No Service Found'),
      ));
    } on FormatException {
      throw (APIListError(
        error: InvalidFormatException('Invalid Response format'),
      ));
    } catch (e) {
      throw (APIListError(
        error: UnknownException('Unknown Error'),
      ));
    }
  }
}

遵循下面的网站,如果需要更多的澄清代码。https://flutterlearneasyway.blogspot.com/2021/11/flutter-bloc-pattern-800-call-api.html

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70054678

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档