Flutter Bug汇总经典(持续更新)
记录Flutter学习过程中碰到比较常见的坑,持续更新。
setState() or markNeedsBuild() called during build.
报错信息如下:
I/flutter (16998): setState() or markNeedsBuild() called during build.I/flutter (16998): This ParentWidget widget cannot be marked as needing to build because the framework is already inI/flutter (16998): the process of building widgets. A widget can be marked as needing to be built during the build I/flutter (16998): phase only if one of its ancestors is currently building. This exception is allowed because the I/flutter (16998): framework builds parent widgets before children, which means a dirty descendant will always be I/flutter (16998): built. Otherwise, the framework might not visit this widget during this build phase.
原代码:
class MyButton extends StatefulWidget { Function callback; var btnColor; MyButton(this.callback, this.btnColor); @override State createState() { return _MyButton(); }}class _MyButton extends State<MyButton> { @override Widget build(BuildContext context) { return RaisedButton( //State里可以通过widget访问其StatefulWidget里的变量 onPressed: widget.callback(Colors.black12), child: Text('Button2,点击修改父控件背景色'), color: widget.btnColor, ); }}
报错原因是在自定义组件MyButton中传入了一个方法,赋值给callback,在onPressed中不能直接调用widget.callback(Colors.black12)
而应该使用()=> widget.callback(Colors.black12)
Waiting for another flutter command to release the startup lock...
在编译或运行命令的时候出现这种报错,最简单的方式就是重启AndroidStudio。A RenderFlex overflowed by 12 pixels on the right
这是因为组件大小超过屏幕范围了,我源代码里这是一个Row(),宽度超过屏幕,有两种解决办法:
1、你实际需要的组件就是宽度超过屏幕的话,那就需要用一个scroll包裹,用SingleChildScrollView包裹下这个Row(),因为我这是水平超出范围,要设置scrollDirection: Axis.horizontal,
2、你实际需要的组件并不需要超过屏幕,那就是子组件的宽度设置错误,在初学Row的时候很容易遇到,我在一个Row中放入四个按钮就报错,报错代码:
new Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: <Widget>[ new RaisedButton( textColor: Colors.black, child: new Text('1'), ), new RaisedButton( textColor: Colors.black, child: new Text('2'), ), new RaisedButton( textColor: Colors.black, child: new Text('3'), ), new RaisedButton( textColor: Colors.black, child: new Text('4'), ), ], ),
而我实际想要的是这四个按钮平均分布在一行里,这里就需要把子组件用容器包裹,有些还需要指定它大小的分配方式:
new Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: <Widget>[ new Flexible( child: new RaisedButton( textColor: Colors.black, child: Text('增'), onPressed: _add), ), new Flexible( child: new RaisedButton( textColor: Colors.black, child: new Text('删'), onPressed: _delete), ), new Flexible( child: new RaisedButton( textColor: Colors.black, child: new Text('改'), onPressed: _update), ), new Flexible( child: new RaisedButton( textColor: Colors.black, child: new Text('查'), onPressed: _query), ), ], ),
这样就可以实现四个按钮均布了,实际上添加再多的按钮它也是均布不超出,就是每个按钮都被挤压得宽度只剩一点了。
MissingPluginException(No implementation found for method showToast on channel Ponnam Karthik/fluttertoast)
项目中初次引入fluttertoast的时候报错,重新run编译整个项目,而不是仅热重启。This version of path_provider will break your Android build if it or its dependencies aren't compatible with AndroidX.
在yaml文件导入最新版的fluttertoast依赖fluttertoast: ^3.0.1
的时候报错path_provider库不兼容AndroidX,而把toast的版本降低,比如fluttertoast: ^2.1.1
后又正常了,这个报错的地方非常奇怪。。。创建数据库的时候 disk I/O error
flutter: dbPath:/var/mobile/Containers/Data/Application/443CF564-CA8A-4354-BFDA-A17B4790CAA4/DocumentsDB Error: 10 "disk I/O error"DB Query: CREATE TABLE user_table (id INTEGER PRIMARY KEY, username TEXT,pwd Text)DB Path: /var/mobile/Containers/Data/Application/443CF564-CA8A-4354-BFDA-A17B4790CAA4/Documents/user.db[VERBOSE-2:shell.cc(184)] Dart Error: Unhandled exception:DatabaseException(Error Domain=FMDatabase Code=10 "disk I/O error" UserInfo={NSLocalizedDescription=disk I/O error}) sql 'CREATE TABLE user_table (id INTEGER PRIMARY KEY, username TEXT,pwd Text)' args []}
iOS系统上,卸载再重装app报错,无法打开
Could not install build/ios/iphoneos/Runner.app on 81d01af8df61a458d021c2bf12fc092b87580b72.Try launching Xcode and selecting "Product > Run" to fix the problem: open ios/Runner.xcworkspace
再次信任App的开发证书即可。
程序包androidx.annotation不存在import androidx.annotation.VisibleForTesting;
在适配AndroidX失败后降级回来,发现报错
/Users/youdongzhen/Documents/soft/flutter/.pub-cache/hosted/pub.flutter-io.cn/image_picker-0.4.12+1/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerPlugin.java:8: 错误: 程序包androidx.annotation不存在import androidx.annotation.VisibleForTesting;
按理解,应该是获取依赖的时候先去.pub-cache文件夹下面找,而缓存里的插件在之前升级AndroidX的时候被转换了,我就把.pub-cache/hosted/下的文件清空了,重新获取。
编译的时候报错 error: resource android:attr/dialogCornerRadius not found.
Output: /Users/youdongzhen/Documents/repository/trackandroid/flutter/flutter_app/build/app/intermediates/incremental/mergeDebugResources/merged.dir/values-v28/values-v28.xml:7: error: resource android:attr/dialogCornerRadius not found. /Users/youdongzhen/Documents/repository/trackandroid/flutter/flutter_app/build/app/intermediates/incremental/mergeDebugResources/merged.dir/values-v28/values-v28.xml:11: error: resource android:attr/dialogCornerRadius not found. /Users/youdongzhen/Documents/repository/trackandroid/flutter/flutter_app/build/app/intermediates/incremental/mergeDebugResources/merged.dir/values/values.xml:290: error: resource android:attr/fontVariationSettings not found. /Users/youdongzhen/Documents/repository/trackandroid/flutter/flutter_app/build/app/intermediates/incremental/mergeDebugResources/merged.dir/values/values.xml:290: error: resource android:attr/ttcIndex not found. error: failed linking references.
drawArc绘制弧度时无法显示
canvas.drawArc( rect, -3.14 / 2,//起始弧度,从圆顶部开始绘制,起点应为-90°,转换为弧度为-π/2 progress / 100 * 360 * pai / 180,//终止弧度,100制进度转为弧度 false,//是否连线到中心点 _paintFore ..strokeWidth = borderWidth ..color = Colors.red ..style = PaintingStyle.stroke //绘画风格改为stroke );
没有任何报错,就是绘制一段弧线无法显示,然而把其中的useCenter改为true,就能显示这段弧线了!目前已知该bug发生在V1.0.0的Flutter,并且只在真机调试中出问题,ios模拟器能正常工作,解决办法就是升级Flutter。
1.在flutter中,如果不小心在脚本文件中,点了Flutter upgrade更新后,在点packages get 可能在控制台会出现downloading windows-x64 tools,看下图
这个时候可以检查下,你之前的系统配置中是否配置了国内的镜像
声明PUB_HOSTED_URL和FLUTTER_STORAGE_BASE_URL两个环境变量,此举是为了让Flutter在安装过程中使用国内的镜像。
PUB_HOSTED_URL=https://pub.flutter-io.cn
FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn
2.注意studio要关联上flutter的sdk和Dart的sdk
配置flutter sdk路径
配置Dart sdk路径
1.Unable to update Dart SDK
这个问题遇到了两次,一次是刚安装的时候,忘记怎么解决了,一次是更新了flutter,提示powershell命令提示符出现“不是内部或外部命令,也不是可运行的程序或批处理文件的解决办法,Unable to update Dart SDK
解决方法:
环境变量里的系统变量path添加C:\Windows\System32\WindowsPowerShell\v1.0
2.更新报Unable to 'pub upgrade' flutter tool
解决方法: 网上说是环境变量没有配置PUB_HOSTED_URL和FLUTTER_STORAGE_BASE_URL的原因,但我已经配置了,后来的解决方法是: 删除 flutter SDK中 bin/cache 文件夹。 不过PUB_HOSTED_URL和FLUTTER_STORAGE_BASE_URL是一定要记得配置的。
3.一运行就超时断开连接
解决方法:重新下载个新的模拟器
后续遇到其他问题再更新,目前遇到的大部分问题是环境变量的问题,多检查检查环境变量有没有配置完整,记得配置后重启电脑才能生效。over
学习语言就是这样,先写代码,再看原理,在写代码的过程中肯定会遇到问题,这里就用来记录这些问题。
1 Run project时,遇到Waiting for another flutter command to release the startup lock
1、打开flutter的安装目录/bin/cache/
2、删除lockfile文件
3、重启AndroidStudio
2 配置环境时,出现-bash: fultter: command not found
出现这个问题,一般都是环境没有配置好,用以下方式可以解决:
open ~/.bash_profile 在终端打开配置文件
2.在配置文件中添加上这样两行代码
export PATH_TO_FLUTTER_GIT_DIRECTORY=/Users/kimliu/flutter/sdk/flutter //flutter的安装目录 export PATH=${PATH}:${PATH_TO_FLUTTER_GIT_DIRECTORY}/bin
3.运行下面这行代码,source .bash_profile
1、 安卓卡在Installing build/app/outputs/apk/app.apk...
手机开发者处撤销授权,然后重插usb在此授权
2、flutter 降级
目前版本是 v1.7.8+hotfix.4
flutter 降级
进入flutter根目录
flutter version
列出所有版本
找到降级对应版本
flutter version v1.7.8+hotfix.3
3、添加swiper 到customscrollview 上出现问题,页面在数据为空的时候总显示异常
问题
I/flutter (15202): ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════ I/flutter (15202): The following assertion was thrown building Swiper(state: _SwiperState#13dfc):I/flutter (15202): ScrollController not attached to any scroll views.I/flutter (15202): 'package:flutter/src/widgets/scroll_controller.dart':I/flutter (15202): Failed assertion: line 110 pos 12: '_positions.isNotEmpty'I/flutter (15202): Either the assertion indicates an error in the framework itself, or we should provide substantially I/flutter (15202): more information in this error message to help you determine and fix the underlying cause.I/flutter (15202): In either case, please report this assertion by filing a bug on GitHub:I/flutter (15202): https://github.com/flutter/flutter/issues/new?template=BUG.md I/flutter (15202): Widget creation tracking is currently disabled. Enabling it enables improved error messages. It can I/flutter (15202): be enabled by passing `--track-widget-creation` to `flutter run` or `flutter test`.I/flutter (15202): When the exception was thrown, this was the stack:
解决方案
嵌套在CustomScrollView使用抛出异常,进行swiper count 判断,如果数量为空则不显示,数量不为空在显示 if (null == _swipers || _swipers.isEmpty) ? SizedBox() : _swiper() ;
问题是可能swiper 必须要要返回数组
没有解决的问题
// initState 中设置回调后不可以调用 setState 方法否则报错,否则运行出错// widget.onTap(string);
4、集成jpush android出现数据包丢失,原因是jpush 适配的版本号和自己项目版本号不同,解决方案是将jpush Fork到自己的项目,然后修改Android 的build.gradle 文件,修改成和项目对应的版本,然后重新导入
jpush_flutter: git: url: https://github.com/Xingefb/jpush-flutter-plugin.git
5、android http 在9.0 以上失效问题 在 AndroidManifest.xml中 <application下直接添加如下代码
android:allowBackup="true" android:supportsRtl="true" android:usesCleartextTraffic="true"
6、引入aar文件
项目级/build.gradle
allprojects { repositories { google() jcenter() // 引入第三方添加 flatDir { dir "../libs" } }}
项目/app/build.gradle
dependencies { implementation(name: 'applog-release', ext: 'aar') }
7、创建plugin时候android 构建时候 引入本地 jar
dependencies { implementation files('libs/xxx.jar') }
8、父子类传值尽量直接用原值传递,initstate 加中转值会出现缓存问题
直接赋值使用 widget.model.state
评论