Flutter中拆分Cubit文件后,如何在扩展类中调用emit()?
我将过长的my_cubit.dart文件拆分为my_cubit.dart和my_cubit.extension.dart两个文件,代码结构如下:
my_cubit.dart:
part 'my_cubit.extension.dart'; class MyCubit extends Cubit<MyState> {...}
my_cubit.extension.dart:
part of 'my_cubit.dart'; extension MyCubitExtension on MyCubit { void getResult() { emit(GettingResult); ... } }
但在扩展类中调用emit(GettingResult)时出现如下报错:
"The member 'emit' can only be used within instance members of subclasses of 'package:bloc/src/bloc_base.dart'.dart(invalid_use_of_protected_member)"
"The member 'emit' can only be used within 'package:bloc/src/bloc_base.dart' or a test.dart(invalid_use_of_visible_for_testing_member)"
我希望这两个文件能像单个文件一样使用,请问有什么解决办法?
方法1:在主Cubit类中封装emit调用
在my_cubit.dart的MyCubit类中新增一个私有方法,用来封装emit的调用逻辑。因为part文件属于同一库,私有方法可以被扩展访问:
修改my_cubit.dart:
part 'my_cubit.extension.dart'; class MyCubit extends Cubit<MyState> { // ... 原有业务代码 // 封装emit,供part文件中的扩展调用 void _emit(MyState state) => emit(state); }
然后在扩展文件中调用这个私有方法替代直接调用emit:
part of 'my_cubit.dart'; extension MyCubitExtension on MyCubit { void getResult() { _emit(GettingResult); // ... 后续逻辑 } }
方法2:将扩展逻辑转为类的成员方法(放弃extension)
如果不需要使用extension语法,可以直接在part文件中为MyCubit添加成员方法,这种方式属于类的一部分,能直接访问emit:
my_cubit.extension.dart:
part of 'my_cubit.dart'; // 直接在part文件中扩展类的成员,而非使用extension语法 extension MyCubit on MyCubit { void getResult() { emit(GettingResult); // ... 后续逻辑 } }
注:这种写法本质上是在同一库内为类添加成员,和直接写在主类文件效果一致,能绕过extension的访问限制。
方法3:不推荐的绕过方式
不建议使用反射或其他破坏封装的方式强制访问emit,这会违背Bloc的设计规范,增加代码维护风险。
内容的提问来源于stack exchange,提问作者H S park

