“抽屉”中的 Flutter 本地化会导致“空值检查运算符使用空值”错误

Dar*_*ght 8 dart flutter dart-null-safety

在首次使用Dart/Flutter时,我创建了一个非常简单的演示应用程序,其中包含Drawer. 该应用程序在Android 模拟器中编译并启动,但不久后就中止并显示错误消息Null check operator used on a null value。在 之外Drawer,本地化工作完美无缺。

\n

我到底做错了什么以及如何解决?

\n

版本:

\n
Flutter 2.2.0 \xe2\x80\xa2 channel stable \xe2\x80\xa2 https://github.com/flutter/flutter.git\nFramework \xe2\x80\xa2 revision b22742018b (12 days ago) \xe2\x80\xa2 2021-05-14 19:12:57 -0700\nEngine \xe2\x80\xa2 revision a9d88a4d18\nTools \xe2\x80\xa2 Dart 2.13.0\n
Run Code Online (Sandbox Code Playgroud)\n

GitHub 上提供了该应用程序的完整源代码:https://github.com/DarkPurpleKnight/null_issue

\n

主要.dart:

\n
import \'package:flutter/material.dart\';\nimport \'package:flutter_localizations/flutter_localizations.dart\';\nimport \'package:flutter_gen/gen_l10n/app_localizations.dart\';\n\n\nvoid main() {\n  runApp(NullIssueApp());\n}\n\nclass NullIssueApp extends StatelessWidget {\n  @override\n  Widget build(BuildContext context) {\n    return MaterialApp(\n      title: \'Null issue\',\n      localizationsDelegates: [\n        AppLocalizations.delegate,\n        GlobalMaterialLocalizations.delegate,\n        GlobalWidgetsLocalizations.delegate,\n        GlobalCupertinoLocalizations.delegate,\n      ],\n      supportedLocales: [\n        const Locale(\'en\', \'\'),\n        const Locale(\'de\', \'\'),\n      ],\n      home: Scaffold(\n        drawer: Drawer(\n          child: Row(\n            children: [Text(AppLocalizations.of(context)!.helloWorld)],\n          ),\n        ),\n      ),\n    );\n  }\n}\n\n
Run Code Online (Sandbox Code Playgroud)\n

日志:

\n
Launching lib/main.dart on sdk gphone x86 in debug mode...\nRunning Gradle task \'assembleDebug\'...\n\xe2\x9c\x93  Built build/app/outputs/flutter-apk/app-debug.apk.\nDebug service listening on ws://127.0.0.1:40233/5JFMCufV37s=/ws\nSyncing files to device sdk gphone x86...\nD/skia    (20273):    1 Shader compilation error\nD/skia    (20273):    2 ------------------------\nD/skia    (20273):    3 Errors:\nD/skia    (20273):    4 \nD/skia    (20273):    1 Shader compilation error\nD/skia    (20273):    2 ------------------------\nD/skia    (20273):    3 Errors:\nD/skia    (20273):    4 \nD/skia    (20273):    1 Shader compilation error\nD/skia    (20273):    2 ------------------------\nD/skia    (20273):    3 Errors:\nD/skia    (20273):    4 \nD/skia    (20273):    1 Shader compilation error\nD/skia    (20273):    2 ------------------------\nD/skia    (20273):    3 Errors:\nD/skia    (20273):    4 \nD/skia    (20273):    1 Shader compilation error\nD/skia    (20273):    2 ------------------------\nD/skia    (20273):    3 Errors:\nD/skia    (20273):    4 \nD/skia    (20273):    1 Shader compilation error\nD/skia    (20273):    2 ------------------------\nD/skia    (20273):    3 Errors:\nD/skia    (20273):    4 \nD/skia    (20273):    1 Shader compilation error\nD/skia    (20273):    2 ------------------------\nD/skia    (20273):    3 Errors:\nD/skia    (20273):    4 \nD/skia    (20273):    1 Shader compilation error\nD/skia    (20273):    2 ------------------------\nD/skia    (20273):    3 Errors:\nD/skia    (20273):    4 \nD/skia    (20273):    1 Shader compilation error\nD/skia    (20273):    2 ------------------------\nD/skia    (20273):    3 Errors:\nD/skia    (20273):    4 \nD/skia    (20273):    1 Shader compilation error\nD/skia    (20273):    2 ------------------------\nD/skia    (20273):    3 Errors:\nD/skia    (20273):    4 \nD/skia    (20273):    1 Shader compilation error\nD/skia    (20273):    2 ------------------------\nD/skia    (20273):    3 Errors:\nD/skia    (20273):    4 \nD/skia    (20273):    1 Shader compilation error\nD/skia    (20273):    2 ------------------------\nD/skia    (20273):    3 Errors:\nD/skia    (20273):    4 \nD/skia    (20273):    1 Shader compilation error\nD/skia    (20273):    2 ------------------------\nD/skia    (20273):    3 Errors:\nD/skia    (20273):    4 \nD/skia    (20273):    1 Shader compilation error\nD/skia    (20273):    2 ------------------------\nD/skia    (20273):    3 Errors:\nD/skia    (20273):    4 \n\n======== Exception caught by widgets library =======================================================\nThe following _CastError was thrown building NullIssueApp(dirty):\nNull check operator used on a null value\n\nThe relevant error-causing widget was: \n  NullIssueApp file:///home/dpk/source/Android/null_issue/lib/main.dart:7:10\nWhen the exception was thrown, this was the stack: \n#0      NullIssueApp.build (package:percent_clock/main.dart:28:57)\n#1      StatelessElement.build (package:flutter/src/widgets/framework.dart:4648:28)\n#2      ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4574:15)\n#3      Element.rebuild (package:flutter/src/widgets/framework.dart:4267:5)\n#4      ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4553:5)\n...\n====================================================================================================\nD/skia    (20273):    1 Shader compilation error\nD/skia    (20273):    2 ------------------------\nD/skia    (20273):    3 Errors:\nD/skia    (20273):    4 \n\n
Run Code Online (Sandbox Code Playgroud)\n

Gui*_*oux 8

这是因为此时您的应用程序AppLocalization尚未完全初始化,因此AppLocalizations.of(context)返回一个null值,当您使用 null 检查运算符时会导致崩溃!

您需要将您的部件包装Scaffold在一个小部件中,以便在这个新部件中contextAppLocalization准备就绪。

这是我的代码示例,效果很好:

class NullIssueApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Null issue',
      localizationsDelegates: [
        AppLocalizations.delegate,
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
        GlobalCupertinoLocalizations.delegate,
      ],
      supportedLocales: [
        const Locale('en', ''),
        const Locale('de', ''),
      ],
      home: HomePage(),
    );
  }
}

class HomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
      drawer: Drawer(
        child: Row(
          children: [Text(AppLocalizations.of(context)!.helloWorld)],
        ),
      ),
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

截屏

在此输入图像描述