我正在尝试学习依赖注入,并尝试在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()
带来错误。...由于它需要参数。
如何进行这种注射?
答案 0 :(得分:2)
您只需将想要的参数传递给MyClass()
。您不必在setUpLocator()
内部进行操作。当您知道要传递的参数时,可以在程序中的任何位置注册单例。
例如,如果您需要将用户对象注册为单例,则必须在用户登录并且其所有信息均可用之后再进行操作,以正确地实例化User
类。 / p>
答案 1 :(得分:0)
因为它是一个单例,所以您只需在应用程序中的任何位置调用一次seq
,它将随处更改。
示例应用程序:
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对象,以便您可以从静态变量中进行准备和获取。