Flutter 安全存储错误 Null 检查运算符用于 null 值

Sau*_*tti 2 dart flutter flutter-futurebuilder

我正在尝试制作一个包含登录屏幕和主屏幕(目前只有两个屏幕)的 Flutter 应用程序。我也在使用 Flutter 安全存储和 Http 库。

\n

每当应用程序启动时,我希望应用程序检查两个属性(accessKey 和 accessId)是否存储在安全存储中。如果未找到 accessId,则会自动生成并使用 Uuid 库进行分配。而accessKey不是本地生成的,而是由API提供的。

\n

应用程序导航至:
\n1)。HomeScreen,如果 accessKey 存储在安全存储中并且身份验证成功。
\n2). SignInScreen,如果没有找到accessKey或者认证失败。

\n

我的问题是,每次执行读取操作时,安全存储都会抛出错误“对空值使用空检查运算符”。我已经初始化了存储变量,但这个问题仍然发生。

\n

这是我的安全存储类代码:

\n
import 'package:flutter_secure_storage/flutter_secure_storage.dart';\n\nclass FAS {\n  static FlutterSecureStorage? _storage;\n\n  static void init() {\n    _storage = const FlutterSecureStorage(\n      aOptions: AndroidOptions(encryptedSharedPreferences: true),\n    );\n  }\n\n  static Future<String?> read(String key) async {\n    return _storage!.read(key: key);\n  }\n\n  static Future<Map<String, String>> readAll() async {\n    return _storage!.readAll();\n  }\n\n  static Future<void> write(String key, String value) async {\n    await _storage!.write(key: key, value: value);\n  }\n\n  static Future<void> delete(String key) async {\n    await _storage!.delete(key: key);\n  }\n\n  static Future<void> deleteAll() async {\n    await _storage!.deleteAll();\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

之前,该代码的部分是这样的:

\n
static const FlutterSecureStorage _storage = FlutterSecureStorage(aOptions: AndroidOptions(encryptedSharedPreferences: true));\n
Run Code Online (Sandbox Code Playgroud)\n

没有 init 方法。

\n

但我不断收到同样的错误。

\n

这是我的 main.dart:

\n
import 'package:flutter/material.dart';\nimport 'package:unified_bot_app/pages/home_page.dart';\nimport 'package:uuid/uuid.dart';\n\nimport './models/fas.dart';\nimport './pages/sign_in_page.dart';\nimport './request_methods.dart';\n\nFuture<void> tryAssignAccessId() async {\n  String? accessId = await FAS.read("ACCESS_ID");\n  if (accessId == null) {\n    await FAS.write("ACCESS_ID", (const Uuid()).v4());\n  }\n}\n\nvoid main() {\n  FAS.init();\n  tryAssignAccessId(); // <- Error  \n\n  runApp(\n    MaterialApp(\n      home: FutureBuilder<bool>(\n        builder: (ctx, a) {\n          if (a.connectionState == ConnectionState.done) {\n            if (a.data!) return HomePage();\n            return const SignInPage();\n          }\n\n          return const Center(child: CircularProgressIndicator());\n        },\n        future: () async {\n          try {\n            String? accessKey = await FAS.read("ACCESS_KEY");\n            if (accessKey == null) {\n              return false;\n            }\n\n            return await HTTP.authenticate(accessKey);\n          } catch (e) {\n            return false;\n          }\n        }(),\n      ),\n      theme: ThemeData(fontFamily: "Josefin Sans"),\n    ),\n  );\n}  \n
Run Code Online (Sandbox Code Playgroud)\n

这是重新启动应用程序时得到的输出:

\n
\n

在 531 毫秒内重新启动应用程序。E/flutter (20760):
\n[错误:flutter/lib/ui/ui_dart_state.cc(209)] 未处理的异常: Null
\n在空值上使用检查运算符 E/flutter (20760): #0
\nMethodChannel.binaryMessenger
\npackage:flutter/\xe2\x80\xa6/services/platform_channel.dart:121 E/flutter
\n(20760): #1 MethodChannel._invokeMethod
\npackage:flutter/\xe2\x80\xa6/services/platform_channel.dart :146 E/flutter
\n(20760): #2 MethodChannel.invokeMethod
\npackage:flutter/\xe2\x80\xa6/services/platform_channel.dart:329 E/flutter
\n(20760): #3 MethodChannelFlutterSecureStorage.read
\ npackage:flutter_secure_storage_platform_interface/src/method_channel_flutter_secure_storage.dart:49
\nE/flutter (20760): #4 FlutterSecureStorage.read
\npackage:flutter_secure_storage/flutter_secure_storage.dart:91
\nE/flutter (20760): #5 FAS.read
\npackage: Unified_bot_app/models/fas.dart:13 E/flutter (20760): #6
\ntryAssignAccessId 包:unified_bot_app/main.dart:10 E/flutter
\n(20760): #7 主包:unified_bot_app/main.dart:18 E/flutter
\n(20760): #8 _runMainZoned..
\n(dart:ui/hooks.dart:145:25) E/flutter (20760): #9 _rootRun
\n(dart:async/zone.dart: 1428:13) E/flutter (20760): #10
\n_CustomZone.run (dart:async/zone.dart:1328:19) E/flutter (20760): #11 _runZoned (dart:async/zone.dart:1863 :10) E/flutter (20760): #12 runZonedGuarded (dart:async/zone.dart:1851:12) E/flutter (20760): #13
\n_runMainZoned。(dart:ui/hooks.dart:141:5) E/flutter (20760): #14 _delayEntrypointInvocation。
\n(dart:isolate-patch/isolate_patch.dart:283:19) E/flutter (20760): #15
\n_RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:184:12) E/flutter (20760) ):
\nD/EGL_emulation(20760): app_time_stats: avg=14143.50ms min=14143.50ms
\nmax=14143.50ms count=1

\n
\n

但是,当我将前两行放在最后时(在 runApp(..) 之后),错误消失了:

\n
void main() {\n  runApp(\n    MaterialApp(\n      home: FutureBuilder<bool>(\n        builder: (ctx, a) {\n          if (a.connectionState == ConnectionState.done) {\n            if (a.data!) return HomePage();\n            return const SignInPage();\n          }\n\n          return const Center(child: CircularProgressIndicator());\n        },\n        future: () async {\n          try {\n            String? accessKey = await FAS.read("ACCESS_KEY"); // <- Error re-appears here  \n            if (accessKey == null) {\n              return false;\n            }\n\n            return await HTTP.authenticate(accessKey);\n          } catch (e) {\n            return false;\n          }\n        }(),\n      ),\n      theme: ThemeData(fontFamily: "Josefin Sans"),\n    ),\n  );\n\n  FAS.init();\n  tryAssignAccessId();\n}  \n
Run Code Online (Sandbox Code Playgroud)\n

但这样做后,错误会重新出现在标记行上。

\n

我很困惑。发生了什么事?\n非常感谢您的帮助。

\n

编辑1
\n我尝试在调用第二个 read() 方法之前调用 init() 方法,但抛出了相同的错误。

\n

更新部分:

\n
future: () async {\n          try {\n            FAS.init();\n            String? accessKey = await FAS.read("ACCESS_KEY");\n            if (accessKey == null) {\n              return false;\n            }\n\n            return await HTTP.authenticate(accessKey);\n          } catch (e) {\n            print(e);\n            return false;\n          }\n        }(),  \n
Run Code Online (Sandbox Code Playgroud)\n

控制台输出:

\n
\n

510 毫秒内重新启动应用程序。I/flutter (20760): 空检查运算符
\n用于空值 D/EGL_emulation(20760): app_time_stats:
\navg=1899.03ms min=1899.03ms max=1899.03ms count=1

\n
\n

小智 9

我通过添加解决了这个问题

WidgetsFlutterBinding.ensureInitialized();
Run Code Online (Sandbox Code Playgroud)

runApp() 之前的 main() 方法。