Flutter中的依赖注入
Dependency injection 是一种面向对象的技术,它将另一个对象的依赖关系发送给一个对象。使用依赖注入,我们也可以将依赖对象的创建和限制转移到类之外。这个概念带来了更大程度的适应性、解耦和更简单的测试。
provider package 将继承的Widgets包装在一个易于使用的包装器中。它使其易于管理和利用,它还包括一个状态管理机制,用于管理应用程序内的数据。
在这篇文章中,我们将学习如何实现依赖注入,摆脱Flutter包,以及为什么我们在Flutter应用中需要依赖注入。
Flutter中的依赖注入
尽管依赖注入是一个简单的例子,但经常使用库来从设计者那里抽象出它。许多这样的库都利用了反射(Dart中的镜像)的优势。然而,在flutter中存在一些问题。
- 镜像由于执行的原因而被削弱。
- 小部件的固定想法使得在树下的许多层传递条件变得不可行。
另一方面,注入库可以用来解决类似的问题。注入库使用的注解列举如下。
- @Injector- 一个由一堆模块开发出来的控制容器的倒置。
- @provides和@module- 定义提供依赖的类和方法。
- @component- 在执行注入时。
依赖性注入的功能
具体的类注入
具体的类注入可以如下所示。
//inject/inject.dart’ is an auto generated file that is imported
import ‘package:inject/inject.dart’;
//defining a class
@provide
class ExampleExa {
// implementation
}
接口注入
首先,创建一个带有某种实现的抽象类,然后在模块中提供依赖关系。抽象类。
abstract class NewExa{
}class OldExa implements NewExa {
@override
{
// implementation
}
}
之后,我们可以在我们的模块中添加依赖关系。最终的模块。
//inject/inject.dart’ is an auto generated file that is imported
import ‘package:inject/inject.dart’;
//defining the class
@module
class ExampleExa {
//providing dependencies
@provide
NewExa newExa() => OldExa();
}
提供者
假设我们不需要注入类的实例,而是需要一个提供者,在我们每次需要解决依赖关系时为我们提供一个新鲜的类的实例。我们可以使用一个函数来返回适当的实例并正确地进行注入,而不是在构造函数中获得一个具体的实例。我们可以定义一个帮助器,并如下图所示使用它。
typedef Provider<T> = T Function();
使用方法。
@provide
class NewWidget extends StatelessWidget {
final Provider<StepService> _service;
NewWidget(this._service);
void _someFunction() {
final service = _service();
// use service
}
}
辅助注入
由于注入只需要运行时争夺的对象没有隐含的好处,我们可以使用标准工厂。例如,创建一个工厂类,在构造函数中获取所有的编译时依赖,注入它,并给出一个工厂技术的运行时争用,这将是一个关键的案例。
我们现在需要构造一个注入器,使一切都能正常工作。
import ‘main.inject.dart’ as g;
@Injector(const [ExampleExa, NewExa])
abstract class Main {
@provide
NewApp get app;
static Future<Main> create(
ExampleExa exampleModule,
NewExa newModule,
) async {
return await g.Main$Injector.create(
exampleModule,
newModule,
);
}
}
在这个例子中,ExampleExa 和NewExa 已经被定义了,NewApp 是我们的根部件,而main.inject.dart 是 Flutter 自动创建的文件。因此,主要功能可能如下。
void main() async {
var container = await Main.create(
ExampleExa(),
NewExa(),
);
runApp(container.app);
}
我们建议使用build runner或watch命令来保持源代码在整个代码创建过程中的同步。
flutter pub run build_runner build
另外,也可以选择。
flutter pub run build_runner watch
代码将被保存在缓存文件夹中,而Flutter还不支持缓存。因此,在inject_generator.build.yaml 文件中必须包含以下文字。
builders:
inject_generator:
target: “:inject_generator”
import: “package:inject_generator/inject_generator.dart”
builder_factories:
— “summarizeBuilder”
— “generateBuilder”
build_extensions:
“.dart”:
— “.inject.summary”
— “.inject.dart”
auto_apply: dependents
build_to: source
我们现在可以运行构建运行器,它将生成所需的代码(如果有任何依赖关系无法解决,会有错误警告),然后像平常一样执行Flutter构建。
我们需要依赖性注入的原因
如前所述,Flutter中的依赖注入是一种面向对象的技术,将另一个对象的依赖关系发送到一个对象。依赖注入策略的目的是通过将使用与项目的形成隔离来消除这种依赖关系。
这减少了所需标准代码的措施,进一步发展了适应性。
如何去掉flutter包
- 运行
flutter clean。 - 删除pubspec.yaml中不需要的依赖关系。
- 删除pubspec.lock。
重新加载项目,再次执行'pub get'并运行该项目。
总结
依赖注入允许客户消除所有关于实际执行的信息。它允许我们做更多的适应性代码,并在不改变层的情况下改变一种执行方式。