Flutter依赖注入插件scope_injector的使用

Flutter依赖注入插件scope_injector的使用

特性

  • ✅ 作用域系统
  • ✅ 定义符系统
  • ✅ 模块系统
  • ✅ 非单例依赖的工厂系统
  • ✅ 依赖反转原则

开始使用

安装

在你的 pubspec.yaml 文件中添加以下依赖:

dependencies:
  scope_injector: ^1.0.1

使用

首先,需要创建一个继承自 Module 的类,并重写 onProvide 方法。在该方法内部,可以使用 provide 方法来注册你的依赖。

class RepositoryDiModule extends Module {
  RepositoryDiModule(super.scopedState);

  [@override](/user/override)
  void onProvide() {
    provide<ProjectRepository>(() => ProjectRepositoryImp(inject()));
    provide<UserRepository>(() => UserRepositoryImp(inject(), inject()));

    // 使用定义符提供依赖
    provide<PaymentRepository>(() => PaymentRepositoryImpA(inject()), qualifier: 'payment.a');
    provide<PaymentRepository>(() => PaymentRepositoryImpB(inject()), qualifier: 'payment.b');

    // 提供非单例依赖,默认情况下所有依赖都是单例
    provide<PaymentService>(() => PaymentServiceImp(inject()), singleton: false);
  }
}

接下来,你需要创建一个继承自 ScopedState 的状态类,并重写 getModules 方法。通过使用 inject 方法来注入你的依赖。

class ScopedWidget extends StatefulWidget {
  const ScopedWidget({Key? key}) : super(key: key);

  [@override](/user/override)
  State<ScopedWidget> createState() => _ScopedWidgetState();
}

class _ScopedWidgetState extends ScopedState<ScopedWidget> {

  // 在这里注入你的依赖
  late final ProjectRepository projectRepository = inject();
  late final UserRepository userRepository = inject();
  late final PaymentRepository paymentRepository = inject(qualifier: 'payment.a');

  [@override](/user/override)
  Widget build(BuildContext context) {
    return const Placeholder();
  }

  // 初始化模块
  [@override](/user/override)
  List<Module> getModules() => [RepositoryDiModule(this)];
}

最后,你可以在任何地方使用 inject 方法来获取你的依赖。

class ChildWidget extends StatefulWidget {
  const ChildWidget({Key? key}) : super(key: key);

  [@override](/user/override)
  State<ChildWidget> createState() => _ChildWidgetState();
}

class _ChildWidgetState extends State<ChildWidget> {

  // 在这里注入你的依赖
  late final ProjectRepository projectRepository = inject();

  [@override](/user/override)
  Widget build(BuildContext context) {
    return const Placeholder();
  }
}

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

1 回复

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


当然,下面是一个关于如何使用Flutter依赖注入插件scope_injector的代码案例。scope_injector是一个用于在Flutter应用中实现依赖注入的库,它允许你创建和管理依赖项的作用域。

首先,确保你已经在pubspec.yaml文件中添加了scope_injector依赖:

dependencies:
  flutter:
    sdk: flutter
  scope_injector: ^latest_version  # 请替换为最新版本号

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

使用scope_injector进行依赖注入

  1. 定义依赖项

    首先,定义一个需要被注入的依赖项类。例如,一个简单的服务类:

    class MyService {
      void doSomething() {
        print("MyService is doing something!");
      }
    }
    
  2. 创建依赖项的作用域

    使用Scope来创建和管理依赖项的作用域。可以在应用的主要入口点(例如main.dart)中设置:

    import 'package:flutter/material.dart';
    import 'package:scope_injector/scope_injector.dart';
    import 'my_service.dart';  // 假设MyService类在这个文件中
    
    void main() {
      // 创建一个全局的Scope实例
      final scope = Scope();
    
      // 注册依赖项到Scope中
      scope.register<MyService>(() => MyService());
    
      runApp(
        ScopeProvider(
          scope: scope,
          child: MyApp(),
        ),
      );
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Flutter Demo',
          theme: ThemeData(
            primarySwatch: Colors.blue,
          ),
          home: MyHomePage(),
        );
      }
    }
    
  3. 在Widget中使用依赖项

    在需要使用依赖项的Widget中,可以通过ScopeProviderconsume方法来获取:

    import 'package:flutter/material.dart';
    import 'package:scope_injector/scope_injector.dart';
    
    class MyHomePage extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text('Flutter Demo Home Page'),
          ),
          body: Center(
            child: ElevatedButton(
              onPressed: () {
                // 使用consume方法从Scope中获取MyService实例
                final myService = consume<MyService>(context);
                myService.doSomething();
              },
              child: Text('Use MyService'),
            ),
          ),
        );
      }
    }
    

完整代码示例

下面是完整的代码示例,包括所有必要的文件:

pubspec.yaml

name: flutter_demo
description: A new Flutter project.

publish_to: 'none' # Remove this line if you wish to publish to pub.dev

version: 1.0.0+1

environment:
  sdk: ">=2.12.0 <3.0.0"

dependencies:
  flutter:
    sdk: flutter
  scope_injector: ^latest_version  # 请替换为最新版本号

dev_dependencies:
  flutter_test:
    sdk: flutter

flutter:
  uses-material-design: true

lib/main.dart

import 'package:flutter/material.dart';
import 'package:scope_injector/scope_injector.dart';
import 'my_service.dart';

void main() {
  final scope = Scope();
  scope.register<MyService>(() => MyService());

  runApp(
    ScopeProvider(
      scope: scope,
      child: MyApp(),
    ),
  );
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Demo Home Page'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            final myService = consume<MyService>(context);
            myService.doSomething();
          },
          child: Text('Use MyService'),
        ),
      ),
    );
  }
}

lib/my_service.dart

class MyService {
  void doSomething() {
    print("MyService is doing something!");
  }
}

这个示例展示了如何使用scope_injector进行简单的依赖注入。在实际应用中,你可以根据需要注册更多的依赖项,并在不同的Widget中消费它们。

回到顶部