【问题标题】:Performance with injectable, get_it Flutter可注入的 get_it Flutter 性能
【发布时间】:2021-12-06 05:33:45
【问题描述】:

我有一个问题。在我的项目中,我有一些单例课程。

  • DioMethod(一些 api 配置),
  • Repository(连接 ApiProvider 和 BLoc 类),
  • ApiProvider(调用 api => 获取数据 => 传递给 Repository),
  • 一些 BloC 类,例如 MoviesBlocMovieDetailBloc、..我为每个 Screen 创建了一个 BLoC 类

$initGetIt 处的 init all 相同。

_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;
}

我认为如果我扩展我的项目,我会遇到一些问题。

  1. 这个函数太大了,我们有太多的单例仍然存在于应用程序中。
  2. 我们在打开应用的时候需要初始化很多Object => 可以延迟应用吗?
  3. 如何创建一个只有在访问屏幕时才存活并在弹出此屏幕后销毁的单例。

感谢您的回答!

【问题讨论】:

    标签: flutter dart bloc injectable


    【解决方案1】:

    这个函数太大了,我们还有太多的单例仍然存在于应用程序中。

    我有数百个 GetIt 单身人士,我没有发现任何问题。

    我们在打开app的时候需要初始化很多Object => 可以延迟app吗?

    如果您担心Objects 的数量 - 无需担心。当 Flutter 构建一帧时(你知道,它每秒构建 60 帧),它会创建一个巨大的小部件树,其中包含数千个小部件,每个小部件包含数十个对象。所以数百个对象真的是一个非常小的数字。 Dart 的垃圾收集器专为多对象情况而设计。

    如何创建一个只有在访问屏幕时才存活并在弹出此屏幕后销毁的单例。

    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...;
      }
    }
    

    这只是一个示例,例如,您可以将其封装到一个小部件中。

    【讨论】:

      猜你喜欢
      • 2020-10-25
      • 2021-10-15
      • 2020-10-14
      • 1970-01-01
      • 1970-01-01
      • 2023-01-27
      • 2020-11-08
      • 2022-06-20
      • 2020-10-16
      相关资源
      最近更新 更多