7

问题

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

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

目前,我正在采用以下方法:

AppLocalizations.of(context)?.myString ?? 'Fallback string'

完整的项目代码

发布规范.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!"
}

主要.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!'
      ),
    );
  }
}
4

4 回答 4

5

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

AppLocalizations.of(context)!.myString

!运算符告诉 Dart,它永远AppLocalizations.of(context)不会返回 null,并且就像从 nullableAppLocalizations?到 non-nullable 的强制转换AppLocalizations

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

于 2021-01-26T14:27:23.957 回答
2

在 l10n.yaml 中添加这一行:

nullable-getter: false
于 2022-01-17T14:06:38.890 回答
0

看起来,您的应用程序总是期望stringAppLocalizations文本中获得价值。
我建议确保stringnull 安全,这应该可以解决您的问题。
这是您可以使用的片段。

  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);  
于 2021-01-17T10:53:56.833 回答
0

正如评论中所说,我会要求您尽可能多地分享您的代码、您的 pubpsec、您的 l10n.yaml 以及其他任何相关的内容。

在此之前我的建议是将依赖项中的 intl 从最新更新为:

intl: ^0.17.0-nullsafety.2

我认为 nullsafety 不会留给最终的开发人员,它很快就会成为标准,而不必考虑它。

于 2021-01-15T10:36:41.773 回答