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
这里提示我们接口返回给我们一个list,但我们以Map去处理了' is not a subtype of type '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
这里需要注意的是
:在我们使用Provider.of
修改值的时候listen
参数需要设置为false
;当我们使用Provider.of
获取值的时候listen
参数需要设置为true
;listen
参数到底是使用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