【问题标题】:Error using path_provider package in flutter在颤振中使用 path_provider 包时出错
【发布时间】:2021-08-13 22:34:52
【问题描述】:

我正在尝试使用颤振中的 path_provider 包获取应用程序文档目录。我正在使用 hive 数据库,所以我需要路径。

这是我的代码:

void main() async {
  final appDocsDir = await getApplicationDocumentsDirectory(); //error is on this line
  Hive.init(appDocsDir.path);
  runApp(MyApp());
}

我收到此错误:

E/flutter (18811): [ERROR:flutter/lib/ui/ui_dart_state.cc(199)] Unhandled Exception: Null check operator used on a null value
E/flutter (18811): #0      MethodChannel.binaryMessenger (package:flutter/src/services/platform_channel.dart:142:86)
E/flutter (18811): #1      MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:148:36)
E/flutter (18811): #2      MethodChannel.invokeMethod (package:flutter/src/services/platform_channel.dart:331:12)
E/flutter (18811): #3      MethodChannelPathProvider.getApplicationDocumentsPath (package:path_provider_platform_interface/src/method_channel_path_provider.dart:50:10)
E/flutter (18811): #4      getApplicationDocumentsDirectory (package:path_provider/path_provider.dart:138:40)
E/flutter (18811): #5      main (package:my_app/main.dart:9:28)
E/flutter (18811): #6      _runMainZoned.<anonymous closure>.<anonymous closure> (dart:ui/hooks.dart:142:25)
E/flutter (18811): #7      _rootRun (dart:async/zone.dart:1354:13)
E/flutter (18811): #8      _CustomZone.run (dart:async/zone.dart:1258:19)
E/flutter (18811): #9      _runZoned (dart:async/zone.dart:1789:10)
E/flutter (18811): #10     runZonedGuarded (dart:async/zone.dart:1777:12)
E/flutter (18811): #11     _runMainZoned.<anonymous closure> (dart:ui/hooks.dart:138:5)
E/flutter (18811): #12     _delayEntrypointInvocation.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:283:19)
E/flutter (18811): #13     _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:184:12)
E/flutter (18811): 

我正在通过 USB 连接的 android 设备上运行该应用程序(使用颤振运行)。我正在使用最新版本的颤振和软件包。

我该如何解决这个问题?

谢谢!

【问题讨论】:

  • 你可以在运行 runApp 之后尝试实现这个逻辑吗?可能在 MyApp Widget 的 initState 中
  • 无法在 initSate 中添加它,因为它说 initState 不应该是异步的。 (使用异步)

标签: android flutter dart


【解决方案1】:

我使用Hive.initFlutter() 解决了这个问题。代码如下:

import 'package:hive/hive.dart';
import 'package:hive_flutter/hive_flutter.dart';


void main() async {
  await Hive.initFlutter()
  runApp(MyApp());
}

【讨论】:

  • 用户在等待 Hive.initFlutter 完成时在 UI 中看到了什么?
  • 应用程序运行。 Hive..initFlutter() 不需要很长时间。
  • 是的,但是如果我等待一个可能需要大约 5 秒的任务呢?
  • 然后写入的数据在哪里。这将是特定于应用程序的目录、配置单元还是只是某个目录。在后一种情况下,加载时是否总是再次找到目录? path_provider 抛出这个错误真的很奇怪 - 我也在努力解决这个问题
  • @Adnan 你可以使用 FutureBuilder
【解决方案2】:

编辑:就我收到的 cmets 而言,这个答案似乎不是最好的方法。请参考@Pythony's answer

尝试在 MyApp Widget 的 initState 中进行这些调用。

像这样:

initDocs() async {
  final appDocsDir = await getApplicationDocumentsDirectory();
  Hive.init(appDocsDir.path);
}

@override
void initState() {
  initDocs();
  super.initState();
}

或:

@override
void initState() {
  getApplicationDocumentsDirectory().then((e)=>Hive.init(e.path));
  super.initState();
}

【讨论】:

  • 谢谢!有效!但是有一个错误。它说 hive 需要初始化,而且这个 - Accessing hidden method Lsun/misc/Unsafe;-&gt;getUnsafe()Lsun/misc/Unsafe; (greylist,core-platform-api, linking, allowed) 我认为 hive 只在 main 方法中检查初始化。
  • 当我使用第二种方法时,出现了错误。但是当我使用第一种方法时,错误会在一瞬间发生,然后应用程序会正常运行。
  • 当我打开一个盒子时会发生这种情况。
  • 好吧,我从来没有使用过hive,但是初始化可能需要几秒钟,所以你的主屏幕在初始化之前就尝试构建。作为一种解决方案,我建议使用 FutureBuilder 包装您的主屏幕,并正确等待配置单元初始化。这是一个示例应用程序:dartpad.dev/8261b41c81136230706c0cb666aceb42
  • 是的,我只使用了 FutureBuilder,如果快照有错误,则会显示错误屏幕。因此,错误屏幕会显示一秒钟,然后是正确的屏幕。根据日志,问题出在 path_provider 中。为什么它在 main() 中不起作用?
【解决方案3】:

试试这个简单的解决方案,你应该先写下面的代码:await getApplicationDocumentsDirectory();

  WidgetsFlutterBinding.ensureInitialized();

应该是这样的

 WidgetsFlutterBinding.ensureInitialized();
 final appDocsDir = await getApplicationDocumentsDirectory();

应该有帮助(至少对我有帮助)

【讨论】:

    猜你喜欢
    • 2022-01-12
    • 2022-06-14
    • 2021-11-07
    • 2017-10-21
    • 2020-08-25
    • 1970-01-01
    • 2020-11-21
    • 1970-01-01
    • 2021-09-26
    相关资源
    最近更新 更多