可注射性能,get_it Flutter
Performance with injectable, get_it Flutter
我有一个问题。在我的项目中,我有一些 class 单例。
- DioMethod(一些 api 配置),
- Repository(连接 ApiProvider 和 BLoc class),
- ApiProvider(调用api => 获取数据=> 传递给Repository),
- 一些 BloC classes 例如 MoviesBloc, MovieDetailBloc,..我创建了一个 BLoC class 每个屏幕.
和 init all 在 $initGetIt 相同。
_i1.GetIt $initGetIt(_i1.GetIt get,
{String? environment, _i2.EnvironmentFilter? environmentFilter}) {
final gh = _i2.GetItHelper(get, environment, environmentFilter);
gh.singleton<_i3.DioConfig>(_i3.DioConfig());
gh.singleton<_i4.DioMethod>(_i4.DioMethod(get<_i3.DioConfig>()));
gh.singleton<_i5.MovieApiProvider>(
_i5.MovieApiProvider(get<_i4.DioMethod>()));
gh.singleton<_i6.Repository>(_i6.Repository());
gh.lazySingleton<_i7.MovieDetailBloc>(
() => _i7.MovieDetailBloc(get<_i6.Repository>()),
dispose: (i) => i.dispose());
gh.lazySingleton<_i8.MoviesBloc>(() => _i8.MoviesBloc(get<_i6.Repository>()),
dispose: (i) => i.dispose());
return get;
}
我想如果我扩展我的项目,我会遇到一些问题。
- 这个函数太大了,我们有太多的单例仍然存在于应用程序中。
- 我们需要在打开应用程序时初始化很多对象=>可以延迟应用程序吗?
- 如何创建一个只在访问屏幕时存活并在弹出屏幕后销毁的单例。
感谢您的回答!
This function will be too large and we have too much singleton still live in app.
我有数百个 GetIt
单例,我没有发现任何问题。
We need to init a lot of Object when opening the app => Can delay app?
如果您担心 Object
的数量 - 无需担心。当 Flutter 构建一个帧(你知道,它每秒构建 60 帧)时,它会创建一个巨大的 widget 树,其中包含数千个 widget,每个 widget 包含数十个对象。所以数百个对象确实是一个非常小的数字。 Dart 的垃圾收集器专为多对象情况而设计。
How to create a singleton only alive when access to the screen and destroyed after pop this screen.
class MyPageOne extends StatefulWidget {
const MyPageOne({Key? key}) : super(key: key);
@override
_MyPageOneState createState() => _MyPageOneState();
}
class _MyPageOneState extends State<MyPageOne> {
@override
void initState() {
super.initState();
GetIt.I.registerSingleton<MyClass>(MyClass());
}
@override
void dispose() {
GetIt.I.unregister<MyClass>();
super.dispose();
}
@override
Widget build(BuildContext context) {
return ...your page...;
}
}
这只是一个示例,例如,您可以将其封装到一个小部件中。
我有一个问题。在我的项目中,我有一些 class 单例。
- DioMethod(一些 api 配置),
- Repository(连接 ApiProvider 和 BLoc class),
- ApiProvider(调用api => 获取数据=> 传递给Repository),
- 一些 BloC classes 例如 MoviesBloc, MovieDetailBloc,..我创建了一个 BLoC class 每个屏幕.
和 init all 在 $initGetIt 相同。
_i1.GetIt $initGetIt(_i1.GetIt get,
{String? environment, _i2.EnvironmentFilter? environmentFilter}) {
final gh = _i2.GetItHelper(get, environment, environmentFilter);
gh.singleton<_i3.DioConfig>(_i3.DioConfig());
gh.singleton<_i4.DioMethod>(_i4.DioMethod(get<_i3.DioConfig>()));
gh.singleton<_i5.MovieApiProvider>(
_i5.MovieApiProvider(get<_i4.DioMethod>()));
gh.singleton<_i6.Repository>(_i6.Repository());
gh.lazySingleton<_i7.MovieDetailBloc>(
() => _i7.MovieDetailBloc(get<_i6.Repository>()),
dispose: (i) => i.dispose());
gh.lazySingleton<_i8.MoviesBloc>(() => _i8.MoviesBloc(get<_i6.Repository>()),
dispose: (i) => i.dispose());
return get;
}
我想如果我扩展我的项目,我会遇到一些问题。
- 这个函数太大了,我们有太多的单例仍然存在于应用程序中。
- 我们需要在打开应用程序时初始化很多对象=>可以延迟应用程序吗?
- 如何创建一个只在访问屏幕时存活并在弹出屏幕后销毁的单例。
感谢您的回答!
This function will be too large and we have too much singleton still live in app.
我有数百个 GetIt
单例,我没有发现任何问题。
We need to init a lot of Object when opening the app => Can delay app?
如果您担心 Object
的数量 - 无需担心。当 Flutter 构建一个帧(你知道,它每秒构建 60 帧)时,它会创建一个巨大的 widget 树,其中包含数千个 widget,每个 widget 包含数十个对象。所以数百个对象确实是一个非常小的数字。 Dart 的垃圾收集器专为多对象情况而设计。
How to create a singleton only alive when access to the screen and destroyed after pop this screen.
class MyPageOne extends StatefulWidget {
const MyPageOne({Key? key}) : super(key: key);
@override
_MyPageOneState createState() => _MyPageOneState();
}
class _MyPageOneState extends State<MyPageOne> {
@override
void initState() {
super.initState();
GetIt.I.registerSingleton<MyClass>(MyClass());
}
@override
void dispose() {
GetIt.I.unregister<MyClass>();
super.dispose();
}
@override
Widget build(BuildContext context) {
return ...your page...;
}
}
这只是一个示例,例如,您可以将其封装到一个小部件中。