Flutter入门
调试Flutter
- 查看可用设备
flutter devices
- 运行flutter在相关设备
flutter run
一.App结构
- pMaterialApp 包含app的基本骨架
- Scaffold 包含app的脚手架
MaterialApp
- title (任务管理器中的标题)
- home(主内容)
- debugShowCheckedModeBanner (是否显示左上方调试标记)
Scaffold
- appBar (应用头部)
- body (应用主体)
- floatingActionButton (浮动按钮)
- drawer (左侧抽屉菜单)
- endDrawer (右侧抽屉菜单)
- bottimNavigationBar (底部导航栏)
二.文本组件
- Text
- TextDirection (文本方向)
- TextStyle (文本样式)
- Colors (文本颜色)
- FontWeight (文字粗细)
- FontStyle (文本样式)
- TextAlign (文本对齐)
- TextOverflow (文本溢出)
- maxLines (指定显示的行数)
- RichText与TextSpan (一般配合使用—给一段文本采用不同的样式)
三.自定义字体
在flutter根目录下创建fonts文件夹,将字体文件放入
在pubspec.yaml中声明字体
在lib文件夹下的MaterialApp中
MaterialApp(
theme: ThemeData(fontFamily: "配置的名字")
)
Text(
theme: ThemeData(fontFamily: "配置的名字")
)
四.常用Icon
Icon(Icon.具体名称)
五.Color
采用ARGB来声明颜色
const Color(0xFF42A5F5); //16进制的ARGB = 透明度 + 六位十六进制颜色
const Color.fromARGB(0xFF,0x42,0xA5,0xF5);
const Color.fromARGB(255,66,165,245);
const Color.fromRGBO(66,165,245,1.0);
六.Container
盒子模型
- child (声明子组件)
- padding (margin)
- EdgeInsets (all()、fromLTRB()、only()) —边缘填充
- decoration (修饰盒子模式)
- BoxDecoration(边框、圆角、渐变、阴影、背景色、背景图片)
- alignment (对盒子里面的内容进行对齐的)
- Alignment (内容对齐)
- tramsform (变形)
- Matrix4(平移-translate、旋转-rotate、缩放-scale、斜切-skew)
七.线性布局
- Column
- Column中的主轴方向是垂直方向
- mainAxisAlignment: MainAxisAlignment 主轴对齐方式
- crossAxisAlignment: CrossAxisAlignment 交叉轴对齐方式
- children: 内容
- Row
- Row中的主轴方向是水平方向(其他属性与Column一致)
八.弹性布局
- Flex
- direction (声明主轴方向)
- mainAxisAlignment (声明主轴对齐方式)
- textDirection (声明水平方向的排列顺序)
- crossAxisAlignment (声明交叉轴对齐方式)
- verticalDirection (声明垂直方向的排列顺序)
- children (声明子组件)
- Expanded (可伸缩组件)
- flex (声明弹性布局的所占比例)
- child (声明子组件)
九.流式布局
- Wrap (解决内容溢出问题)
- spacing (主轴方向子组件的间距)
- alignment (主轴方向的对齐方式)
- runSpacing (纵轴方向子组件的间距)
- runAlignment (纵轴方向的对齐方式)
十.层叠布局
-
Stack (层叠组件 - 类似css中的z-index)
- alignment (声明未定位子组件的对齐方式)
- textDirection (声明未定位子组件的排列顺序)
-
Positioned (绝对定位组件)
- child (声明子组件)
- left、top、right、bottom
- width、height
十一.Card
-
Card (卡片)
-
child (子组件)
-
color (背景色)
-
shadowColor (阴影色)
-
elevation (阴影高度)
-
shape (边框样式)
-
margin (外边距)
-
-
ListTile (列表瓦片)
- leading (头部组件)
- title (标题)
- subtitle (子标题)
Card(
margin: EdgeInsets.all(30),
color: Colors.purpleAccent[100],
shadowColor: Colors.yellow,//阴影颜色
elevation: 2,//阴影高度
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(40),
side: BorderSide(
color: Colors.yellow,
width: 3
)
),
child: Column(
children: [
ListTile(
leading: Icon(
Icons.supervised_user_circle,
size: 50,
),
title: Text(
"张三",
style: TextStyle(
fontSize: 30
),
),
subtitle: Text(
"董事长",
style: TextStyle(
fontSize: 20
),
),
),
Divider()
,
ListTile(
title: Text(
"电话: 13333333333",
style: TextStyle(
fontSize: 20
),
),
),
ListTile(
title: Text(
"地址: XXXXXXXX",
style: TextStyle(
fontSize: 20
),
),
)
],
),
),
十二.Button
- TextButton (文本按钮)
- ElevatedButton (凸起按钮)
- OutlinedButton (轮廓按钮)
- IconButton (图标按钮)
- ButtonBar (按钮组)
- FloatingActionButton (浮动按钮)
- BackButton (回退按钮)
- CloseButton (关闭按钮)
其他按钮也有图标按钮的命名构造函数形式:
- TextButton.icon()
- ElevatedButton.icon()
- OutlinedButton.icon()
声明按钮主题组件
- TextButtonTheme
- ElevatedButtonTheme
- OutlinedButtonTheme
常用样式
1.按钮内写样式
TextButton(
onPress:(){},
child: Text("常用按钮样式"),
//样式属性
style: ButtonStyle(
//设置按钮里的文字样式
textStyle: MatericalStateProperty.all(
TextStyle(
fontSize: 30
)
),
//设置前景色样式
//MatericalStateProperty.resolveWith根据状态来动态设置样式
//state的状态值,比如当前有没有点击按钮
foregroundColor: MatericalStateProperty.resolveWith((state)=>{
if(states.Contains(MaterialState.pressed)){
//按下按钮时的前景色
return Colors.red;
}
//默认状态的颜色
return Colors.blue;
}),
backgroundColor: MatericalStateProperty.resolveWith((state)=>{
if(states.Contains(MaterialState.pressed)){
//按下按钮时的背景色
return Colors.red;
}
//默认状态的颜色
return Colors.blue;
}),
//设置阴影颜色
shadowColor: MatericalStateProperty.all(Colors.yellow),
//设置阴影的像素
elevation: MatericalStateProperty.all(20),
//设置边框
side: MatericalStateProperty.all(
BorderSide(
color: Colors.green,
width: 2
)
),
//声明按钮的形状
shape: MatericalStateProperty.all(
//设置圆角效果 ---StadiumBorder自动生成圆角
StadiumBorder(
side: BorderSide(
color: Colors.green,
width: 2
)
)
//设置圆形效果
/*CirCleBorder(
side: BorderSide(
color: Colors.green,
width: 2
)
)*/
),
//设置按钮大小,Size(“宽度”,"高度")中
minimumSize: MatericalStateProperty.all(Size(150,60)),
//设置水波纹的颜色
overlayColor: MatericalStateProperty.all(Colors.purple)
)
)
2.通过主题写样式
OutlinedButtonTheme(
data: OutlinedButtonThemeData(
style: ButtonStyle(
overlayColor: MaterialStateProperty.all(Colors.blue)
)
),
child: OutlinedButton(
onPressed: (){
print("点击 OutlinedButton");
},
onLongPress: (){
print("长按 OutlinedButton ");
},
child: Text("OutlinedButton")
),
),
十三.图片
- Image.asset (加载本地照片)
- Flutter项目下,创建图片存储目录
- 在pubspec.yaml中的flutter部分添加图片配置
- 在代码中加载图片
- Image.network (加载网络照片)
- 设置网络访问权限
- 允许http协议访问
Image.asset('images/1.jpg',
width:100,
height:100,
//表示是会填充容器,容易失真
fit: BoxFit.fill,
//图片与背景颜色混合效果
colorBlendMode: BlendMode.colorDodge,
//设置背景图片
color: Colors.green,
)
十四.列表
1. SingleChildScrollView
- SingleChildScrollView
- child (子组件)
- padding (内边距)
- scrollDirection (滚动方向: Axis.horizontal | Axis.vertical)
- reverse (初始滚动位置,false 头部、true 尾部)
- physics
- ClampingScrollPhysics: Android 下微光效果
- BouncingScrollPhysics: IOS 下弹性效果
2.ListView
-
加载所有列表组件
-
ListTile(leading,title,subtitle,trailing,selected)
-
leading (图标)
-
title (标题)
-
subtitle (子标题)
-
trailing (右边的图标)
-
selected (是否选中)
-
selectedColor (选中颜色)
-
selectedTileColor (ListTile的背景颜色)
-
3.ListView.builder
-
按需加载组件,性能比默认构造函数高
-
需要放在一个容器里
-
Container( height:200, child: ListView.builder( itemCount:,//数组的长度 itemExtent://每一项的高度 itemBuilder: (context,index){ return //返回集合中每个组件 } ) )
-
4.ListView.separated
-
多了分割线
-
Container( height:200, child: ListView.separated( itemCount:,//数组的长度 itemExtent://每一项的高度 itemBuilder: (context,index){ return //返回集合中每个组件 }, //分割器的构造器 separatorBuilder: (context,index){ return Divider( color: Colors.blue, //分割线的高度 thickness: 2, ); } ) )
5.GridVIew(网格布局)
- children (子组件)
- scrollDirection (滚动方向)
- gridDelegate
- SliverGridDelegateWithFixedCrossAxisCount (指定列数 - 子组件宽度自适应)
- crossAxisCount (指定列数)
- mainAxisSpacing (主轴间距)
- crossAxisSpacing (交叉轴间距)
- childAspectRatio (子组件的宽高比例)
- SliverGridDelegateWithFixedCrossAxisExtent (指定子组件宽度 - 列数自适应)
- maxCrossAxisExtent (子组件的宽度)
- mainAxisSpacing (主轴间距)
- crossAxisSpacing (交叉轴间距)
- childAspectRatio (子组件的宽高比例)
- SliverGridDelegateWithFixedCrossAxisCount (指定列数 - 子组件宽度自适应)
6.GridView.count (列数固定)
7.GridView.extent (子组件宽度固定)
8.GridView.builder (动态网格布局)
需要指定数量
GridView,builder(
itemCount:,//数量
itemBuilder: (context,index){
return _数组[index]
}
)
常用属性
- physics
- ClampingScrollPhysics: Android 下微光效果
- BouncingScrollPhysics: IOS 下弹性效果
十五.第三方组件
使用第三方组件需要在 pubsepc.yaml中添加 对应名称 依赖
安装依赖(pub get | flutter packages get | vscode中保存配置,自动下载)
在相关Dart文件引入
1.dio
dio是一个强大的Dart Http 请求库 (类似axios)
//示例代码
void getIpAddress() async {
try {
final url = "https://httpbin.org/ip";
Response response = await Dio().get(url);
String ip = response.data['origin'];
print(ip);
}catch(e){
print(e);
}
}
2.Flutter-swiper
轮播组件
平面轮播图
Swiper(
itemCount: imgs.length,
itemBuilder: (context,index){
return Image.asset(
imgs[index],
fit: BoxFit.cover
);
},
pagination: SwiperPagination(),//轮播图的指示点
control: SwiperControl()//左右箭头导航
)
3D轮播图
Swiper(
itemCount: imgs.length,
itemBuilder: (context,index){
return Image.asset(
imgs[index],
fit: BoxFit.cover
);
},
viewportFraction: 0.7,
scale: 0.7
)
3.shared_perferences
shared_perferences是一个本地数据缓存库
使用需要获取示例
SharedPreferences prefs = await SharedPreference.getInstance();
- 增
- setString(key,value)
- 删
- remove(key) | clear()
- 改
- setString(key,value)
- 查
- getString(key)
十六.状态管理
1.StatefulWidget
-
Flutter中的组件,按照状态划分
- StatelessWidget (无状态组件)
- StatefulWidget (状态组件)
-
按照作用域划分
- 组件内私有状态 (StatefulWidget)
- 跨组件状态共享 (InheritedWidget、Provider)
- 全局状态 (Redux | fish-redux 、 Mobx)
-
状态组件的组成
-
StatefulWidget (组件本身不可变 - @immutable)
class MyState extends StatefulWidget { const MyState({super.key}); State<MyState> createState() => _MyStateState(); }
-
State (将变化的状态放到State中去维护)
class _MyStateState extends State<MyState> { //定义变量 int _num = 0; void _increment(){ //通过serState来写逻辑 setState(() { _num++; }); } Widget build(BuildContext context) { return Center( child: Column( children: [ Padding( padding: EdgeInsets.all(20), child: Text("数字 $_num"), ), ElevatedButton( onPressed: _increment, child: Icon(Icons.add)) ], ), ); } }
-
2.DataTable
- DataTable是Flutter中的表格
- columns (声明表头列表)
- DataColumn (表头单元格)
- rows (表头单元格)
- DataRow (一行数据)
- DataCell(数据单元格)
- DataRow (一行数据)
- 其他属性
- columns (声明表头列表)
3.InheritedWidget
-
What: 提供了沿树向下,共享数据的功能
- 即子组件可以获取父组件(InheritedWidget的子类)的数据
-
Why:
- 依赖构造函数传递数据的方式不能满足业务需求
- 所以,需要一个新的解决方案
-
How:
BuildContext.dependOnInheritedWidgetOfExactType<MyInheritedWidget>()
4.生命周期
5.Provider
-
使用:
- 安装Provider(第三方库)
- 安装数据模型 (T extends ChangeNotifier)
- 创建 Provider (注册数据模型)
- Provider() //不会被要求随着变动而变动
- ChangeNotifierProvider() //随着某些数据改变而被通知更新
- 获取数据模型并更新ui
- 通过上下文 (BuildContext)
- 通过静态方法 ( Provider.of(Context) )
-
Provider是对InheritedWidget的封装
- https://pub.dev.packages/provider
-
优点:
- 简化资源的分配与处置
- 懒加载
-
实现原理
十七.路由
1.路由简介
- Route
- 一个路由是一个屏幕或页面的抽象
- Navigator
- 管理路由的组件。Navigator 可以通过路由由入栈和出栈来实现页面跳转
- 常用属性
- InitialRoute: 初始路由,即默认页面
- onGenerateRoute: 动态路由 (根据规则,匹配动态路由)
- onUnknowRoute: 未知路由,也就是404
- routes: 路由集合
2.匿名路由
-
Navigator
-
push (跳转到指定组件)
Navigator.push( context, MaterialPageRoute(builder: (contexr) => 组件名称()) )
-
pop (回退)
Navigator.pop(context)
-
3.命名路由
- 声明路由
- routes路由表 (Map类型)
- initialRoute (初始路由)
- onUnknownRoute (未知路由 - 404)
- 跳转到命名路由
- Navigator.pushNamed(context,‘路由名称’);
4.动态路由
- 动态路由是指,通过 onGenerateRoute属性指定的路由
其他
- Chip (标签)
- CircleAvatar (圆形头像)
- NetworkImage (网络图片组件)
- 在安卓默认不会访问http协议的图片,可以在AndroidManifest.xml中
-
Material
- 安卓风格的组件
- import ‘package:flutter/material.dart’
-
Cupertino
- IOS风格的组件
- import ‘package:flutter/cupertino.dart’
-
如何判断环境?
//引入核心库 import 'dart:io' Widget dialogBox; //判断当前平台的信息 if(Platform.isIos){ //加载IOS风格组件 }else if (Platform.isAndroid){ //加载Android风格的组件 }
-
SafeArea
- SafeArea可以有效解决异形屏的问题(刘海屏)