为什么 Riverpod 在项目中甚至无法初始化?找不到方法:'Error.throwWithStackTrace'

mon*_*oat 4 dart flutter riverpod

因此,我尝试开始使用 Riverpod 并使用“点击和计数器”默认示例创建一个新的 Flutter 项目。\n一旦我添加了 pubspec

\n
flutter_hooks: ^0.18.0\nhooks_riverpod: ^2.0.0\n
Run Code Online (Sandbox Code Playgroud)\n

\n
\n

导入'包:hooks_riverpod / hooks_riverpod.dart';

\n
\n

我在调试控制台上收到此错误,但无法找出问题所在

\n
: Error: Method not found: 'Error.throwWithStackTrace'.\n../\xe2\x80\xa6/framework/provider_base.dart:904\n  Error.throwWithStackTrace(error, chain);\n        ^^^^^^^^^^^^^^^^^^^\n: Error: A non-null value must be returned since the return type 'Never' doesn't allow null.\n../\xe2\x80\xa6/framework/provider_base.dart:898\nNever _rethrowProviderError(Object error, StackTrace stackTrace) {\n      ^\n
Run Code Online (Sandbox Code Playgroud)\n

Bak*_*ker 16

Error.throwWithStackTrace已在 Dart 2.16(2022 年 2 月 8 日起的 Flutter 版本 2.10)中添加。

https://api.flutter.dev/flutter/dart-core/Error/throwWithStackTrace.html

(检查@Since注释。)

如果您的 Flutter/Dart 版本低于该版本,您将收到您看到的错误。

可能有帮助的两个选项是:

  1. 指定依赖项的确切版本(不要使用^提前版本)
  2. 将 Flutter/Dart 至少升级到 2.10/2.16
flutter upgrade
Run Code Online (Sandbox Code Playgroud)

如果有问题的软件包(hooks_riverpod: ^2.0.0在您的情况下)列出了^,它将使用不会破坏依赖关系的最新版本

我猜测当您创建一个新项目并使用相同的依赖项版本时,最初pub get它会将包的较新版本(该包使用的依赖项的较新版本)下载到依赖于的“pub 缓存”中新的错误 API 方法。

您的项目将将此信息存储在:

<your_project_dir>/dart_tool/package_config.json
Run Code Online (Sandbox Code Playgroud)

min Dart SDK列出的软件包版本通常应从 2.12 更改为 2.16 。(更新:现已更新)这将给我们一个提示,如果我们发现构建失败,则需要更新 Flutter/Dart。

在这个答案的早期版本中,我注意到^包依赖项版本上的前缀应该可以防止这些类型的问题,但我不再确定它是否意味着涵盖底层平台需要更新的情况(如反对对包本身的 API 进行重大更改)。

不管怎样,乍一看,当包版本依赖于 2.0.0 发布时不存在的新核心 Dart API 方法时,从 2.0.0 升级到 3.0.0 可能是有意义的。

笔记

Riverpod 的作者还编写了新的 API,因此Error.throwWithStackTrace最新版本的 hooks_riverpod 可能正在使用最新的 API 更改。(您列出的版本 2.0.0 目前是预发布版本)。您可以在 pubspec.yaml 中尝试早期版本的 Riverpod(例如 1.0.3)