Flutter零基础入门
提示语法错误,检查是否有const
修饰,他不能修饰可变的东西。
Flutter项目基本介绍
pubspec.yaml
:依赖包管理文件,添加依赖后,点击`Pub get可以进行下载添加的依赖。
1 | name: draft #包名或项目名 |
控件(material)
TextField 输入框
1
2
3
4
5
6
7child: TextField(
obscureText: true,
decoration: InputDecoration(
border: OutlineInputBorder(), //边框样式
labelText: '用户名', //提示标签
),
),Text 文本框
1
child: Text("欢迎登录"),
TextButton 按钮
1
2
3
4
5
6child: TextButton(
onPressed: (){
print("点击了");
},
child: const Text("登录")
)Autocomplete 自动补齐输入框框(带下拉搜索输入框)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18child: Autocomplete<Soft>(
displayStringForOption: (Soft option) => option.name, //输入框显示的值
optionsBuilder: (TextEditingValue textEditingValue) {
return HttpUtil().getSoftListString(
context, "20", textEditingValue.text.toLowerCase());
}, //选项构建,数据来源支持异步
fieldViewBuilder: (context, textEditingController, focusNode, onFieldSubmitted) {
return TextField(
controller: textEditingController, //传递
focusNode: focusNode, //传递
decoration: const InputDecoration(
border: OutlineInputBorder(), labelText: '软件'),
); //自定义样式
}, //输入框自定义
onSelected: (Soft selection) {
versionController.text = selection.version;
}, //选中回掉
),Image图片显示
1
Image(image: NetworkImage('url'))
GestureDetector 给一个控件添加一个事件
1
2
3
4GestureDetector(
onTap:() //触摸事件
child: //给该child添加一个触摸事件
)
布局(layout)
Column
:列布局Row
:行布局1
2
3
4
5
6Column( //或者Row布局
children: [
const Text('行一'),
const Text('行二'),
]
)CustomScrollView:滚动布局
1
2
3
4
5
6
7
8
9
101. 继承State
2. 设置中心key
3. 触发setState((){num++}) 动态更新布局
4. 基础结构:
CustomScrollView
center:
slivers:[
SliverList(key: centerKey,delegate:SliverChildBuilderDelegate(childCount:num)),//num是指重复布局几个
SliverList()),
]
启动类
1 | import 'package:flutter/material.dart'; |
一个页面(类)基本结构
1 | import 'package:flutter/material.dart'; |
简单页面跳转
1 | //跳转到Home页面 |
多复杂页面跳转-路由(router)
1 | //-----主页面 |
获取输入框的值
方法一:定一个变量,然后通过输入框的
onChanged
设置值到变量,然后获取方法二:设置
controller
1
2
3
4
5TextEditingController userNameController =TextEditingController(); //定义controller
TextField(
controller: userNameController, //设置controller
)
print("输入了${userNameController.text}"); //获取controller的值
toast提示框-fluttertoast
- 添加依赖
fluttertoast: ^8.0.9
- 导包
import 'package:fluttertoast/fluttertoast.dart';
- 使用
Fluttertoast.showToast(msg: "请登录");
网络请求-dio框架
在
pubspec.yaml
的dependencies
下添加依赖dio: ^4.0.6
,然后点击文件顶部Pub get
更新依赖导入包
import 'package:dio/dio.dart';
简单使用
1
2
3
4
5
6/// 登录请求
Future<Response> loginPost(String userName, String password) async {
Response response = await Dio.post('/api/v1/user/login',
data: {'username': userName, 'password': password});
return response;
}
文件选择-File Picker
1 | ///选择图片文件 |
文件压缩-flutter_native_image
1 | File compressedFile = await FlutterNativeImage.compressImage(file.path, |
缓存-文件模式-shared_preferences
工具类用Sputil
问题
如下错误:
1
2Error: Not a constant expression.
onPressed: (){},解决:
Not a constant expression
关键字const
,使用const
修饰的变量及方法不能包含可变的,所以onPressed
就不可以使用了,const
关键字使用要点- 不可修改
- 编译期初始化
- const 构造函数
错误:
Navigator operation requested with a context that does not include a Navigator.
解决:启动类添加
MaterialApp
包括,修改如下1
2
3
4
5void main() {
runApp(const MaterialApp(
home: Login(),
));
}flutter 如何动态更新界面或控件?
解决:使用
setState((){})
flutter如何重新加载主页?
解决:使用
Navigator.pushReplacementNamed();
或Navigator.popAndPushNamed()
flutter的File Picker如何选择相册?
解决:设置
type
为FileType.image
,完整示例FilePickerResult? result = await FilePicker.platform.pickFiles(type: FileType.image);
dio如何开启网络请求日志?
解决:添加过滤器
_dio.interceptors.add(LogInterceptor(responseBody: true, requestBody: true)); //debug开启权限日志
flutter如何获取输入框的值,或者动态修改输入框的值?
解决:添加公共变量
TextEditingController versionController = TextEditingController();
然后在TextField设置controller: versionController,
最后在其他地方获取或设置输入框的值versionController.text
Row
布局如何按比例分配空间大小?解决:添加
Expanded
包装控件,然后设置flex比例,例如1:2
如何修改输入框提示文字的颜色?
解决:添加
labelStyle: TextStyle(color: Colors.amberAccent)
属性