Flutter 报错总结

  • github 上 clone 下来的项目报错/找不到文件?
    1、仓库 clone 下来后我们执行flutter run Terminal 中提示我们 Target file "lib/main.dart" not found.这时我们要判断打开示例项目的路径对不对,对带有示例的仓库,我们如果要打开演示示例,需要用 vscode打开示例所在的文件夹,一般是 example 文件夹
    2、在我们使用正确的路径打开项目后,有很多报错导入的文件找不到,这个时候我们需要在 Terminal 中 执行以下flutter pub get 命令,执行完导入的一些库就能够找到了

  • Terminal 中提示 [!] Your app isn't using AndroidX.
    这种情况需要我们在 android/gradle.properties文件中设置

android.enableJetifier=true
android.useAndroidX=true

gradle 版本不对

  • Terminal 中报错 Minimum supported Gradle version is 5.4.1. Current version is 4.10.2. If using the gradle wrapper, try editing the distributionUrl in /Users/zhangjiwen/Desktop/flutter_k_chart/example/android/gradle/wrapper/gradle-wrapper.properties to gradle-5.4.1-all.zip
    解决办法是:我们在android/gradle/wrapper/gradle-wrapper.properties中将distributionUrl中的 gradle zip 包改成我们需要的版本。
    例如:没改之前是distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip 修改后: distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip
  • Terminal 中报Exception in thread "main" java.util.zip.ZipException: zip END header not found
    这个错也是 gradle版本不对造成的,将 android -> gradle -> wrapper -> gradlewrapper.properties文件中的 distributionUrl=https://services.gradle.org/distributions/gradle-4.10.2-all.zip中的 gradle-4.10.2-all.zip 改为与 Flutter 对应的版本既可

NoSuchMethodError 总结

  • NoSuchMethodError: The method '***' was called on null
    在新增 Provider 状态管理之后,我们需要执行flutter run ,如果使用热重载的话Termianl中就会报上面的错误
  • NoSuchMethodError: The method '/' was called on null
    尽管在某些页面设置过了 ScreenUtil.instance 但是切换都某些页面的时候还是报了这个错,这就需要我们在报错的页面也设置一下ScreenUtil.instance

Flutter 模拟器 加载网络资源加载不出来的问题

  • 需要我们在 DNS 上新加一个 8.8.8.8

Container 不能同时设置color和 decoration,同时设置会报错Cannot provide both a color and a decoration ,the color argument is just a shorthand for 'decoration: new BoxDecotation(color: color)'

模拟器加载不出来网络图片

  • 模拟器加载不出来网络图片的表现就是网络图片不显示,页面点击没反应,这个时候我们需要新增一个DNS: 8.8.8.8 就好了

网络请求的错误

  • 在使用dio进行网络请求的时候出现 FormatException: Unexpected character (at character 1) 报错,因为dio请求返回的数据默认是以json的格式读取的,而返回的数据是密文形式,需要根据接口设置设置dio.options.responseType,这里设置为dio.options.responseType = ResponseType.plain;就好了

数据解析错误

  • Exception has occurred. _TypeError (type 'List' is not a subtype of type 'Map') 这里提示我们接口返回给我们一个list,但我们以Map去处理了

使用 Provider 报 Tried to listen to a value exposed with provider, from outside of the widget tree

在使用Provider提供的 Provider.of<*****>(context,listen: false).xxxxxxx(); 获取共享对象时,listen 参数一定要使用false,否则就会报上面的错误,如果这里不适用。该方法的listen参数默认是true; static T of(BuildContext context, {bool listen = true})

这里需要注意的是:在我们使用Provider.of修改值的时候listen参数需要设置为false;当我们使用Provider.of获取值的时候listen参数需要设置为truelisten参数到底是使用true还是使用false取决与,当取的值变化的时候控件要不要更新。

VSCode 运行flutter项目报Building for iOS Simulator, but the linked and embedded framework 'App.framework' 的错

  • 使用xcode 打开flutter 下的iOS项目找到App.framework 删除,清理缓存,重新用xcode编译就行了

调用Cupertino样式警告框报错

  • 使用CupertinoAlertDialog在安卓上报The following NoSuchMethodError was thrown building LayoutBuilder: The getter alterDialogLabel was called on null 的错
  • 解决: 在MaterialApp 的 localizationsDelegates 属性中添加 FallbackCupertinoLocalisationsDelegate() 项,FallbackCupertinoLocalisationsDelegate代码如下:
MaterialApp(
          ......
          localizationsDelegates: [
            FallbackCupertinoLocalisationsDelegate(),
          ],
          ......
)
import 'package:flutter/cupertino.dart';

class FallbackCupertinoLocalisationsDelegate extends LocalizationsDelegate {
  const FallbackCupertinoLocalisationsDelegate();
 
  @override
  bool isSupported(Locale locale) => true;
 
  @override
  Future load(Locale locale) =>
      DefaultCupertinoLocalizations.load(locale);
 
  @override
  bool shouldReload(FallbackCupertinoLocalisationsDelegate old) => false;
}

运行安卓模拟器报A problem occurred configuring project ':path_provider'. > Could not resolve all artifacts for configuration ':path_provider:classpath'.

  • 完整报错信息如下:
FAILURE: Build failed with an exception.

* What went wrong:
A problem occurred configuring project ':path_provider'.
> Could not resolve all artifacts for configuration ':path_provider:classpath'.
> Could not resolve com.android.tools.build:gradle:3.3.0\.
Required by:
project :path_provider
> Could not resolve com.android.tools.build:gradle:3.3.0\.
> Could not get resource '[https://dl.google.com/dl/android/maven2/com/android/tools/build/gradle/3.3.0/gradle-3.3.0.pom](https://dl.google.com/dl/android/maven2/com/android/tools/build/gradle/3.3.0/gradle-3.3.0.pom)'.
> Could not GET '[https://dl.google.com/dl/android/maven2/com/android/tools/build/gradle/3.3.0/gradle-3.3.0.pom](https://dl.google.com/dl/android/maven2/com/android/tools/build/gradle/3.3.0/gradle-3.3.0.pom)'.
> Connect to 127.0.0.1:8888 [/127.0.0.1] failed: Connection refused (Connection refused)
> Could not resolve com.android.tools.build:gradle:3.3.0\.
> Could not get resource '[https://jcenter.bintray.com/com/android/tools/build/gradle/3.3.0/gradle-3.3.0.pom](https://jcenter.bintray.com/com/android/tools/build/gradle/3.3.0/gradle-3.3.0.pom)'.
> Could not GET '[https://jcenter.bintray.com/com/android/tools/build/gradle/3.3.0/gradle-3.3.0.pom](https://jcenter.bintray.com/com/android/tools/build/gradle/3.3.0/gradle-3.3.0.pom)'.
> Connect to 127.0.0.1:8888 [/127.0.0.1] failed: Connection refused (Connection refused)
> Could not get unknown property 'android' for project ':path_provider' of type org.gradle.api.Project.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at [https://help.gradle.org](https://help.gradle.org)
  • 解决过程:
    1、首先,我以为是安卓模拟器的问题,我就用安卓模拟器运行之前其他的项目没结果完美运行,没有任何问题。
    2、既然不是安卓模拟器的问题,那么应该就是我们代码里配置的原因,然后我就分析报错原因,既然报错是跟path_provider相关,那么我就去搜path_provider相关的东西,发现我们的pubspec.ymal文件中并没有导入path_provider的库,但是pubspec.lock文件中确有这个库。然后我在网上搜跟path_provider相关的报错原因,千奇百怪,各种答案尝试后还是解决不了问题。然后报错信息还有跟gradle相关的,然后我又搜报错的gradle的信息,各种答案也是解决不了,然后我在想是不是墙的原因,然后我代理打开,依旧不行,然后我又想到去用阿里云的镜像,然后还是不行,我有点泄气了。目光重新回到path_provider
    3、目光重新回到path_provider上,这时我想到是不是pub没有找到合适的版本,因为我们引入的三方库的版本号都是写死的,那么我就把所有引入的库改成版本可变的,然后重新运行还是报错。
    5、然后我查了一下这个库是干什么用的,大概是用来做本地存储的,我就分析了我们引入的库里面有没有需要使用到本地存储的。然后发现我们引入了一个叫cached_network_image的库用来做图片缓存,既然缓存肯定涉及到本地数据的操作。
    6、我将pubspec.ymal文件中导入cached_network_image的代码给注释掉,代码中用到cached_network_image的代码都注释,然后删除app,重新运行,结果没错了,安卓模拟器运行起来了。这时我确定应该是cached_network_image中引用了path_provider库导致的。
    7、删除cached_network_image库后,我发现之前编译产生的.flutter-plugins 和 .flutter-plugins-dependencies文件也没有了。
    8、这个时候我又想,为什么安卓同事的为什么可以运行呢?我猜是他们使用的flutter 版本和dart版本有可能跟我的不一样导致的,然后我去查看了他们的flutter 版本和dart sdk版本,结果我们使用的版本是一样的。这就很好奇了,同样的代码他们没问题,我这边确有问题。那到底问题出在哪里?
    9、第二天我想总结一下昨天遇到的问题,然后就把昨天注释掉的cached_network_image库重新导入,然后删除app重新运行,我满心期待报错信息的出现,结果,我靠安卓模拟器启动了,我靠,又正常了,真TM太神奇了,我也懵了,不知道问题到底出在哪里了。

控制台输出setState() or markNeedsBuild() called during build.提示

The following assertion was thrown while dispatching notifications for TradeProvider:
flutter: setState() or markNeedsBuild() called during build.
flutter: This _DefaultInheritedProviderScope widget cannot be marked as needing to build
flutter: because the framework is already in the process of building widgets.  A widget can be marked as
flutter: needing to be built during the build phase only if one of its ancestors is currently building. This
flutter: exception is allowed because the framework builds parent widgets before children, which means a
flutter: dirty descendant will always be built. Otherwise, the framework might not visit this widget during
flutter: this build phase.
flutter: The widget on which setState() or markNeedsBuild() was called was:
flutter:   _DefaultInheritedProviderScope
flutter: The widget which was currently being built when the offending call was made was:
flutter:   Builder
  • 这里是我们在initstatus方法中直接或间接的调用了setStatus导致的,出现这种问题是要修改掉了,因为init的时候还没执行build方法,第一次执行build应有系统去调用的。
  • 安卓模拟器打不开图片请使用:8.8.8.8

你可能感兴趣的:(Flutter 报错总结)