一、前言
最近在使用Flutter开发新项目,但是有很多小的使用点很容易遗忘,这里做下笔记,以备下次使用时查阅
二、小笔记汇总
- 1、键盘回收
点击空白处回收键盘是很多界面都需要的需求,下面是实现方法
/// 在body上添加一个手势控件,实现键盘回收
@override
Widget build(BuildContext context) {
return Scaffold(
body: GestureDetector(
onTap: (){
// 键盘回收
FocusScope.of(context).requestFocus(FocusNode());
},
child:Container()
)
);
}
- 2、延时执行
// 延时1s执行返回
Future.delayed(Duration(seconds: 1), (){
Navigator.of(context).pop();
});
- 3、界面返回问题
需求:禁用掉iOS侧滑返回功能,监听安卓虚拟按键,监听返回按钮
WillPopScope,在fultter 中专门拦截返回导航键,我们的操作都是基于他的
使用了这个控件之后,iOS中的侧滑返回会失效,Nav上的返回事件和安卓虚拟返回按键都会监听到,可以在里面做想要的处理,例如,点击两次退出app,回传数据等
/// 控件介绍
const WillPopScope({
Key key,
@required this.child, // 可以将界面写到这里
@required this.onWillPop, // 在这里处理返回事件
}) : assert(child != null),
super(key: key);
/// 具体用法
/// .........
@override
Widget build(BuildContext context) {
return WillPopScope(
child: Scaffold(
body: Container(
child: Text('WillPopScope使用介绍')
),
),
onWillPop: _requestPop
);
}
// 手动处理返回事件
Future _requestPop() async{
Navigator.pop(context);//返回上一个界面
return Future.value(false); // false 则不退出,true 退出
}
- 4、退出应用
SystemNavigator.pop()
使用上述3中的WillPopScope监听返回按钮,在onWillPop中处理退出问题。
/// 导入包
import 'package:flutter/services.dart';
/// .........
@override
Widget build(BuildContext context) {
return WillPopScope(
child: Scaffold(
body: Container(
child: Text('退出应用')
),
),
onWillPop: _requestPop
);
}
/// 返回按钮点击事件
Future _requestPop() async{
SystemNavigator.pop();;//退出应用
return Future.value(false);
}
- 5、字体去除下滑线
有时候在一些Widget中,字体会默认自带下滑线,去除的方法是在style属性中设置decoration
Text('字体去除下滑线',style: TextStyle( decoration: TextDecoration.none))
- 6、获取系统语言
在做国际化的时候会需要获取当前的系统语言和地区信息,框架有提供方法,我们可以用下面方法获取语言和地区
// 获取本地语言类型
Locale locale = Localizations.localeOf(context);
String localLanguage = locale.languageCode; // 语言 en-英文 zh-中文
String localCountry = locale.countryCode; // 地区
- 7、设置版本号不生效
Flutter 版本号控制在 pubspec.yaml 里面,
version: 1.0.1+1 #版本号和buildNumber
设置后不生效执行清除后重新安装
1、修改后执行flutter get
2、执行flutter clean
3、重新build安装
- 8、打包
iOS打包时先在项目路径下执行如下命令,执行命令的时候Xcode保持关闭,执行结束后再打开Xcode打包
flutter clean
flutter build ios --release
Android打包可以直接在项目中打包,配置好密钥等信息后直接执行,注意storeFile路径中不能有中文
flutter build apk
- 9、判断平台
import 'dart:io';
void getPlatform(){
if (Platform.isIOS){
}else if (Platform.isAndroid){
}
}
- 10、TextField设置高度后hintText居中
TextField设置高度小于默认高度后会出现hintText不居中的情况,经过一番摸索后发现InputDecoration中contentPadding设置padding即可
TextField(
decoration: InputDecoration(
hintText: "用户名或邮箱",
border: InputBorder.none, // 去掉下滑线
contentPadding: EdgeInsets.all(0)
),
- 11、图片设置圆角
实现图片圆角有多种办法,但是这种是目前发现最简单的一种
ClipRRect (
borderRadius: BorderRadius.circular(4),
child: Image.asset("images/header.png"),
),
三、其他代码无关
- 1、等待异常
Waiting for another flutter command to release the startup lock...
有时候会出现如上等待其他指令执行,但是久久不能好,这个时候关闭IDE也是无效的,具体解决办法可以找到flutter路径,删除路径下的lockfile文件,删除之后再运行,我的文件地址为/Users/xxxxxx/app/flutter/bin/cache/lockfile
2、判断运行模式,debug Or release
有时候我们希望代码只在debug模式下运行,例如打印信息等,这个时候我们就需要判断一下当前的运行模式了,然后对各种情况做处理,
具体的用 assert和编译常数kReleaseModel判断,参考
Flutter 编译模式debug和release判断3、Xcode运行空白报错 Could not create Dart VM instance.
2019-09-23 16:50:13.088675+0800 Runner[1474:642130] [VERBOSE-2:dart_vm_data.cc(19)] VM snapshot invalid and could not be inferred from settings.
2019-09-23 16:50:13.089348+0800 Runner[1474:642130] [VERBOSE-2:dart_vm.cc(245)] Could not setup VM data to bootstrap the VM from.
2019-09-23 16:50:13.089495+0800 Runner[1474:642130] [VERBOSE-2:dart_vm_lifecycle.cc(89)] Could not create Dart VM instance.
2019-09-23 16:50:13.090369+0800 Runner[1474:642130] [VERBOSE-3:shell.cc(212)] Check failed: vm. Must be able to initialize the VM.
(lldb)
如上图所示,选择Release模式运行
四、外文链接
有很多文章也进行了很棒的总结,这里贴出地址
- Flutter开发中的一些Tips
- Flutter开发中的一些Tips2
- Flutter开发中的一些Tips(三)