[英]Problem with Dependency Injection and Get It in Flutter
我一直在学习依赖注入,现在我已经在 dart 中实现了一个示例。但是我遇到了 get_it package 的问题。这是代码:
'消息服务.dart'
abstract class MessageService {
void sendMessage(String msg, String rec);
}
class EmailServiceImpl implements MessageService {
@override
void sendMessage(String message, String receiver) {
//logic to send email
print("Email sent to $receiver with message $message.");
}
}
class SMSServiceImpl implements MessageService {
@override
void sendMessage(String message, String receiver) {
//logic to send SMS
print("SMS sent to $receiver with message $message.");
}
}
'injection_container.dart'
import 'package:get_it/get_it.dart';
import 'MessageService.dart';
import 'main.dart';
final getIt = GetIt.instance;
void init() async {
getIt.registerFactory<Client>(() => Client());
getIt.registerFactory<MyApplication>(() => MyApplication(EmailServiceImpl()));
getIt.registerFactory<MessageService>(() => EmailServiceImpl());
getIt.registerFactory<MessageService>(() => SMSServiceImpl());
}
'main.dart'
import 'MessageService.dart';
import 'injection_container.dart' as di;
void main() {
di.init();
di.getIt<Client>().send();
}
class MyApplication {
MessageService _service;
MyApplication(this._service);
void processMessages(String msg, String rec) {
//do some msg validation, manipulation logic etc
this._service.sendMessage(msg, rec);
}
}
class Client {
void send() {
MyApplication app = di.getIt<MyApplication>();
app.processMessages("Hi Bill", "bill@abc.com");
}
}
但是当在 injection_container.dart 中同时注册 EmailServiceImpl 和 SMSServiceImpl 时,它给我的错误是:Unhandled Exception: Invalid argument(s): Object/factory with type MessageService is already registered inside GetIt.
如果我注释掉 SMSServiceImpl registration 它工作正常。 有人可以说出什么问题吗? 如果有人可以查看我的依赖注入示例,那将会很有帮助。 这是呈现依赖注入的正确方式吗?
getIt.registerFactory<MessageService>(() => EmailServiceImpl()); getIt.registerFactory<MessageService>(() => SMSServiceImpl());
GetIt 只允许(默认情况下)一种类型的一个实例。
因此,您的代码试图注册同一类型 (MessageService) 的两个实例。 来自 GetIt 文档
您必须传递一个工厂 function 函数,该函数返回一个 T 实现的新实例。每次调用 get() 时,您都会返回一个新实例。
因此,当您调用 GetIt.I.get() 时,它不会知道它是 EmailServiceImpl 还是 SMSServiceImpl
试试这个
getIt.registerFactory<EmailServiceImpl>(() => EmailServiceImpl()); getIt.registerFactory<SMSServiceImpl>(() => SMSServiceImpl());
您还可以允许重新评估,以便您的代码按原样工作。
GetIt.I.allowReassignment = true
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.