首页 > 解决方案 > 扩展扩展类或如何从 BLoC 中获取代码

问题描述

由于无法扩展类的扩展,例如class MyBloc extends Bloc<MyEvent, MyState>,从我的 bloc 文件中获取某些功能的最干净的方法是什么?由于逻辑有点复杂,我想得到一些子函数,比如

@override
Stream<MyState> mapEventToState(MyEvent event) async* {
  yield* event.map(
    loadRequested: (e) => _mapLoadRequestedToState(),
    dataEntered: (e) => _mapDataEnteredToState(),
  );
}

Stream<LogicChainState> _mapLoadRequestedToState() async* {
  final dataRaw = loadData();
  final dataProc = initData(dataRaw);
  yield doSomeMore(dataProc);
}

我不喜欢使用全局函数的想法。我可以创建一个类

class MyBlocUtils {
  MyData initData(MyData dataRaw) {
  ...
  }
  MyData doSomeMore(MyData dataProc) {
  ...
  }    
}

这仍然不如使用在 class 中定义的函数好MyBloc

有什么建议吗?

标签: flutterdartbloc

解决方案


如果您只想将方法分成多个文件,但将它们保存在同一个类中,则可以使用extension方法。

my_bloc.dart

part 'my_bloc_utils.dart';

class MyBloc extends Bloc<MyEvent, MyState> {
  Stream<LogicChainState> _mapLoadRequestedToState() async* {
    final dataRaw = loadData();
    final dataProc = initData(dataRaw);
    yield doSomeMore(dataProc);
  }
}

my_bloc_utils.dart

part of 'my_bloc.dart';

extension MyBlocUtils on MyBloc {
  @override
  Stream<MyState> mapEventToState(MyEvent event) async* {
    yield* event.map(
      loadRequested: (e) => _mapLoadRequestedToState(),
      dataEntered: (e) => _mapDataEnteredToState(),
    );
  }
}

您可以像将所有内容保存在一个文件中一样访问这些方法:

import 'my_bloc.dart';

final myBloc = MyBloc();
final stream = myBloc.mapEventToState(MyEvent());

推荐阅读