问题描述
问题
我正在使用 AppLocalizations.of(context).myString
在我的空安全 Flutter 应用程序中国际化字符串。
我的 IDE 告诉我 AppLocalizations.of(context)
可以返回 null。处理这个问题的最佳方法是什么?有没有办法确保 AppLocalizations.of(context)
永远不会返回 null?
目前,我采用以下方法:
AppLocalizations.of(context)?.myString ?? 'Fallback string'
完整的项目代码
Pubspec.yaml
name: Sample Intl Project
description: A sample project
publish_to: 'none'
version: 1.0.0+1
environment:
sdk: ">=2.12.0-133.2.beta <3.0.0"
dependencies:
Flutter:
sdk: Flutter
Flutter_localizations:
sdk: Flutter
intl: ^0.17.0-nullsafety.2
dev_dependencies:
Flutter_test:
sdk: Flutter
Flutter:
uses-material-design: true
generate: true
l10n.yaml
arb-dir: lib/l10n
template-arb-file: app_en_US.arb
output-localization-file: app_localizations.dart
l10n/app_en_US.arb
{
"helloWorld": "Hello World!","@helloWorld": {
"description": "Greeting"
}
l10n/app_en.arb
{
"helloWorld": "Hello World!"
}
main.dart
import 'package:Flutter/material.dart';
import 'package:Flutter_gen/gen_l10n/app_localizations.dart';
void main() {
runApp(App());
}
class App extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Sample App',localizationsDelegates: AppLocalizations.localizationsDelegates,supportedLocales: AppLocalizations.supportedLocales,home: Home()
);
}
}
class Home extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Center(
child: Text(
AppLocalizations.of(context)?.helloWorld ?? 'Hello World!'
),);
}
}
解决方法
如果您确定,AppLocalizations.of(context)
将始终返回
一个有效的 AppLocalizations
实例(适用于您的示例应用程序),您可以使用:
AppLocalizations.of(context)!.myString
!
运算符告诉 Dart,AppLocalizations.of(context)
永远不会返回
null
并像从可以为空的 AppLocalizations?
到不可为空的 AppLocalizations
的强制转换一样。
注意:如果 AppLocalizations.of(context)
在运行时返回 null
,那么 AppLocalizations.of(context)!
将抛出异常。
正如在评论中所说,我会要求您尽可能分享更多代码、pubpsec、l10n.yaml 以及任何其他相关内容。
在那之前我的建议是将依赖项中的 intl 从最新更新为:
intl: ^0.17.0-nullsafety.2
我认为 nullsafety 不会留给最终开发人员,它很快就会成为标准而无需考虑。
,看起来,您的应用总是期望 string
文本的 AppLocalizations
值。
我建议确保 string
是空安全的,这应该可以解决您的问题。
以下是您可以使用的片段。
- 定义一个字符串扩展
// a string extension
extension MyStringExtentions on String {
String nullSafeStr() =>
(this == null || this.isEmpty || this == "null") ? "" : this;
}
// OR a static method
//static String nullSafeStr(String source) => (source == null || source.isEmpty || source == "null") ? "" : source;
现在您可以使用其中任何一个,请参阅使用新扩展的示例
// .nullSafeStr() becomes available wherever you import the extension method
AppLocalizations.of(context).helloWorld.nullSafeStr()
// the alternative way is to call the static method
.nullSafeStr(AppLocalizations.of(context).helloWorld);
,
我认为您需要使用 assert
来确保空值安全。这确保其中的变量不为空。更多信息 (assert dart dcumentation)