带参数的类的 Dart 依赖注入

问题描述 投票:0回答:5

我正在尝试了解依赖注入并尝试在

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()
上产生错误....因为它需要一个参数。

如何进行这种注射?.

flutter dart dependency-injection
5个回答
3
投票

你只需传递你想要的论点即可

MyClass()
。您不必在内部进行
setUpLocator()
。当您知道要传递什么参数时,可以在程序中的任何位置注册单例。

例如,如果您需要将用户对象注册为单例,则必须在用户登录并且其所有信息可用后执行此操作,以便正确实例化您的

User
类。


2
投票

因为它是单例,所以您只需在应用程序中的任何位置调用

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>()
被调用后构建,这样你就可以准备并从静态变量中获取它。


0
投票

将字符串传递到类的构造函数中没有问题。您只需要访问要传递到

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);
}

在这里领取包裹

此打印

鲍勃


0
投票
您可以为 MyClass 类添加默认参数,如下所示:

void setupLocator() { locator.registerLazySingleton<MyClass>(() => MyClass("Default Name")); }
当请求 MyClass 的实例时,您的默认参数(“默认名称”)将被该实例参数覆盖。
希望您理解...


0
投票
你必须使用registerFactoryParam

只有一个参数:

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);
    
© www.soinside.com 2019 - 2024. All rights reserved.