首页 Flutter正文

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.

Flutter之AndroidX相关问题

  • 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

出现这个问题,一般都是环境没有配置好,用以下方式可以解决:

  1. 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


评论

在线客服-可直接交谈

您好!有什么需要可以为您服务吗?