Flutter依赖注入插件dependency_injection_flutter的使用

Flutter依赖注入插件dependency_injection_flutter的使用

Flutter Brazil

Pub style: effective dart GitHub stars

注入

注入单例

单例实例将是唯一的。每次尝试获取时,注入器将返回相同的实例。

Injector.instance.inject<MyInstanceType>(()=>MyInstance());

默认情况下,通过inject方法进行的所有注入都将具有单例类型,但您可以使用类型参数更改它。

懒加载单例

懒加载单例仅在从注入器调用时才会实例化一次。这有助于节省内存。

Injector.instance.inject<MyInstanceType>(()=>MyInstance(), type: InjectionType.lazySingleton);

注入工厂

工厂类型将始终返回一个全新的实例。这可以用于例如获取服务。

Injector.instance.inject<MyInstanceType>(()=>MyInstance(), type: InjectionType.factory);

获取所有实例

var myInstance = Injector.instance.get<MyInstanceType>();

在小部件中获取控制器

class MyView extends StatelessWidget with InjectionMixin<MyController> {
  void doSomething() {
    controller.onDoSomething();
  }

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

使用注入器进行测试

Injector的一大优点是提供了一种简单的方式来测试您的代码。

在您的类测试中,在setUpAll体内使用:

Injector injector;

setUpAll(() {
  injector = Injector.instance;
  
  injector.inject<MyServiceInterface>(()=> MyMockedService());
});

test("Testing the get all", () {
  // 由于您注入了MyServiceInterface,
  // 它将返回一个MyServiceInterface类型的类,
  // 但使用的是MyMockedService实现。
  var myService = injector.get<MyServiceInterface>();
  
  // 正如您在真正的MyServiceImpl中所做的那样
  var result = myService.getAll();
});

示例代码

import 'package:dependency_injection_flutter/dependency_injection_flutter.dart';
import 'package:example/src/ui/home/controller/home_controller.dart';
import 'package:flutter/material.dart';

import 'src/ui/home/home_page.dart';

void main() {
  var homeController = HomeController();
  homeController.increment();

  // 注入HomeController实例
  Injector.instance.inject<HomeController>(() => homeController);

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: HomePage(),
    );
  }
}

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

1 回复

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


当然,下面是一个关于如何使用 dependency_injection_flutter 插件进行依赖注入的示例代码。这个插件允许你在 Flutter 应用中轻松管理依赖项。

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

dependencies:
  flutter:
    sdk: flutter
  dependency_injection_flutter: ^x.y.z  # 请替换为最新版本号

然后,运行 flutter pub get 来获取依赖项。

接下来,让我们创建一个简单的示例,展示如何使用这个插件。

1. 定义服务接口和实现

首先,定义一个服务接口及其实现。例如,我们定义一个简单的 UserService 接口:

// user_service.dart
abstract class UserService {
  Future<String> getUserData();
}

class UserServiceImpl implements UserService {
  @override
  Future<String> getUserData() async {
    // 模拟网络请求
    await Future.delayed(Duration(seconds: 1));
    return "User Data";
  }
}

2. 配置依赖注入容器

接下来,配置依赖注入容器,将服务注册到容器中。这通常在应用的入口文件(如 main.dart)中进行:

// main.dart
import 'package:flutter/material.dart';
import 'package:dependency_injection_flutter/dependency_injection_flutter.dart';
import 'user_service.dart';

void main() {
  // 配置依赖注入容器
  final container = DIContainer();
  container.registerSingleton<UserService>(() => UserServiceImpl());

  // 使用容器获取依赖并运行应用
  runApp(MyApp(container: container));
}

class MyApp extends StatelessWidget {
  final DIContainer container;

  MyApp({required this.container});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomePage(container: container),
    );
  }
}

3. 在组件中使用依赖注入

现在,我们可以在组件中使用依赖注入来获取所需的服务。例如,在 HomePage 中使用 UserService

// home_page.dart
import 'package:flutter/material.dart';
import 'package:dependency_injection_flutter/dependency_injection_flutter.dart';
import 'user_service.dart';

class HomePage extends StatefulWidget {
  final DIContainer container;

  HomePage({required this.container});

  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  late UserService userService;

  @override
  void initState() {
    super.initState();
    // 从容器中获取 UserService 实例
    userService = widget.container.resolve<UserService>();
    fetchUserData();
  }

  void fetchUserData() async {
    final userData = await userService.getUserData();
    // 在这里处理获取到的用户数据
    print(userData);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Dependency Injection Example'),
      ),
      body: Center(
        child: Text('Fetching user data...'),
      ),
    );
  }
}

总结

以上代码展示了如何在 Flutter 应用中使用 dependency_injection_flutter 插件进行依赖注入。首先,我们定义了服务和其实现,然后在应用的入口文件中配置了依赖注入容器,并在组件中通过容器获取所需的服务实例。

这种方法有助于减少组件之间的直接依赖,提高代码的可测试性和可维护性。

回到顶部