Flutter是一个全新的跨平台开发的语言,我在实际项目开发中也有幸使用到 Flutter 进行完整开发,在这个开发过程中也是一步步的实验,在这其中也遇到了各种各样的坑, 网上通过各种谷歌,stackoverflow,Flutter官网等查资料,有些问题是解决,但还是有些问题不能及时解决,于是就自己慢慢的尝试着摸索除了一些解决方案,所以在这里就整理一下分享给大家,跟大家一起学习、讨论。
1、Waiting for another flutter command to release the startup lock...
问题描述
在项目中使用Flutter Packages get时或命令行执行flutter build 时 会 出现: Waiting for another flutter command to release the startup lock...
解决方案:
找到\bin\cache中的lockfile文件删除,如果还是不行则重启IDE重新试下。
2、The context used to push or pop routes from the Navigator must be that of a widget that is a descendant of a Navigator widget.
问题描述
在页面 initState、build、或者页面返回没办法直接使用 context 或 setState
解决办法
使用
Future.delayed(Duration.zero).then((e) {
....
});
3、PageView保存状态报错
问题描述
Build functions must never return null. To return an empty space that causes the building widget to fill available room, return "new Container()". To return an empty space that takes as little room as possible, return "new Container(width: 0.0, height: 0.0)"
解决办法
在 build 方法必须加上super.build
@override
Widget build(BuildContext context) {
super.build(context); //保存状态必须加上
[...]
}
4、EventManager使用问题
post : 发送消息
on : 监听消息
destroy : 销毁
问题描述
错误的使用destory 使得整个应用没办法监听消息
解决办法
在 BaseWidget 的 dispose不能 destory EventManager。EventManager是单例,基类取消就全部取消了。
5、IOS 调起相机/相册点击事件穿透
问题描述
在调起相机、相册选择图片时,点击相机区域、图片选择区域会响应下层 flutter 界面的点击事件
具体参与:https://github.com/flutter/flutter/issues/32896
解决办法
目前处理的办法是调起相机、相册时显示一个带蒙层的弹窗,收起相机、机册时取消蒙层弹窗。
6、官方 Webview_flutter 使用问题
问题描述
在 android 中输入框获焦点,点击两次会闪退。
在IOS需要 配置了io.flutter.embedded_views_preview属性,会导致键盘卡顿。
解决办法
待官方解决,暂时使用第三方flutter_webview_plugin 插件
7、flutter_webview_plugin 插件使用问题
问题描述
flutter_webview_plugin是调用原生 webview.并加到原生主页面上。所以该 webview 是最顶层的,无法在其上显示flutter的视图
解决办法
要显示弹窗等视图时先判断当前是否有webview页面,并且在进入webview页面时调用FlutterWebviewPlugin().show();退出 webviewd页面时调用FlutterWebviewPlugin().hide();
8、命名路由无法关闭指定页面
问题描述
flutter 关闭弹窗、页面都会都是调用 Navigator.pop(context, result),在这里没办法指定特定的页面路由或弹窗
解决办法
修改源码把底层的history释放出来,或者尽量避免这种需要关闭指定页面的做法。
9、点击控件区域没事件响应
问题描述
正确的设置了控件的点击事件,点击却没有反应
解决办法
- 给控件设置背景
- 设置behavior属性
return GestureDetector(
behavior: HitTestBehavior.translucent,
child: Text("测试${index}"),
onTap: () {},
);
enum HitTestBehavior {
/// Targets that defer to their children receive events within their bounds
/// only if one of their children is hit by the hit test.
deferToChild, //只生效在child的区域比如文字
/// Opaque targets can be hit by hit tests, causing them to both receive
/// events within their bounds and prevent targets visually behind them from
/// also receiving events.
opaque,//GestureDetector的整个区域,不包括它下面的区域
/// Translucent targets both receive events within their bounds and permit
/// targets visually behind them to also receive events.
translucent,// GestureDetector的整个区域以及它下面的区域
}
10、Appbar/Tabbar/的高度设置问题
问题描述
Appbar、Tabbar 默认有固定的高度,如何改变其高度
解决办法
使用PreferredSize。
最后
如果在使用过程遇到问题,欢迎下方留言交流。