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
更多关于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
进行依赖注入
-
定义依赖项
首先,定义一个需要被注入的依赖项类。例如,一个简单的服务类:
class MyService { void doSomething() { print("MyService is doing something!"); } }
-
创建依赖项的作用域
使用
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(), ); } }
-
在Widget中使用依赖项
在需要使用依赖项的Widget中,可以通过
ScopeProvider
的consume
方法来获取: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中消费它们。