Flutter遇到的坑

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flutter遇到的坑相关的知识,希望对你有一定的参考价值。

参考技术A 最近写了一个LoadingView用于页面的网络加载,使用的是StatefulWidget。由于项目是使用的Get对状态进行控制的,所以在GetBuild中对Loading进行刷新。但在使用中发现rebuild LoadingView没有刷新状态,看参数是在Widget中更新了的。

后续定位发现,StatefulWidget在rebuild的时候,并不会重新执行initState方法,而只会执行build方法,这也符合state和widget的一对多原则。知道问题所在,修改也非常简单。去掉state中的status变量,使用widget中的initStatus值即可。

在此记录,对于Get的一些注意点。

目前项目中对Widget进行了内嵌LoadingView的BaseWidget封装,对GetxController进行了LoadingStatus状态操作的BaseController封装。发现在第二个继承了BaseWidget的页面中,对绑定的Controller进行update操作无效。

阅读源码后发现,GetBuilder的global参数默认是true,在没有指定tag的情况下,会根据controller作为key进行全局map,若第二次调用时,会先通过Controller进行get,正好我们的BaseWidget使用的是BaseController导致全局只有一个Controller从而导致第二个页面无法刷新问题。我们只需要在基类中将global改为false,直接使用init的controller即可。

目前在做App的主题色切换功能,发现在部分主题色下,Appbar的标题和Action自动变成深色,查阅资料后得知,由于色值的computeLuminance值过大导致Brightness自动为Brightness.light。

知道原因后就好办了,通过设置ThemeData里面的Brightness类型的参数为Brightness.dark(注意我们只需要Appbar为深色,brightness参数控制的是整个页面,不修改)。经验证,primaryColorBrightness控制Appbar的标题和action,修改即可。

Flutter踩坑之旅

每次接触一个新“玩具”时,折腾运行环境总是第一步。本文是将我自己在flutter运行环境搭建过程中所遇到的问题整理了下,以便在其他小伙伴踩了同样的坑时能提供帮助。(图中部分报错截图是从网上找的,自己踩坑时有些未能截图留念。。。。留念)


环境:win7,64位,Android环境(mac和IOS的下次再踩)



这里想吐槽下,官方中文教程中有些关键步骤写的不是很清楚,所以经常会遇到实际操作结果与预期不符的情况,此时别纠结,直接上网查,教程中没有答案(说好的信任呢????)


前面操作都是和教程相符

使用镜像

由于在国内访问Flutter有时可能会受到限制,Flutter官方为中国开发者搭建了临时镜像,大家可以将如下环境变量加入到用户环境变量中:

export PUB_HOSTED_URL=https://pub.flutter-io.cn
export FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn

获取Flutter SDK

这里需要注意的是:不要将flutter安装到需要一些高权限的路径如C:\Program Files\,这个在教程中有提到,一般不会踩


设置环境变量

这步没问题


运行flutter doctor

踩坑开始。

假如是一台白板电脑,里面上报错是如下所示

PS C:\Users\Administrator> flutter doctor
Doctor summary (to see all details, run flutter doctor -v):
[√] Flutter (Channel beta, v0.5.1, on Microsoft Windows [Version 10.0.17134.165], locale zh-CN)
[X] Android toolchain - develop for Android devices
X Unable to locate Android SDK.
Install Android Studio from: https://developer.android.com/studio/index.html
On first launch it will assist you in installing the Android SDK components.
(or visit https://flutter.io/setup/#android-setup for detailed instructions).
If Android SDK has been installed to a custom location, set $ANDROID_HOME to that location.
[X] Android Studio (not installed)
[!] Connected devices
! No devices available

! Doctor found issues in 3 categories.
PS C:\Users\Administrator>

flutter doctor会检测依赖,并且给出解决方式。emmmmm,顺利的话根据错误提示的解决方式可以顺利完成配置,然而。

当时看到这几条错误,我大概明白这是要下载Android Studio和Android SDK才能完成配置,于是开始着手下载。由于墙的存在,下载不会太顺利。有时花钱买个fq工具还是蛮必要的。


Android SDK Manager用来管理安卓版本,此处建议下载个8.1.0和8.0.0就可以了,别贪心,原因后面再说。

Android Studio主要是用到其虚拟机,as版本别太低,我用的是3.4,最新版本。由于我习惯用vscode开发,于是as插件暂时没装,只是配置了虚拟机

Flutter踩坑之旅(一)

Flutter踩坑之旅(一)

图中可以看到我安装了android9和android8.1,这里的坑就是,假如用9跑,虽然也能跑起来并将demo成功在虚拟机显示出来,但是命令会被终止,错误如图

Flutter踩坑之旅(一)

去查了下,说是版本太高。。。。。

而前面说的别贪心下载太多,是因为,我最初把5-9都下载下来了,下了几个小时。。。。c盘爆满,整个sdk包167G,导致虚拟机无法运行。。。。刚开始不知道是sdk太大,以为是安装的软件太多,一个个文件夹排查。。。

回到上面的步骤,配置完成后,再次在项目根目录下运行flutter doctor,可能显示如下

Flutter踩坑之旅(一)

不慌,一个个来。

错误:Android licenses not accepted

按报错提示运行:flutter doctor --android-licenses,欧皇小胖友可以一路按Y执行下去,然而。。。。。。我得到的提示是类似于这种Flutter踩坑之旅(一)

大致意思就是找到你的sdkmanager目录,运行sdkmanager --update进行更新。。。

按要求执行。。。。

Flutter踩坑之旅(一)

惊喜不断。。。继续查,说是编译环境和jdk版本对不上。。。。我当时本地是jdk7.。。于是下载。。。。又要翻墙。。。翻墙也没用,最后用手机开热点等骚操作下了个jdk12.。。。这里面涉及到jdk版本切换等。。。。。有兴趣的自己折腾

高高兴兴跑一轮。。。呵呵,还是不行,版本不一致报错,同上。。。(其实本地打印出来版本是一致的,估计版本太高),于是下载安装jdk8。终于可以一路欢快的按y了,此处无坑。

插一段,有些人可能会遇到

Flutter踩坑之旅(一)

错误:

Flutter踩坑之旅(一)

假如安装好虚拟机重启后仍然报该错误,如下处理:

Flutter踩坑之旅(一)

此处没踩其他坑,有坑欢迎反馈

有人说为什么没有说这个错误:

Flutter踩坑之旅(一)

这个问题我尝试去解决,理论上as安装好flutter和dart插件并重启后,就不会再出现,然而我这边试了各种方法,也没能处理掉,后来发现在用vscode时即使出现这个也不影响,遂忽略,有大佬知道原因的话希望能帮忙解惑。


此时,检查依赖会如下图所示

Flutter踩坑之旅(一)

在其他很多教程上到了这一步基本就是运行下flutter run就可以正常显示了。。。

好吧,可能我要出去多做些好事了,我运行结果如下图

Flutter踩坑之旅(一)

跟着提示去找回发现项目下的确没这么个文件(其实最初运行的时候连pubspec.yaml文件都没),为防止还有其他缺失,我在官方给的示例中拷贝了一份Hello World来。。。。继续运行

Flutter踩坑之旅(一)

酱紫,卡这不动了。

Flutter踩坑之旅(一)

酱紫,连接超时了。

查下来。。。。又是墙。。。总有一道无形的墙挡在了我迎娶白富美走向人生巅峰的路上。

于是做如下修改

在项目下面找到该文件

Flutter踩坑之旅(一)

Flutter踩坑之旅(一)

C:\Users\Administrator\.gradle\wrapper\dists\gradle-4.10.2-all\9fahxiiecdb76a5g3aw9oi8rv

然后,打开C:\src\flutter\packages\flutter_tools\gradle\flutter.gradle,

做如图修改

Flutter踩坑之旅(一)

maven { url 'https://maven.aliyun.com/repository/google' }

maven { url 'https://maven.aliyun.com/repository/jcenter' }

maven { url 'http://maven.aliyun.com/nexus/content/groups/public' }

这里有个小插曲,网上复制的这段代码前面的空格可能存在一些特殊字符,编译会报错

Flutter踩坑之旅(一)

将空格删除就行

同时,在项目下找到build.gradle,做如下修改

保存修改并运行,终于

ps:上文说到,假如运行的是Android9+,命令会被终止


总结一下,虽然知道安卓环境难搞,没想到会折腾成这样,几乎每步一坑,遇到坑别慌,慢慢查。这里出现的错误对于大佬来说可能很容易解决,然而却能让小白卡住很久,希望能对大家有所帮助,也欢迎大家补充遇到的问题,并分享解决方案。

后面有时间会开始踩ios和mac的坑,希望能顺利进行

以上是关于Flutter遇到的坑的主要内容,如果未能解决你的问题,请参考以下文章

Flutter mac上打包安卓APK遇到的坑

完美解决flutter 键盘遮挡/超出(overflow)的坑

flutter mapbox_gl 使用的坑

微信支付,别人遇到的坑--转载

全局变量遇到的坑

GO遇到的坑