Flitter 学习过程中遇到的那些坑(持续更新)

话不多说直接进入正题

一、 iOS真机运行加载网络图片报错 Failed host lookup: 'gimg2.baidu.com' (OS Error: nodename nor servname provided, or not known, errno = 8)

解决:初次看到这个问题首先想到的是iOS工程plist文件没有设置 NSAppTransportSecurity字段 果断加上,运行,发现依然饭太稀,换模拟器运行,很是完美,事情发展的有点离奇,别着急其实很简单
1、从手机删除工程,重启手机
2、flutter工程重启
3、iOS工程 clean一下
再次运行完美解决,就是这么简单,具体为何缓存这么顽固有待探究

二、flutter doctor提示plugin没有安装的问题
191616055028_.pic.jpg

原因是 Android Studio (4.1) 的插件位置换了, 而 flutter doctor 这个命令还是会去原来的位置查找这两个插件,

旧目录: ~/Library/Application\ Support/AndroidStudio4.1

新目录: ~/Library/Application\ Support/Google/AndroidStudio4.1/plugins

解决的办法是软链接一下 :
ln -s ~/Library/Application\ Support/Google/AndroidStudio4.1/plugins ~/Library/Application\ Support/AndroidStudio4.1

三、flutter网络请求框架的请求表单格式设置

开发过程中一般的网络请求表单格式包括三种
1.application/json json格式
2.application/x-www-form-urlencoded; charset=utf-8 form-urlencode
3.multipart/form-data; boundary=--dio-boundary-0223402156 form-data

下面分别介绍三种表单请求的不同设置

1.application/json

Map<String, String> lastMap = {
      'name': '小明',
      'age': '12'
    };
_dio.post(urlPath, data: lastMap)

抓包发现 请求的content-type 为application/json

2.application/x-www-form-urlencoded; charset=utf-8

_dio.options.contentType = 'application/x-www-form-urlencoded; charset=utf-8';
response = await _dio.post(urlPath, data: lastMap);

3.multipart/form-data; boundary=--dio-boundary-0223402156

Map<String, String> lastMap = {
      'name': '小明',
      'age': '12'
    };
FormData data = FormData.fromMap(lastMap);
response = await _dio.post(urlPath, data: data);
四、使用dio框架 mac使用Charles抓包问题

开发中使用charles抓包比较常见 dio内部做了处理需要自己设置一下

(_dio.httpClientAdapter as DefaultHttpClientAdapter).onHttpClientCreate =
        (HttpClient client) {
      client.findProxy = (url) {
        return 'PROXY yourIP:8888';
      };
 };
五、default value of optional parameter must be constant

先看下边的代码

void showSelectTime(
    {List<String> testList = ['时','分'],List<int> selectList, Function complateAction, Function deleteAction}) {
print('显示选择时间');
}

此时会报错,默认值必须为常量,修改代码

void showSelectTime(
    {List<String> testList = const ['时','分'],List<int> selectList, Function complateAction, Function deleteAction}) {
print('显示选择时间');
}

加了const,问题解决

六、使用get框架共享数据的问题,同一类型的controller数据会共享,页面销毁,数据不会释放

场景是这样的现在有个表单页,表单页提供新建个编辑的功能

StudyAddTaskController controller = Get.put(StudyAddTaskController());

编辑时对conreoller进行赋值,等新建表单的时候使用同样方法Get.put后获取到的数据竟是之前编辑的数据,

根据此种情况 需要设置相应数据的tag值,同时使用Get.find获取数据时,也需要传相应的tag值

// 注册
controller = Get.put(StudyAddPlanController(), tag: planID);

// 获取

planController = Get.find<StudyAddPlanController>(tag: widget.planID);
planModel = Get.find<StudyAddPlanController>(tag: widget.planID).planModel;

七、flutter_swiper 报错ScrollController not attached to any scroll views

使用flutter_swiper 若是需要对swiper的list个数做变动,在删除时会出现爆红,错误提示ScrollController not attached to any scroll views;开始单个list,添加一个后会出现swiper不可轮播,
针对以上问题只需对swiper添加key: UniqueKey即可

Swiper(
                          key: UniqueKey(),
                          controller: SwiperController(),
                          index: 0,
                          itemCount: swiperList.length,
                          containerHeight: 140,
                          itemWidth: Get.mediaQuery.size.width - 30,
                          scrollDirection: Axis.horizontal,
                          itemBuilder: (BuildContext context, int index) {
                            StudyFindTargetDetailModel model =
                                swiperList[index];
                            return swiperWidget(
                                index: index,
                                shouldAdd: () {
                                  return !(swiperList.length == 8);
                                },
                                model: model);
                          },
                          autoplay: false,
                          viewportFraction: 0.9,
                          autoplayDisableOnInteraction: true,
                          loop: true,
                          scale: 0.95,
)
八、关于键盘弹起需要注意的几个点

1、键盘弹起会自动顶起非滚动视图的底部视图,不需要监测键盘弹起设置底部视图的高度
2、若是不想底部非滚动视图随键盘弹起,可设置Scaffold的resizeToAvoidBottomInset属性为false
3、键盘弹起对widget的影响
1)键盘弹起的页面为StatefulWidget时,键盘弹起会重新调用widget的工厂方法,重新初始化,重新初始化后state的initState方法并不会调用,但是build方法会调用,由此短信state并没有重新生成,类似下边的写法

class StudyCircleDynamicDetailPage extends StatefulWidget {

/// 动态ID
  int feedID = 0;

  /// 动态作者ID
  int ugcUid = 0;
  StudyCircleDynamicDetailPage({Key key}) : super(key: key);

  StudyCircleDynamicDetailController controller =
      Get.put(StudyCircleDynamicDetailController());

  @override
  _StudyCircleDynamicDetailPageState createState() =>
      _StudyCircleDynamicDetailPageState();
}

class _StudyCircleDynamicDetailPageState
    extends State<StudyCircleDynamicDetailPage> {
  

}

若是对上文中的feedID和ugcUid赋值后,调起键盘,这时候在工厂方法中并未对feeID和ugcUid进行赋值,导致两个属性的值变为初始值,此时再去调用其他用到这两个属性的方法就会出错,
同期调起键盘前后我们看一下detailPage的hashcode的值,前后也是不同的,所以调用键盘前后detailPage可认为是两个不同的对象正确的方式

class StudyCircleDynamicDetailPage extends StatefulWidget {
  StudyCircleDynamicDetailPage({Key key}) : super(key: key);

  StudyCircleDynamicDetailController controller =
      Get.put(StudyCircleDynamicDetailController());

  @override
  _StudyCircleDynamicDetailPageState createState() =>
      _StudyCircleDynamicDetailPageState();
}

class _StudyCircleDynamicDetailPageState
    extends State<StudyCircleDynamicDetailPage> {
  /// 动态ID
  int feedID = 0;

  /// 动态作者ID
  int ugcUid = 0;
}

应把属性的赋值操作写在state内部,应为调用键盘前后state并没有重新生成,只是会重新调用build方法
2)键盘弹起的页面为StatelessWidget类型时, 已测试调用键盘弹起时同样会调用工厂方法和build方法。
具体这么设计或是为何flutter会这样设计,有待进一步探究,有知道的大佬,欢迎不吝赐教

九、Command PhaseScriptExecution failed with a nonzero exit code

achive时遇到这个报错,找个很多资料,试了各种办法,发现都没有效果,最后使用下边的方法搞定

截屏2021-09-08 上午1.07.17.png

flutter中经常会出现各种打不了包\运行不了模拟器的情况,其中很多都和缓存有关,根据个人的经验,可以进行以下操作(前5步不分先后):

执行flutter clean
运行Xcode->Product->Clean
删除ios/.symlinks文件夹
删除ios/Pods文件夹
删除ios/Podfile.lock
在ios文件夹下执行pod install
重新打包/编译

这一系列操作能解决很多因为缓存导致的问题,如果你的flutter项目突然出了奇奇怪怪的问题不能打包,先试一下这些操作,可解决大部分的问题

如果以上方法没有效果,比如我就遇到了这个问题,各种清理就是没有效果,这个时候不要着急,使用android studio跑一下项目,找一个可以跑起来的日期,重新清理,发现竟然可以了,是不是很神奇,猜测是studio清理了缓存或是修复了某些东西

十、FlutterPlugin接受iOS的Appdelegate的相关回调&AppDekegate添加相关代理方法后对plugin的影响及解决方法

先说一下探究这个问题的缘由:使用QQ或是微信分享,拿到分享结果的回调,但是app中添加了通用链接打开app进入相应的详情的功能之后,发现QQ或是微信不能拿到分享结果的回调了,肯定是appdelegate添加userActivity方法后导致plugin中的方法没有调用,才有了以下的探究

1、若是我们的plugin想拦截或是获取appdelegate的相关回调可使用类似如下方法,instance 就拥有了获取回调的能力

FluwxPlugin *instance = [[FluwxPlugin alloc] initWithRegistrar:registrar methodChannel:channel];
[registrar addMethodCallDelegate:instance channel:channel];
[[FluwxResponseHandler defaultManager] setMethodChannel:channel];
[registrar addApplicationDelegate:instance];

2、使plugin中和appdelegate中都能获取回调方法
1)appdelegate继承自FlutterAppDelegate时,只需在相应的代理方法中调用super的相关方法,问题即解决;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary<UIApplicationLaunchOptionsKey,id> *)launchOptions {
   
    [super application:application didFinishLaunchingWithOptions:launchOptions];
    
    return YES;
}
  1. appdelegate没有继承自FlutterAppDelegate
    参考官网这里说的很清楚
十一 使用VSCode打包 报错 R8: java.lang.OutOfMemoryError: GC overhead limit exceeded

查阅资料大概意思是堆内存溢出了

解决 找到安卓工程-Project-gradle.properties找到org.gradle.jvmargs=-Xmx1536m,将值改大一些
具体原因看这里

十二 使用TabBarView 加载两个不同的page时,切换page上一个page会重新调用initState和dispone方法

问题: 使用TabBarView加载page1和page2,当切换到page2时,会调用page1的dispone方法,重新切回page1会调用initState方法, 这样会导致我使用的EventBus的同步机制失效

探究: TabBarView在切换的时候,会重新的刷新当前页面,内部机制导致

解决: 给page1添加混入AutomaticKeepAliveClientMixin 类,并重写bool wantKeepAlive = true;即让当前page保持状态,告知不需要重新绘制,问题解决

十三 适配暗黑模式,获取手机系统的主题模式

导入 import 'dart:ui';

我们使用GetX管理路由及主题模式
改变

Get.changeThemeMode(index == 0
        ? ThemeMode.system
        : index == 1
            ? ThemeMode.light
            : ThemeMode.dark);

获取模式

Get.isDarkModel

问题是调用了改变方法,设置为跟随系统后,获取到的主题模式与系统不匹配,说明不是立刻生效
如下方法可获取系统模式
获取 window.platformBrightness 的值 如果是 Brightness.light 代表是正常模式, 如果是Brightness.dark代表是暗黑模式

十四 Pixel6 手机 开启手机手势操作后 若干页面 右滑抖动的问题

问题描述:Pixel6 手机 设置中开启手势操作, 此时右滑返回上个页面,此时大概率会出现页面抖动的问题

原因:我们的app若干页面有抖动的问题 若干页面没有,对比发现 这个抖动的影响因素 包括
1、页面是否添加了GestureDetector 外层添加了GestureDetector 不会抖动
2、个别布局 也不回抖动,具体的布局 没看出规律
3、手机关闭全屏手机 也没有该问题

解决:在页面的basePage中 添加GestureDetector,同时必须实现ontap方法,问题解决

十五 Unhandled Exception: Looking up a deactivated widget's ancestor is unsafe.

E/flutter (20604): At this point the state of the widget's element tree is no longer stable.
E/flutter (20604): To safely refer to a widget's ancestor in its dispose() method, save a reference to the ancestor by calling dependOnInheritedWidgetOfExactType() in the widget's didChangeDependencies() method.

原因是 我们在使用Context时,这个context已经不在element树中了 这个context是不安全的 使用到context的相应操作不会生效,控制台会打印如上报错新

// 我遇到的问题是调用如下代码 没有效果,查看代码发现调用该方法前,原context所在的视图会重绘,重绘导致context发生变化,进一步 导致原context为unsafe
showGeneralDialog<bool>(
      context: context,
);

解决
1、对视图设置Key('key')或是不设置,这样会保证重绘时context不变
2、若是设置了ValueKey,每次刷新都会变化,这时若是使用了GetX,可以使用GetX.context
3.设置固定Key,使用时使用Key获取context

上述问题 只是可以解决问题 但是 原因没有研究,大概率是 手机的手势与flutter的手势兼容问题,之后升级flutter版本 看看是否好转

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容