一些杂项
常用插件
logger:日志打印fluttertoast:吐司弹窗carousel_slider:轮播图intl:时间格式化image_picker:图片选择flutter_screenutil:屏幕适配flutter_html:渲染 HTML(需要更改配置文件(配置文件位于android/app/build.gradle)minSdkVersion版本为 19,默认值为flutter.minSdkVersion,同时添加配置项multiDexEnabled的值为true)async:一个异步包,增强了dart:async
常用操作
软键盘
- 强制关闭软键盘:
FocusScope.of(context).requestFocus(FocusNode()); - 使用
FocusNode管理聚焦状态
class MyPage extends StatefulWidget {
_MyPageState createState() => _MyPageState();
}
class _MyPageState extends State<MyPage> {
final _focusNode = FocusNode();
void dispose() {
_focusNode.dispose();
super.dispose();
}
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("我的页面"),
),
body: TextField(
focusNode: _focusNode,
decoration: InputDecoration(
hintText: "请输入文本",
),
),
);
}
}
使用 iconfont 图标
- 引入字体文件
fonts:
- family: Iconfont
fonts:
- asset: assets/fonts/iconfont.ttf
- 在页面上使用
// 0x 为固定,e6cd 为图标的 unicode 码
Icon(
IconData(0xe6cd, fontFamily: 'Iconfont'),
size: 20.0,
color: Colors.pink,
)
退出程序
import 'package:flutter/services.dart';
SystemNavigator.pop(); // 仅适用于 Android 和 iOS 平台
计时器
需要用到 Timer.periodic() 方法
import 'dart:async';
class BodyWidget extends StatefulWidget {
const BodyWidget({super.key});
State<BodyWidget> createState() => _BodyWidgetState();
}
class _BodyWidgetState extends State<BodyWidget> {
int _counter = 10;
dynamic _timer;
var _codeText = '获取验证码';
void _stopTimer() {
if (_timer != null) {
_timer.cancel();
setState(() {
_counter = 0;
_timer = null;
_codeText = '获取验证码';
});
}
}
void _startTimer() {
if (_timer != null) {
return;
}
_timer = Timer.periodic(const Duration(seconds: 1), (timer) {
setState(() {
_counter -= 1;
_codeText = '$_counter秒后重发';
});
if (_counter < 1) {
_stopTimer();
}
});
}
void dispose() {
if (_timer != null) {
_timer.cancel();
}
super.dispose();
}
Widget build(BuildContext context) {
return TextButton(
onPressed: () {
_startTimer();
},
child: Text(_codeText),
);
}
}