Flutter依赖注入插件angel3_container的使用

Flutter依赖注入插件angel3_container的使用

Pub Version (包括预发布版本) 空安全 Discord 许可协议

Angel3 Container 是一个用于Angel3框架的更好的IoC容器,最终允许Angel3在有或没有dart:mirrors包的情况下使用。

import 'package:angel3_container/mirrors.dart';
import 'package:angel3_framework/angel3_framework.dart';
import 'package:angel3_framework/http.dart';

@Expose('/sales', middleware: [process1])
class SalesController extends Controller {
  @Expose('/', middleware: [process2])
  Future<String> route1(RequestContext req, ResponseContext res) async {
    return "Sales route";
  }
}

bool process1(RequestContext req, ResponseContext res) {
  res.write('Hello, ');
  return true;
}

bool process2(RequestContext req, ResponseContext res) {
  res.write('From Sales, ');
  return true;
}

void main() async {
  // 使用镜像反射器
  var app = Angel(reflector: MirrorsReflector());

  // 注册销售控制器
  app.container.registerSingleton<SalesController>(SalesController());
  await app.mountController<SalesController>();

  var http = AngelHttp(app);
  var server = await http.startServer('localhost', 3000);
  print("Angel3 server listening at ${http.uri}");
}

完整示例Demo

以下是一个完整的示例,展示了如何使用angel3_container插件进行依赖注入:

import 'dart:async';

import 'package:angel3_container/angel3_container.dart';
import 'package:angel3_container/mirrors.dart';

// 抽象类
abstract class Truck {
  void drive();
}

// 具体类
class Engine {
  final int horsePower;

  Engine(this.horsePower);
}

// 具体实现类
class _TruckImpl implements Truck {
  final Engine engine;

  _TruckImpl(this.engine);

  [@override](/user/override)
  void drive() {
    print('Vroom! I have ${engine.horsePower} horsepower in my engine.');
  }
}

Future<void> main() async {
  // 创建一个容器实例。
  var container = Container(const MirrorsReflector());

  // 注册一个单例。
  container.registerSingleton<Engine>(Engine(40));

  // 您也可以省略类型注解,此时将使用对象的运行时类型。如果您正在注入抽象类,请首选类型注解。
  // container.registerSingleton(Engine(40));

  // 注册一个工厂,该工厂创建一辆卡车。
  container.registerFactory<Truck>((container) {
    return _TruckImpl(container.make<Engine>());
  });

  // 使用`make`方法来创建一个实例。
  var truck = container.make<Truck>();

  // 您还可以异步解析注入。
  container.registerFactory<Future<int>>((_) async => 24);
  print(await container.makeAsync<int>());

  // 异步解析也适用于普通对象。
  await container.makeAsync<Truck>().then((t) => t.drive());

  // 注册一个命名的单例。
  container.registerNamedSingleton('the_truck', truck);

  // 应该打印:'Vroom! I have 40 horsepower in my engine.'
  truck.drive();

  // 应该打印相同的内容。
  container.findByName<Truck>('the_truck').drive();

  // 我们可以创建一个具有自己工厂的子容器。
  var childContainer = container.createChild();

  childContainer.registerFactory<Truck>((container) {
    return _TruckImpl(Engine(5666));
  });

  // 创建一个拥有5666马力的卡车。
  childContainer.make<Truck>().drive();

  // 然而,调用`make<Engine>`将返回我们上面创建的引擎单例。
  print(childContainer.make<Engine>().horsePower);
}

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

1 回复

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


当然,以下是如何在Flutter项目中使用angel3_container进行依赖注入的一个示例。angel3_container是一个灵活的服务容器,适用于Dart和Flutter应用。它允许你注册和管理依赖关系,从而简化组件之间的通信。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  angel3_container: ^4.0.0  # 请确保使用最新版本

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

2. 创建容器并注册服务

接下来,你需要创建一个容器并注册一些服务。通常在Flutter应用中,你会在应用启动时(例如在main.dart文件中)进行这些操作。

import 'package:flutter/material.dart';
import 'package:angel3_container/angel3_container.dart';

void main() {
  // 创建一个新的容器
  final Container container = Container();

  // 注册服务,例如一个简单的数据服务
  container.registerSingleton<DataService>(() => DataService());

  // 使用容器创建MyApp实例(注意:MyApp构造函数需要接受一个Container实例)
  final MyApp app = MyApp(container: container);

  runApp(app);
}

class DataService {
  String getData() {
    return 'Hello from DataService!';
  }
}

class MyApp extends StatelessWidget {
  final Container container;

  MyApp({required this.container});

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

3. 在组件中使用服务

现在,你可以在任何需要服务的组件中通过容器获取服务。例如,在MyHomePage中:

import 'package:flutter/material.dart';
import 'package:angel3_container/angel3_container.dart';

class MyHomePage extends StatefulWidget {
  final Container container;

  MyHomePage({required this.container});

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

class _MyHomePageState extends State<MyHomePage> {
  late DataService _dataService;

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Demo Home Page'),
      ),
      body: Center(
        child: Text(
          _dataService.getData(),
        ),
      ),
    );
  }
}

4. 运行应用

现在你可以运行你的Flutter应用,应该能够在屏幕上看到从DataService返回的数据。

总结

通过上述步骤,你已经在Flutter项目中成功集成了angel3_container,并实现了基本的依赖注入。你可以根据需要注册更多的服务,并在应用的各个部分中使用它们。这种方法有助于保持代码的组织性和可测试性。

回到顶部