空安全 AppLocalization 字符串的最佳方法

Ada*_*ths 5 internationalization dart flutter dart-null-safety

我正在使用AppLocalizations.of(context).myString我的 null 安全 flutter 应用程序来国际化字符串。

我的 IDE 告诉我AppLocalizations.of(context)可以返回 null。处理这个问题的最佳方法是什么?有没有办法确保AppLocalizations.of(context)永远不会返回空值?

目前,我采用以下方法:

AppLocalizations.of(context)?.myString ?? 'Fallback string'
Run Code Online (Sandbox Code Playgroud)

完整的项目代码

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

Run Code Online (Sandbox Code Playgroud)

l10n.yaml

arb-dir: lib/l10n
template-arb-file: app_en_US.arb
output-localization-file: app_localizations.dart
Run Code Online (Sandbox Code Playgroud)

l10n/app_en_US.arb

{
  "helloWorld": "Hello World!",
  "@helloWorld": {
    "description": "Greeting"
}
Run Code Online (Sandbox Code Playgroud)

l10n/app_en.arb

{
  "helloWorld": "Hello World!"
}
Run Code Online (Sandbox Code Playgroud)

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!'
      ),
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

小智 19

在 l10n.yaml 中添加以下行:

nullable-getter: false
Run Code Online (Sandbox Code Playgroud)


Mic*_*amm 6

如果您确定,这AppLocalizations.of(context)将始终返回一个有效的AppLocalizations实例(这对于您的示例应用程序来说是正确的),您可以使用:

AppLocalizations.of(context)!.myString
Run Code Online (Sandbox Code Playgroud)

!运算符告诉 Dart,它AppLocalizations.of(context)永远不会返回 ,其作用类似于从可为 null到非 nullable 的null强制转换。AppLocalizations?AppLocalizations

注意:如果在运行时AppLocalizations.of(context)返回null,则会AppLocalizations.of(context)!抛出异常。


小智 5

(我没有权限发表评论,所以我来回答)

添加键/值

nullable-getter: false
Run Code Online (Sandbox Code Playgroud)

l10n.yaml(位于项目的根目录)。

这将自动对 进行空检查AppLocalizations.of(context),允许程序员直接写入AppLocalizations.of(context).<key>而不是AppLocalizations.of(context)!.<key>.

来自Flutter 的文档

[no-]可空吸气剂

指定本地化类 getter 是否可为空。

默认情况下,此值为 true,以便 Localizations.of(context) 返回可为 null 的值以实现向后兼容性。如果该值为 false,则对 Localizations.of(context) 的返回值执行 null 检查,从而无需在用户代码中进行 null 检查。