Dart/Flutter中如何将@factoryParam标注的参数设为可空类型?
@factoryParam 注解触发"Factory params must be nullable"报错解决
问题复现
在类中使用injectable包提供的@factoryParam注解时,运行build_runner生成配置文件会抛出错误:
Factory params must be nullable(工厂参数必须为可空类型)
复现代码如下:
import 'package:injectable/injectable.dart'; @injectable class QuoteRepository { const QuoteRepository( @factoryParam String env) : _env = env; final String _env; String getQuotes() { return _env; } }
完整报错信息指向代码第6行声明的env参数:
[SEVERE] injectable_generator:injectable_builder on features/testing_view_model.dart: Factory params must be nullable package:features/testing_view_model.dart:6:28 ╷ 6 │ @factoryParam String env) │ ^^^
报错原因
injectable生成带工厂参数的依赖注入代码时,@factoryParam标记的参数属于可选传参,在Dart空安全规则下,非空类型的可选参数要么声明为可空类型,要么提供默认值,否则不符合语法规范,因此生成器会直接抛出校验错误。
修复方法
两种方案二选一即可:
- 将被标记的参数改为可空类型,在类内部处理空值兜底逻辑
import 'package:injectable/injectable.dart'; @injectable class QuoteRepository { const QuoteRepository( @factoryParam String? env) : _env = env ?? 'default'; final String _env; String getQuotes() { return _env; } } - 给非空的工厂参数设置默认值,无需修改类型为可空
import 'package:injectable/injectable.dart'; @injectable class QuoteRepository { const QuoteRepository( @factoryParam this.env = 'production'); final String env; String getQuotes() { return env; } }
修改完成后重新执行生成命令即可正常编译:dart run build_runner build --delete-conflicting-outputs
内容的提问来源于stack exchange,提问作者Nikhil Bharadwaj
相关产品推荐
相关产品推荐

