flutter填坑记录(更新中)

2,887 阅读7分钟
  1. 问题: setState是重新渲染和之前有区别的widget,有时候会遇到一些flutter识别不出来widget已经改变的情况
    场景描述: 解决问题的场景是:一个StatefulWidget A里面使用了另一个StatefulWidget B时,更新B时区别未识别
    解决办法: 将B移入A,即一个界面变成一个StatefulWidget

  2. 问题: Scaffold.of() called with a context that does not contain a Scaffold. No Scaffold ancestor could be found starting from the context that was passed to Scaffold.of(). This usually happens when the context provided is from the same StatefulWidget as that whose build function actually creates the Scaffold widget being sought. There are several ways to avoid this problem. The simplest is to use a Builder to get a context that is “under” the Scaffold. For an example of this, please see the documentation for Scaffold.of(): .
    解决办法:
    方法一: 将报错的widget从原来的类移出来,重新写一个StatelessWidget或者StatefulWidget的类,其中build函数将原widget放入Scaffold中来写。如果进一步有报错讲h<infinity,即高度无限,将Scaffold放入一个有高度限制的Container即可。
    方法二: 使用GlobalKey,下面以SnackBar作为例子

class _MyHomePageState extends State<MyHomePage> {
  final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      key: _scaffoldKey,
_scaffoldKey.currentState.showSnackBar(
  SnackBar(
    content: Text('Assign a GlobalKey to the Scaffold'),
    duration: Duration(seconds: 3),
  ));
  1. 问题

报错:

FAILURE: Build failed with an exception.

* What went wrong:
> no meothd jcenter found for root build.gradle
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
BUILD FAILED

build.gradle文件:

buildscript {
    repositories {
        google()
        jcenter()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:3.2.1'
    }
}

allprojects {
    repositories {
        google()
        jcenter()
    }
}

rootProject.buildDir = '../build'
subprojects {
    project.buildDir = "${rootProject.buildDir}/${project.name}"
}
subprojects {
    project.evaluationDependsOn(':app')
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

场景描述: 重新安装AS之后构建项目时报的错
解决方案: 使用新安装的AS重新创建一个flutter项目,然后将里面对应的build.gradle内容拷贝过来替换。在本例中,替换的内容为:

buildscript {
    ext.kotlin_version = '1.2.71'
    repositories {
        google()
        jcenter()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:3.2.1'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

allprojects {
    repositories {
        google()
        jcenter()
    }
}

rootProject.buildDir = '../build'
subprojects {
    project.buildDir = "${rootProject.buildDir}/${project.name}"
}
subprojects {
    project.evaluationDependsOn(':app')
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

  1. 问题: 真机调试,连上手机没有反应
    解决:
    查看是否设置成开发者模式
    重启电脑、重启手机,重新拔插USB
    查看手机数据线是否有数据存储功能
    安装豌豆荚软件装手机驱动(该软件自动安装手机驱动)
  2. 问题: 迁移到AndroidX工作空间
    解决:
    第一步,open android module
    open_android_module

    第二步,新窗口中打开后,进行gradle build,构建过程可能会有报错,逐一解决,只有build成功结束,才可以迁移工作空间
    gradle_build
    第三步,开始迁移,迁移成功后返回flutter项目即可
    migrate_to_androidx
  3. 问题: 没有删除干净AS
    解决:
    第一步,运行android studio安装目录下的Uninstall.exe程序
    第二步,删除C:\Users\18056\下面的.android文件夹
    第三步,删除C:\Users\18056\AppData\Local下面的Android文件夹以及对应AS版本的例如.AndroidStudio3.4文件夹
  4. 问题: 获取调试版本和发布版本的SHA1(android)
    解决:

第一步,先要生成签名的apk,方式是,打开flutter的android module,build成功后,按照下图点击,记住jks文件密码和位置

generate signed apk

第二步,打开终端,欲得到调试版本的SHA1,运行(注意需要安装了jdk)

cd C:\Users\18056\.android
keytool -list -v -keystore debug.keystore

欲得到发布版本的SHA1,运行

keytool -list -v -keystore (第一步生成的jks文件地址)

SHA1显示如下

  1. 问题: TextField控件输入内容后,点击屏幕其它地方,内容被清空
    场景:封装所有信息输入框为一个类,控制器全部在构建函数时新建
    解决: 将TextEditingController放在类外即可

  2. 很好的ui设计模板:
    里面精美界面多,而且有三篇填坑文章 github.com/simplezhli/…

  3. 区分margin,padding,aligment:
    margin:与同级控件之间的位置关系
    padding:与父控件之间位置关系
    aligment:子控件与自己的位置关系

  4. 不要想着statelessWidget有方法实现setState
    之前尝试过有状态类监听无状态类变量判断是否setState,后面发现存在异步问题,此方法不可行

  5. 问题: gradle contains unsupport kotlin plugins
    场景:flutter 打开android module,build时候
    解决: 原因是IDE的kotlin version和build gradle中的kotlin version不一致,as的解决办法是file-->settings-->languagexx-->查看IDE的kotlin版本,然后打开project下面的build gradle,将kotlin version修改成一致的

  6. 问题: flutter 调试的时候和release版本的起始页不一致
    解决: 在使用AS debug的时候,自己指定了起始页,即main函数入口,但是release版本的入口就是main.dart文件

  7. 问题: debug版本显示的界面和release版本显示界面不一致
    解决: google之后发现是因为有一些变量声明在类外,release编译的时候会自动忽视这些声明,应当写在类内

  8. 问题: debug版本显示的界面和release版本显示界面不一致
    解决: google之后发现是因为有一些变量声明在类外,release编译的时候会自动忽视这些声明,应当写在类内,

  9. 问题: 更新了iconfont.tff文件,也重新packages get了,但是图标获取不到 解决: 停止代码运行,flutter clean之后再次运行,如果是assets加了一个图片则不需要

  10. 问题: column中的widgets无法居中对齐 解决: widgets中取消使用stack布局即可,再添加

crossAxisAlignment: CrossAxisAlignment.center,
  1. 问题: 所有页面跳转均为黑屏 解决: 是因为使用了有一个界面出现了两个floatingActionBar,去掉一个就好了

  2. 问题: A widget can be marked as needing to be built during the build phase only if one of its ancestors .。。。 解决: 这是因为控件还在加载中,所以setState失败,解决方法是延时刷新即可

 Future.delayed(Duration(milliseconds: 200)).then((e) {
      setState(() {

      });
    });
  1. 问题: flutter packages get 报错
Git error. Command: git clone --mirror https

解决: 刚开始配置了环境变量,配置了国内镜像地址,还是不行,最后发现是因为

flutter_drag_scale:
   git: https://github.com/LiuC520/flutter_drag_scale.git

这种格式的插件配置,需要改成

shared_preferences: ^0.4.3

格式即可
22. 问题: 发表了评论以后需要立马再次获取评论更新评论区,但是这时候总是有异常抛出
解决: 先将问题打印出,发现是刚发表的评论获取评论时间时为null,应该是服务器端问题,前端可以判断text为空时设置字段为“刚刚”。 23. 问题: Text文本无法自动换行
解决: 使用Expanded换行,代码为

Expanded(child: Text(completeCommentDs.questionText,style: TextStyle(fontSize: ScreenUtil.getInstance().setSp(40)),),),

问题: 产生一个不大于max的随机整数
解决:

import 'dart:math';
int random = Random().nextInt(max);

问题: 调用setState无法更新某些变化
解决:
可能是flutter的一个bug,认为这个widget没有变换,就重用了该widget之前的状态 解决方法是先调用一个变化很明显的setState,然后立马再调用该setState
26.
问题: pubspec.yaml中有些插件使用git下载,但报错can not access github.com,403 time out.
解决:
我的情况是电脑使用了ssr全局代理,但是想要终端git clone xxxx成功,需要设置终端代理
具体步骤如下:
1 右键ssr,选择【选项设置】,本地代理部分,勾选【允许来自局域网的连接】,端口设置【1080】
2 终端运行

git config --global http.proxy 127.0.0.1:1080
git config --global https.proxy 127.0.0.1:1080

即可,注意不可使用ping进行测试,

注:ping是ICMP协议,不是TCP/UDP协议,ping不走也无法走代理。即使代理设置成功,ping也是无效的

问题: android\gradlew.bat exited abnormally 而且flutter run -v运行输出依然没有定位报错信息
解决: 在flutter中打开android模块,可以定位报错
27.
注意事项:
1 EasyRefresh的onFresh、onLoad直接写函数名,该函数必须返回类型必须是Future<_void>,void也不行
2 scopeModel必须放在MaterialApp上层
28.
问题: flutter打包的release版本闪退
解决: 解决链接https://blog.csdn.net/weixin_38025168/article/details/104019388