Flutter依赖初始化插件dependency_initializer的使用

Flutter依赖初始化插件dependency_initializer的使用

dependency_initializer 是一个用于Dart与Flutter项目的依赖初始化工具。此工具不依赖于Flutter SDK,因此也可以在纯Dart项目中使用。

使用方法

  1. 准备初始化步骤列表:
final List<InitializationStep<Process>> coreStepList = [
  InitializationStep(
    title: "Config",
    initialize: (
      Process process,
    ) =>
        process.config = Config$(),
  ),
];

final List<InitializationStep<Process>> dataStepList = [
  InitializationStep(
    title: "HttpClient",
    initialize: (
      Process process,
    ) =>
        process.client = HttpClient$(
      config: process.config!,
    ),
  ),
  InitializationStep(
    title: "Api",
    initialize: (
      Process process,
    ) =>
        process.api = Api$(
      client: process.client!,
    ),
  ),
  InitializationStep(
    title: "Dao",
    initialize: (
      Process process,
    ) =>
        process.dao = Dao$(
      config: process.config!,
    ),
  ),
  InitializationStep(
    title: "Storage",
    initialize: (
      Process process,
    ) =>
        process.storage = Storage$(
      config: process.config!,
    ),
  ),
  InitializationStep(
    title: "Repository",
    initialize: (
      Process process,
    ) =>
        process.repository = Repository$(
      api: process.api!,
      dao: process.dao!,
      storage: process.storage!,
    ),
  ),
];

final List<InitializationStep<Process>> blocStepList = [
  InitializationStep(
    title: "Bloc",
    initialize: (
      Process process,
    ) =>
        process.bloc = Bloc(
      repository: process.repository!,
    ),
  ),
];
  1. 创建初始化器并启动初始化过程:
final DependencyInitializer initializer = DependencyInitializer<Process, Result>(
  createProcess: () => Process(),
  stepList: [
    ...coreStepList,
    ...dataStepList,
    ...blocStepList,
  ],
  onStart: (
    Completer<DependencyInitializationResult<Process, Result>> completer,
  ) =>
      stdout.write(
    "Initializer started",
  ),
  onStartStep: (
    DependencyInitializationStep<Process> step,
  ) =>
      stdout.write(
    "Step started: ${step.title}",
  ),
  onSuccessStep: (
    DependencyInitializationStep<Process> step,
    Duration duration,
  ) =>
      stdout.write(
    "Step finished: ${step.title} $duration",
  ),
  onSuccess: (
    DependencyInitializationResult<Process, Result> initializationResult,
    Duration duration,
  ) =>
      stdout.write(
    "Initializer finished: $duration",
  ),
  onError: (
    Object? error,
    StackTrace stackTrace,
    Process process,
    DependencyInitializationStep<Process> step,
    Duration duration,
  ) =>
      stdout.write(
    "Initializer error. Step: ${step.title} $duration Error: $error $stackTrace",
  ),
);
await initializer.run();

使用场景

  1. 直接使用 如果你想让Flutter应用在启动时显示一个原生启动屏幕,然后启动第一个小部件。
final DependencyInitializer initializer = DependencyInitializer<Process, Result>(
  createProcess: () => Process(),
  stepList: stepList,
  onSuccess: (
    DependencyInitializationResult<Process, Result> initializationResult,
    Duration duration,
  ) => runApp(
    ApplicationWidget(
      result: initializationResult.result,
    ),
  ),
  onError: (
    Object? error,
    StackTrace stackTrace,
    Process process,
    DependencyInitializationStep<Process> step,
    Duration duration,
  ) => runApp(
    const ApplicationErrorWidget(),
  ),
);
await initializer.run();
  1. 异步完成器 如果你有一个显示启动屏幕的小部件,并且这个小部件必须使用初始化编译器异步重建。
final DependencyInitializer initializer = DependencyInitializer<Process, Result>(
  createProcess: () => Process(),
  stepList: stepList,
  onStart: (
    Completer<DependencyInitializationResult<Process, Result>> completer,
  ) => runApp(
    ApplicationWidget(
      completer: completer,
    ),
  ),
  onError: (
    Object? error,
    StackTrace stackTrace,
    Process process,
    DependencyInitializationStep<Process> step,
    Duration duration,
  ) => runApp(
    const ApplicationErrorWidget(),
  ),
);
await initializer.run();
  1. 从结果重新初始化 如果在Flutter应用运行期间需要为新环境重新初始化新的依赖项,并返回Flutter应用的第一个小部件。
await initializationResult.reRun(
  stepList: [
    InitializationStep(
      title: "Config",
      initialize: (
        Process process,
      ) =>
          process.config = AnotherConfig(),
    ),
    ...initializationResult.reinitializationStepList,
  ],
  onSuccess: (
    DependencyInitializationResult<Process, Result> initializationResult,
    Duration duration,
  ) => runApp(
    ApplicationWidget(
      result: initializationResult.result,
    ),
  ),
  onError: (
    Object? error,
    StackTrace stackTrace,
    Process process,
    DependencyInitializationStep<Process> step,
    Duration duration,
  ) => runApp(
    const ApplicationErrorWidget(),
  ),
);

更多关于Flutter依赖初始化插件dependency_initializer的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter依赖初始化插件dependency_initializer的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


dependency_initializer 是一个用于 Flutter 项目的插件,它可以帮助开发者在项目中自动初始化依赖项。这个插件的主要目的是减少手动初始化的代码量,使得依赖项的管理更加简洁和高效。

安装 dependency_initializer

首先,你需要在 pubspec.yaml 文件中添加 dependency_initializer 依赖:

dependencies:
  dependency_initializer: ^1.0.0

然后运行 flutter pub get 来安装依赖。

使用 dependency_initializer

  1. 创建依赖项初始化类

    创建一个类来初始化你的依赖项。这个类需要继承自 DependencyInitializer

    import 'package:dependency_initializer/dependency_initializer.dart';
    
    class MyDependencyInitializer extends DependencyInitializer {
      @override
      Future<void> initialize() async {
        // 在这里初始化你的依赖项
        // 例如:
        // Get.put(MyService());
        // Get.lazyPut(() => AnotherService());
      }
    }
    
  2. main 函数中使用 dependency_initializer

    main 函数中,使用 DependencyInitializer.run 方法来运行你的依赖项初始化类。

    import 'package:flutter/material.dart';
    import 'package:dependency_initializer/dependency_initializer.dart';
    import 'my_dependency_initializer.dart'; // 引入你创建的初始化类
    
    void main() async {
      WidgetsFlutterBinding.ensureInitialized();
    
      // 初始化依赖项
      await DependencyInitializer.run(MyDependencyInitializer());
    
      runApp(MyApp());
    }
    
  3. 在你的应用中使用依赖项

    现在你可以在你的应用中使用这些依赖项了。例如,如果你使用了 GetItGetX 这样的依赖注入框架,你可以直接在需要的类中获取这些依赖项。

    import 'package:flutter/material.dart';
    import 'package:get/get.dart';
    
    class HomePage extends StatelessWidget {
      final MyService myService = Get.find<MyService>();
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text('Home Page'),
          ),
          body: Center(
            child: Text('Service initialized: ${myService.someValue}'),
          ),
        );
      }
    }
回到顶部