空安全 AppLocalization 字符串的最佳方法 Pubspec.yamll10n.yamll10n/app_en_US.arbl10n/app_en.arbmain.dart

问题描述

问题

我正在使用 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 是空安全的,这应该可以解决您的问题。
以下是您可以使用的片段。

  1. 定义一个字符串扩展
// 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)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...