在Flutter中,我们经常细化你说所有的东西都是一个widget,实际上这并不准确,有些诸如数据库连接或来自设备的数据流的东西,可以不使用BuildContext而安全地访问。
为了组织你如何初始化这些类并从你的widget中访问它们,可以尝试像get_it这样的服务定位器
为开始,你可以注册一个应用程序以后会需要的类,然后,当你需要它时再向它索取
// Do this before your app starts
GetIt.I.registerSingleton<MyDatabase>(
MyDatabase(),
);
// Then start your app!
runApp(MyApp());
finalMyDatabse db = GetIt.I.get<MyDatabase>();
那么那些在你需要之前不因该被初始化的类呢
比如一个特定于页面的状态管理助手? 调用registerFactory方法,以同样的方式检索你的实例
GetIt.I.registerFactory<MyBloc>(
() => MyBloc(),
);
final myBloc = GetIt.I.get<MyBloc>();
你问,这一切是如何使用你的应用程序变得更清洁的?
get_it使得依赖注入更加顺畅
例如,有一个技巧是注册一个辅助工具的真实和测试版本
if (testing) {
GetIt.I.registerSingleton<MyHelper>(
MyHelperMock(),
);
} else {
GetIt.I.registerSingle<MyHelper>(
MyHelperReal(),
);
}
然后让你的widget对发生的事情一无所知
class MyWidget extends StatelessWidget {
const MyWidget({Key? key}) : helper = GetIt.I.get<MyHelper>(), super(key: key);
final MyHelper helper;
}
现在你的新widget已经准备好被测试了
当只有大多数东西都是widget时,尝试get_it来定位那些不是的东西
如果想了解有关package:get_it 的内容,或者关于Flutter的其他功能,请访问pu b.dev
原文翻译自视频:视频地址