我正在尝试了解依赖注入并尝试在
Flutter/Dart
中使用它。我浏览过图书馆get_it
,我发现它非常有用。
但是我对特定情况下的依赖注入有疑问。
如果我有一个 Dart 类,其参数如下:
class MyClass(){
final String name;
MyClass({this.name})
....
....
}
在这样的类中,带参数,好像不能使用依赖注入?或者至少以下使用
get_it
不起作用:
**** service_locator.dart ****
import 'package:get_it/get_it.dart';
GetIt locator = GetIt();
void setupLocator() {
locator.registerLazySingleton<MyClass>(() => MyClass());
}
这会在
=> MyClass()
上产生错误....因为它需要一个参数。
如何进行这种注射?.
你只需传递你想要的论点即可
MyClass()
。您不必在内部进行setUpLocator()
。当您知道要传递什么参数时,可以在程序中的任何位置注册单例。
例如,如果您需要将用户对象注册为单例,则必须在用户登录并且其所有信息可用后执行此操作,以便正确实例化您的
User
类。
因为它是单例,所以您只需在应用程序中的任何位置调用
myClass.name = 'name'
一次,它就会在任何地方发生变化。
示例应用程序:
class _MyHomePageState extends State<MyHomePage> {
@override
void initState() {
super.initState();
GetIt.instance.registerLazySingleton<MyClass>(()=> MyClass());
// Name from a future
get('https://jsonplaceholder.typicode.com/users').then((response){
if(response.statusCode==200) {
setState(() {
GetIt.I.get<MyClass>().name = jsonDecode(response.body)[0]['name'];
});
}
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Title'),
),
body: Container(
child: Center(
child: Text(GetIt.I.get<MyClass>().name),
),
),
);
}
}
class MyClass{
String name = '';
}
另一种方法是,因为它是使用惰性构建器构建的,所以 MyClass 对象只会在第一个
locator.get<MyClass>()
被调用后构建,这样你就可以准备并从静态变量中获取它。
将字符串传递到类的构造函数中没有问题。您只需要访问要传递到
MyClass
构造函数的值。一种方法是从另一个依赖项获取值。在此示例中,您可以从 AppOptions
获取它。
import 'package:ioc_container/ioc_container.dart';
class MyClass {
final String name;
MyClass({required this.name});
}
class AppOptions {
String get myClassName => 'Bob';
}
void main(List<String> arguments) {
final builder = IocContainerBuilder()
..addSingletonService<AppOptions>(AppOptions())
..addSingleton(
(container) => MyClass(name: container<AppOptions>().myClassName));
final container = builder.toContainer();
final myClass = container<MyClass>();
print(myClass.name);
}
此打印
鲍勃
void setupLocator() {
locator.registerLazySingleton<MyClass>(() => MyClass("Default Name"));
}
当请求 MyClass 的实例时,您的默认参数(“默认名称”)将被该实例参数覆盖。
希望您理解...
只有一个参数:
MyClass({
super.key,
this.color,
});
Color color;
}
注册
GetIt.instance.registerFactoryParam<MyClass, Color, void>(
(c, _) => MyClass(color: c));
用途:
final myColor= GetIt.instance<IProgessIndicator>(param1: Colors.white);