Post

一文带您搞定flutter常用控件

持续更新中(有空的话😄)。。。

Widget的典型属性表

属性类型作用其他
alignmentAlignment对齐方式Alignment值:
topCenter、topLeft、topRight:顶部居中、左、右对齐
center、centerLeft、centerRight:水平垂直居中、左、右对齐
bottomCenter、bottomLeft、bottomRight:底部居中、左、右对齐
backgroundColorColor背景色 
childWidget子Widget 
childrenList<Widget>子Widget集 
colorColor颜色常用于背景色
curveCurve动画运动曲线 
clipBehaviorClip裁剪方式Clip值:
none
hardEdge裁剪不抗锯齿
antiAlias裁剪抗锯齿
antiAliasWithSaveLayer裁剪抗锯齿,保存saveLayer
decorationDecoration装饰器比如BoxDecoration({color,/*背景*/
border,borderRadius,boxShadow,/*阴影*/
gradient,/*背景渐变(LinearGradient、RadialGradient)*/
image:背景图(用DecorationImage)
backgroundBlendMode,shape = BoxShape.rectangle})
dragStartBehaviorDragStartBehavior拖动行为什么时候正式开始dragStartBehavior值:
start滚动或拖动行为将在检测到拖动手势时开始
down则在首次检测到down事件时开始
durationDuration时长比如动画时长
directionAxis排列方向Axis枚举:
horizontal
vertical
elevationdouble阴影深度 
foregroundColorColor前景色 
physicsScrollPhysics滑动效果比如:BouncingScrollPhysics、ClampingScrollPhysics
paddingEdgeInsetsGeometry四周填充占用自身空间
shapeShapeBorder形状比如圆角长方行:RoundedRectangleBorder
shadowColorColor阴影颜色 
surfaceTintColorColor叠加色useMaterial3=true才有效
将surfaceTintColor(还有elevation)和backgroundColor调用Color.alphaBlen混合
semanticLabelString语义化标签 
textStyleTextStyle文本样式 
transformMatrix4位移、缩放、旋转等比如: Matrix4.rotationZ(0.2)
tooltipString长按时弹出的提示 
verticalDirectionVerticalDirection垂直方向排列方式VerticalDirection:
down
up
width、heightdouble宽、高 
marginEdgeInsetsGeometry四周边缘不占用自身空间

ShapeBorder 汇总

名称作用例子其他
BeveledRectangleBorder斜角矩形/菱形/矩形边框BeveledRectangleBorder(
side: BorderSide(width: 1, color: Colors.green),
borderRadius: BorderRadius.circular(10))
菱形:设置半径大于控件
矩形:半径=0
CircleBorder圆形CircleBorder(side: BorderSide(color: Colors.green)) 
ContinuousRectangleBorder连续的圆角矩形(直线和圆角平滑连续的过渡)ontinuousRectangleBorder(
side: BorderSide(color: Colors.red),
borderRadius: BorderRadius.circular(10))
和RoundedRectangleBorder相比,圆角效果会小一些
RoundedRectangleBorder圆角矩形RoundedRectangleBorder(
side: BorderSide(color: Colors.red),
borderRadius: BorderRadius.circular(10))
 
StadiumBorder胶囊形状tadiumBorder(side: BorderSide(color: Colors.red)) 
OutlineInputBorder带外边框utlineInputBorder(
borderSide: BorderSide(color: Colors.red),
borderRadius: BorderRadius.circular(10))
 
UnderlineInputBorderUnderlineInputBorder(borderSide: BorderSide(color: Colors.red))  

BoxDecoration

常用Widget表

分类widget用途
入口风格  
 MaterialAppmaterial 风格app
脚手架  
 Scaffold脚手架
 AppBar头部导航栏
      Tab条  
 TabBarAppBar下的Tab条
 TabTabBar的子项
 TabBarView配合TabBar使用
 DefaultTabController傻瓜版的TabBar、TabView联动Widget
      抽屉  
 Drawer抽屉
 DrawerHeader抽屉头部
 UserAccountsDrawerHeader典型的显示账户头像等信息的抽屉头部
 NavigationDrawerMaterial 3规范抽屉
 NavigationDrawerDestinationNavigationDrawer子项
      底部导航  
 BottomNavigationBar底部导航条
 BottomNavigationBarItem底部导航条子项
 NavigationBarMaterial 3规范的底部导航条
 NavigationDestinationNavigationBar子项
容器  
 Container容器
 Align按某种方式对齐子组件
 Center居中对齐子组件
 SizeBox设置子组件大小
 ColorBox设置子组件颜色
 Padding设置子组件Padding
 DecoratedBox装饰子组件
 ConstrainedBox对子组件添加约束
 Card卡片样式
 AspectRatio设置子组件宽高比
 FittedBox忽略父组件传递的约束,允许子组件无限大
 Transform矩阵变换子组件
      裁剪  
 ClipRect默认裁剪掉子组件布局空间之外的绘制内容(溢出部分)
 ClipOval裁剪子组件成内贴椭圆
 ClipRRect裁剪子组件为圆角矩形
 ClipPath按照路径裁剪
 CustomClipper抽象类,使用CustomClipper可以绘制出任何我们想要的形状
布局  
 Flex弹性布局
 Expanded只能用于Flex的子组件,按比例填充Flex空间
 Row水平排列
 Column垂直排列
 Wrap子组件在主轴不够容纳时自动向副轴排列
 Flow 
 Stack层叠布局
 Positioned绝对位置布局
 Image图片
 CircleAvatar圆角子组件
 IconIcon
按钮  
 TextButton文本按钮
 ElevatedButton带阴影、灰色背景按钮
 Switch开关按钮
 SwitchListTile具有title、subtitle的Switch
 CheckBox复按钮
 CheckboxListTile用于创建复选按钮组合
 Radio单按钮
 RadioListTile用于创建单选按钮组合
 DropdownButton下拉选择框按钮
 Slider滑块
 SliderTheme滑块自定义
进度条  
 LinearProgressIndicator条状进度条
 CircularProgressIndicator圆形进度条
文本、表单  
 Text文本显示
 TextField文本输入框
 From表单
 TextFormField用在From里的输入框
 DropdownButtonFormField用在From里的输入框
列表  
 ListView列表组件
 ListTitle常用于构造ListView的子项
 Divider常用在ListView的分割线
 GridView网格列表
 AnimatedList带动画删除增加的ListView
 PageView页面左右、上下滑动效果
对话框  
 Dialog对话框基类
 AlertDialog提示对话框
 SimpleDialog列表对话框
 SimpleDialogOptionSimpleDialog的子项
 BottomSheetSimpleDialog的子项
菜单  
 PopupMenuButton弹出菜单按钮
 PopupMenuItemPopupMenuButton子项
 CheckedPopupMenuItemPopupMenuButton多选子项
 PopupMenuDivider菜单分隔线
 DropdownMenu下拉菜单
动画  
      隐式动画  
 AnimatedContainer属性更改执行动画
 AnimatedAlignalignment属性更改执行动画
 AnimatedPaddingPadding属性更改执行动画
 AnimatedPositionedPositioned属性更改执行动画
 AnimatedOpacity属性opacity更改执行动画
 AnimatedDefaultTextStyle子组件的TextStyle修改则执行动画
 AnimatedSwitcher内部子组件更改时执行动画
      显式动画  
      Hero动画  
 Hero实现点击某一个widget飞入切换到另外一个页面效果
其他  
 Stepper步骤显示器
 Offstage控制组件隐藏/可见(offstage=true)的组件
不能保存组件的状态;隐藏时不占空间
 Visibility控制组件隐藏/可见的组件
能保存组件的状态
 PopScope拦截页面返回

入口风格

MaterialApp

material 风格app

属性

属性类型作用其他
titleStringapp标题 
themeThemeData主题 
homewidget首页 
initialRouteString初始路由和home二选一
onGenerateInitialRoutesInitialRouteListFactory生成初始化路由若设置了initialRoute,则用initialRoute
routesMap<String,WidgetBuilder>路由表 
onGenerateRouteRouteFactory路由配置钩子和routes二选一
onUnknownRouteRouteFactory未知路由钩子 
navigatorObserversList<NavigatorObserver>路由跳转监听器 
themeThemeData主题 
debugShowCheckedModeBanner右上角是否显示调试标识  
builderWidget Function(BuildContext context, Widget? child)在 MaterialApp 的子组件之上插入其他组件 
localeLocale当前语言设置 
localizationsDelegatesIterable<LocalizationsDelegate<dynamic>>本地化资源的委托列表 
supportedLocalesList<Locale>支持的语言 
localeListResolutionCallbackLocaleListResolutionCallback监听系统语言切换事件一些系统可设置多语言列表,默认以第一个列表为默认语言
localeResolutionCallbackLocaleResolutionCallback监听系统语言切换事件 
debugShowMaterialGridbooldebug 模式下展示基线网格 
showPerformanceOverlaybool显示性能叠加用于性能测试
checkerboardRasterCacheImagesbool打开栅格缓存图像的棋盘格 
checkerboardOffscreenLayersbool打开渲染到屏幕外位图的层的棋盘格 
showSemanticsDebuggerbool打开显示可访问性信息的叠加层展示组件之间的关系、占位大小
shortcutsMap<ShortcutActivator, Intent>?注册快捷键map里的key、value是快捷键和意图
actionsMap<Type, Action<Intent>>?对注册的快捷键执行动作map里的key、value是快意图和对应的执行动作
scrollBehaviorScrollBehavior设置统一的滚动效果比如根据ios、android设置Overshoot或Bouncing效果

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
static final pages = {
"/": (ctx) =>  const HomePage(),
"/search": (ctx, args) => SearchPage(arg0: args),
};
MaterialApp(
    debugShowCheckedModeBanner: false,
    themeMode: ThemeMode.light,
    title: "gold.duo's App",
    initialRoute: '/',
    //home,
    //routes: {
    //    "/": (context) => const HomePage( "首页"),
    //    '/search': (context,args) => SearchPage(arg0: args),
    //},
    onGenerateRoute: (s) {
        final Function? fn = pages[s.name];
        if (fn == null) return null;
        final arg = s.arguments;
        return MaterialPageRoute(builder: arg == null ? (c) => fn(c) : (c) => fn(c, arg));
    },
      shortcuts: {
        LogicalKeySet(LogicalKeyboardKey.control, LogicalKeyboardKey.keyC): const CopyIntent()
      },
      actions: {
        CopyIntent: CallbackAction(onInvoke: (Intent intent) => print("copy!"))
      }
)

脚手架

Scaffold

脚手架。提供应用的一个整体风格、框架/骨骼。

属性

属性类型作用其他
appBarPreferredSizeWidget导航栏 
primaryboolAppBar向上移动到系统状态栏下面 
bodyWidget页面body 
drawerWidget左抽屉 
onDrawerChangedvoid Function(bool)左抽屉打开关闭回调 
endDrawerWidget右抽屉 
onEndDrawerChangedvoid Function(bool)右抽屉打开关闭回调 
bottomNavigationBarWidget底部导航条 
floatingActionButtonWidget浮动按钮 
floatingActionButtonLocationFloatingActionButtonLocation浮动按钮位置可以用来定位到BottomNavigationBarItem的某个元素上
floatingActionButtonAnimator 悬浮按钮动画 
persistentFooterButtonsList<Widget>底部导航上面的按钮 
persistentFooterAlignmentAlignmentDirectional底部导航上面按钮的位置 
resizeToAvoidBottomInsetbool默认为 true,防止一些小组件重复 
drawerDragStartBehavior   
extendBodyboolbody 是否延伸到底部控件 
extendBodyBehindAppBarbool为true时body 会置顶到 appbar 后如appbar 为半透明色,可以有毛玻璃效果
drawerScrimColorColor侧滑栏拉出来时,用来遮盖主页面的颜色 
drawerEdgeDragWidthdouble侧滑栏拉出来的宽度 
drawerEnableOpenDragGesturebool左侧侧滑栏是否可以滑动 
endDrawerEnableOpenDragGesturebool右侧侧滑栏是否可以滑动 
bottomSheetWidgetbottomSheet 

AppBar

头部导航栏。

属性

属性类型作用其他
leadingWidget左上角按钮 
titleWidget标题 
actionsList<Widget>右上角按钮。 
actionsIconThemeIconThemeDataactions的icon 主题 
bottomWidget标题下面,通常放tabBar 
bottomOpacitydoublebottom 透明度 
backgroundColor   
iconThemeIconThemeData图标样式 
centerTiltebool标题是否剧中显示 
automaticallyImplyLeadingbool是否自动导入左上角按钮.例如默认导入返回按钮 
flexibleSpaceWidget灵活区域常用FlexibleSpaceBar构造
相当于Android中AppBarLayout配合CoordinatorLayout实现滚动折叠效果
elevation   
shadowColor   
shape   
primaryboolAppBar向上移动到系统状态栏下面 
centerTitlebooltitle 是否居中 
excludeHeaderSemanticsbool禁用语义 
titleSpacingdoubletitle的空隙 
toolbarOpacitydoubleAppBar 透明度 
toolbarHeightdoubleAppBar 高度 

实例

1
2
3
4
5
6
7
8
9
AppBar(
    title: const Text("首页"),
    leading: const Icon(Icons.home),
    bottom: TabBar(
        tabs: tabs.map((it) => Tab(text: it)).toList()),
    actions:  <Widget>[
        const Icon(Icons.more_vert)
    ]
)

TabBar

常用于设置AppBar下的Tab条(AppBar.bottom)

属性

属性类型作用其他
tabsList<Widget>Tab集合 
controllerTabControl联动控制器 
isScrollablebool是否可滚动 
indicatorColor 指示器颜色 
indicatorWeightdouble指示器高度 
indicatorPadding bool指示器Padding 
indicatorDecoration指示器decoration比如边框
indicatorSizeTabBarIndicatorSize指示器大小计算方式枚举值:
label:跟文字等宽
tab:跟每个tab等宽
labelColor 选中label颜色 
labelStyle 选中label style 
labelPadding 每个label padding 
unselectedLabelColor 未选中label颜色 
unselectedLabelStyle 未选中label style 
onTapvoid Function(int index)点击事件 
physics   

Tab

TabBar的子项

属性

属性类型作用
textString显示文本
iconWidget显示文本下的icon
iconMargin  
height  
child  

实例

1
2
3
4
TabBar(
    controller: _tabController,
    tabs: ["推荐", "鞋靴", "箱包","运动","数码","家电"].map((it) => Tab(text: it)).toList()
)

TabBarView

配合TabBar使用。封装自PageView,用于tab点击显示的内容

属性

属性类型作用其他
children   
controllerTabController联动控制器 
physics   
dragStartBehavior   

TabBar、TabView联动

  • 方式一:用DefaultTabController

    DefaultTabController作为TabBar、TabBarView的父级Widget

  • 方式二:TabController

    • 1.TabBarView.children数量和TabBar.tabs一一对应

    • 2.Mixins SingleTickerProviderStateMixin

      1
      2
      3
      4
      5
      6
      7
      8
      
        class _TestTabBarViewtate extends State<TestTabBarView> with SingleTickerProviderStateMixin{
            late TabController _tabController;
            @override
            void initState() {
                super.initState();
                _tabController=TabController(length: tabCount, vsync: this);
            }
        }
      
    • 3.传入TabControllerTabBarTabBarView

      TabBar、TabBarView分别设置controller属性为TabController实例

实例

1
2
3
4
TabBarView(
    controller: _tabController,
    children: ["推荐", "鞋靴", "箱包","运动","数码","家电"].map((it) =>Center(child: Text(it))).toList(),
)

DefaultTabController

傻瓜版的TabBar、TabView联动Widget

属性

属性类型作用其他
child   
lengthinttab数量 
animationDurationDuration动画时长 
initialIndexint初始化选中index 

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
static const tabs=["推荐", "鞋靴", "箱包","运动","数码","家电"];
DefaultTabController(
    length: tabs.length,
    child: Scaffold(
    appBar: AppBar(
        title: const Text("首页"),
        bottom: TabBar(
            tabs: tabs.map((it) => Tab(text: it)).toList()),
    ),
    body: TabBarView(
        children: tabs.map((it) => Center(child: Text(it))).toList(),
    ),
    ))

Drawer

抽屉(通常左右边拖拉出来的菜单)

属性

属性类型作用其他
backgroundColor   
shape   
elevation   
shanowColor   
surfaceTintColor   
width   
semanticLabel   

实例

1
2
3
4
5
Drawer(
    child: Flex(direction: Axis.vertical, children: [
    const ListTile(leading: Icon(Icons.home), title: Text("主页")),
    const ListTile(leading: Icon(Icons.devices_other), title: Text("其他")),
    ]))

UserAccountsDrawerHeader

典型的显示账户头像等信息的抽屉头部

属性

属性类型作用
decoration  
accountNameWidget用户名
accountEmailWidgetemail
currentAccountPicutreWidget头像
currentAccountPictureSizeSize头像大小
otherAccountPicturesList<Widget>其他头像
otherAccountPictureSizeSize其他头像大小
margin  

实例

1
2
3
4
5
6
7
8
9
10
UserAccountsDrawerHeader(
    arrowColor: Colors.lightGreen,
    accountName: const Text("gold.duo"),
    accountEmail: const Text("gold.duo@gmail.com"),
    currentAccountPicture: Image.network('https://gold-duo.github.io/assets/logo.png',fit: BoxFit.cover),
    otherAccountsPictures: [
    Image.network('https://gold-duo.github.io/assets/logo.png'),
    Image.network('https://gold-duo.github.io/assets/logo.png'),
    ],
)

Material 3规范抽屉

属性

属性类型作用其他
selectedIndexint  
childrenList<Widget>子Widget用NavigationDrawerDestination 
onDestinationSelectedvoid Function(int index)  
backgroundColor   
surfaceTintColor   
tilePadding 子项padding 
elevation   
shadowColor   
indicatorColor   
indicatorShape 选中项形状 

实例

1
2
3
4
5
6
7
8
NavigationDrawer(selectedIndex: 1,
    onDestinationSelected:(index) {
      print("You clicked $index");
      Navigator.pop(context);
    },children: [
    const NavigationDrawerDestination(icon: Icon(Icons.home), label: Text("主页")),
    const NavigationDrawerDestination(icon: Icon(Icons.devices_other), label: Text("其他")),
  ])

NavigationDrawer子项

属性

属性类型作用
iconWidget 
selectedIconWidget 
lableStringicon右边文字
backgroundColor  

BottomNavigationBar

底部导航条

属性

属性类型作用
itemsList<BottomNavigationBarItem>底部导航条按钮集
iconSizeSizeicon图标大小
currentIndex当前选中按钮 
onTap 选中按钮回调函数
fixedColor 选中按钮颜色
typeBottomNavigationBarType枚举值:
fixed
shifting

实例

1
2
3
4
5
6
7
8
9
10
 BottomNavigationBar(
    items: const [
        BottomNavigationBarItem( icon: Icon(Icons.home), label: "首页",activeIcon: Icon(Icons.home_work_sharp)),
        BottomNavigationBarItem(icon: Icon(Icons.favorite), label: "订阅"),
        BottomNavigationBarItem(icon: Icon(Icons.shopping_cart), label: "购物车"),
        BottomNavigationBarItem(icon: Icon(Icons.person), label: "个人中心")
    ],
    currentIndex: index,
    onTap: (i) =>print("onTap $i"),
)

BottomNavigationBarItem

底部导航条子项

属性

属性类型作用其他
iconWidgeticon 
activeIconWidget选中时显示的icon 
labelStringicon下的标签 
backgroundColor   
tooltip   

Material 3规范的底部导航条

属性

属性类型作用其他
selectedIndexint  
destinationsList<NavigationDestination>  
onDestinationSelectedvoid Function(int index)  
elevation   
shadowColor   
indicatorColor   
indicatorShape 选中项形状 
height NavigationBar的高度 
labelBehaviorNavigationDestinationLabelBehavior标签显示效果枚举值:
alwaysShow、alwaysHide、onlyShowSelected

实例

1
2
3
4
5
6
7
8
9
10
NavigationBar(
    destinations: const [
        NavigationDestination( icon: Icon(Icons.home), label: "主页",selectedIcon: Icon(Icons.home_work_sharp)),
        NavigationDestination(icon: Icon(Icons.favorite), label:  "订阅"),
        NavigationDestination(icon: Icon(Icons.shopping_cart), label: "购物车"),
        NavigationDestination(icon: Icon(Icons.person), label: "个人中心")
    ],
    selectedIndex: index,
    onDestinationSelected: (i) =>print("Selected $i"),
)

NavigationBar子项

属性

属性类型作用
iconWidget 
selectedIconWidget 
lableStringicon下的文字
tooltip  

容器

Container

是DecoratedBox、ConstrainedBox、Transform、Padding、Align等组件组合的一个多功能容器

属性

名称类型功能
alignment  
decoration  
margin  
padding  
transform  
height、widht  
child  

Align(Center继承自Align)

用于设置子widget对齐方式

属性

属性类型作用
alignment 可自行构造x、y(取值范围[-1,1])坐标的对齐方式

Padding

Container包括了padding属性,但功能多耗内存。Padding满足只设置间距的场景。

Card

卡片样式容器

属性

属性类型作用其他
clipBehavior 内容溢出的裁剪方式 
shape   
elevation   
shanowColor   
color   
margin   
child   

AspectRatio

根据设置的aspectRatio设置子元素的宽高比

裁剪

clipBehavior定义

枚举值作用
none不裁剪,系统默认值,如果子组件不超出边界,此值没有任何性能消耗。
hardEdge裁剪但不应用抗锯齿,速度比none慢一点,但比其他方式快。
antiAlias裁剪而且抗锯齿,此方式看起来更平滑,比antiAliasWithSaveLayer快,比hardEdge慢,通常用于处理圆形和弧形裁剪。
antiAliasWithSaveLayer裁剪、抗锯齿而且有一个缓冲区,此方式很慢,用到的情况比较少。

ClipRect

实例

1
2
3
4
5
6
7
8
9
10
11
12
ClipRect(
  child: Align(
    alignment: Alignment.topCenter,
    heightFactor: 0.5,
    child: Container(
      height: 150,
      width: 150,
      child: Image.asset('images/1.png', fit: BoxFit.cover),
    ),
  ),
)

ClipRRect

实例

1
2
3
4
5
6
7
8
ClipRRect(
  borderRadius: BorderRadius.circular(20),
  child: Container(
    height: 150,
    width: 150,
    child: Image.asset( 'images/1.png',fit: BoxFit.cover)
  ),
)

ClipOval

实例

1
2
3
4
5
6
7
ClipOval(
  child: Container(
    height: 150,
    width: 250,
    child: Image.asset('images/1.png',fit: BoxFit.cover)
  ),
)

ClipPath

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
ClipPath.shape(
  shape: StadiumBorder(),
  child: Container(
    height: 150,
    width: 250,
    child: Image.asset('images/1.png',fit: BoxFit.cover)
  ),
)
//shape参数是ShapeBorder类型,系统已经定义了很多形状:
//  RoundedRectangleBorder:圆角矩形
//  ContinuousRectangleBorder:直线和圆角平滑连续的过渡,和RoundedRectangleBorder相比,圆角效果会小一些。
//  StadiumBorder:类似于足球场的形状,两端半圆。
//  BeveledRectangleBorder:斜角矩形。效果如图:

CustomClipper

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class TrianglePath extends CustomClipper<Path>{
  @override
  Path getClip(Size size) {
    var path = Path();
    path.moveTo(size.width/2, 0);
    path.lineTo(0, size.height);
    path.lineTo(size.width, size.height);
    return path;
  }
  @override
  bool shouldReclip(CustomClipper<Path> oldClipper) {
    return true;
  }
}

布局

Flex

Flex可水平/垂直方向排列子widget.

Flex和Row/Column的关系

Row(Flex.direction=Axis.horizontal)和Column(Flex.direction=Axis.vertical)都继承子Flex,Flex的参数和Row/Column基本相同。

Flex和Expanded组合成占比填充排列

当FLex的子元素为Expaned时,可以设置Expaned.flex来控制子widget的填充Flex主轴的百分比。

Expanded

使用Expanded可以使Row,Column或Flex的子项扩展以填充主轴中的可用空间(例如,水平用Row或垂直用Column)。

如果扩展了多个子节点,则根据[flex]因子将可用空间划分为多个子节点。

[Expanded]小部件必须是Row,Column或Flex的后代,并且从[Expanded]小部件到其封闭的Row,Column或Flex的路径必须包含 只有[StatelessWidget]或StatefulWidget (不是其他类型的小部件,如RenderObjectWidget)。

Row(水平)Column(垂直)

mainAxisAlignment值效果

属性作用说明
spaceEvenly主轴多余空间,子widget均分间距img
spaceAround和spaceEvenly差别:首尾间距减半img
spaceBetween和spaceEvenly差别:首尾没间距img

Wrap

Row、Column只能单行、单列排列。 Wrap突破单行、单列限制,当mainAxis空间不足时则向crossAxis上扩展显示。

属性

属性类型作用
direction 排列方向
spacingdouble垂直间隔
runSpacingdouble行间隔
alignmentWrapAlignment主轴对齐方式
runAlignmentWrapAlignment整体(所有子组件看作一起)对齐方式
crossAxisAlignmentWrapCrossAlignment副轴对齐方式
verticalDirection children摆放顺序,默认时VerticalDirection.down

Stack

Stack其内子widget按照先后顺序层叠排列。

Positioned

Positioned用于在Stack进行绝对定位(通过left、top、right、bottom设置位置)

定位四个角及相应坐标

左上角:left=0、top=0

右上角:right=0、top=0

左下角:left=0、bottom=0

右下角:right=0、bottom=0

Positioned必须设置width、height,或者子widget具备设置宽高

width、height设置子widget宽高。不能使用ouble.infinity/maxFinite,可以通过MediaQuery.of(context).size获取到屏幕宽高。

文本、表单

Text

属性

名称功能
textAligncenter、left、right、justfy(两端对齐)
textDirectionltr从左到右、rtl从右到左
overFlow文字超出后的处理方式(clip、fade、elipsis)
textScaleFactor字体显示缩放因子
styleTextStyle(color,/*颜色*/
backgroundColor,fontSize,fontWeight,/*加粗*/fontStyle,
decoration,/*文字装饰线(none没有线,lineThrough删除线,overline上划线underline下划线)*/
decorationColor,/*文字装饰线颜色*/
decorationstyle,*文字装饰线风格/([dashed,dotted]虚线,double两根线,solid一根实线wavy波浪线)*/
letter/wordSpacing,/*字母/单词间隙(如果是负值,会让字母变得更紧凑)*/)
maxLindes 

TextField

属性

名称类型描述
controllerTextEditingController控制输入框的文本内容,可以通过TextEditingController进行管理。
decorationInputDecoration输入框的装饰,可以定义输入框的边框、背景、提示文本等样式。
obscureTextbool是否将输入内容隐藏,常用于密码输入框。
enabledbool输入框是否可编辑。
maxLengthint允许输入的最大字符数。
textInputActionTextInputAction键盘操作按钮的类型,例如完成、继续等。TextInputAction值:
none、unspecified、done、go、search、send、next、previous、continueAction、join、route、emergencyCall、newline
keyboardTypeTextInputType键盘的类型,如文本、数字、URL等。TextInputType:
text, multiline, number, phone, datetime, emailAddress, url, visiblePassword, name, streetAddress, none
onChanged 文本变化时的回调函数。
onSubmitted 用户提交输入时的回调函数。
focusNode 用于控制输入框的焦点获取和失去。
autofocus 是否自动获取焦点。
styleTextStyle输入框文本的样式,如字体大小、颜色等。

图片

Image

属性

属性类型描述
fitBoxFixfit属性用来控制图片的拉伸和挤压,这都是根据父容器来的。 BoxFit枚举:
fit:填充满父容器,图片会被拉伸。
contain:按原比例显示,可能会有空隙。
cover:显示可能拉伸,可能裁切,充满(图片要充满整个容器,还不变形)。
fitWidth/fitHeight:宽/高充满(横向充满),显示可能拉伸,可能裁切。
scaleDown:效果和contain差不多,但是此属性不允许显示超过源图片大小,可小不可大。
alignmentAlignment图片的对齐方式
repeatImageRepeatImageRepeat枚举:
repeat:横向和纵向都进行重复,直到铺满整个画布。
repeatX/Y:横向/纵向重复,纵向不重复。
width/heightdouble结合ClipOver组件(父节点)使用

加载本地图片:Image.asset

项目跟目录下建立一个文件夹images->建立各分辨率文件夹(2.0x、3.0x)->存放图片

配置pubspec.yaml并将各分辨率的图片都列举在下面(列举文件夹就可以了)

1
2
3
4
assets:
    - images/
    - images/2.0x/
    - images/3.0x/

加载:Image.asset("images/haha.png")

加载网络图片:Image.network

圆角图片的两种方式

1
2
- 1.用Container包裹通过`decoration`设置`borderRadius`、image(背景图,NetworkImage/AssetImage)
- 2.ClipOver包裹设置Image的宽高

CircleAvatar

实现圆形图片(不需要制定宽高)

属性

属性类型作用
radiodouble半径
backgroundImageWidget子Image

实现圆形图片的其他方式

  • 1.ClipOval/ClipRRect,Image需设置宽高
1
2
3
4
5
6
7
8
9
ClipRRect(
    borderRadius: BorderRadius.circular(120),
    child: Image.network(
        'https://avatars.githubusercontent.com/u/4121662?v=4',
        fit: BoxFit.cover,
        width: 120,
        height: 120,
    )
)
  • 2.Container.decoration.image结合DecorationImage

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
      Container(
              width: 100,//宽高比许设置
              height: 100,//
              decoration: BoxDecoration(
                  borderRadius: BorderRadius.circular(150),
                  image: DecorationImage(
                      image: NetworkImage('xhttps://avatars.githubusercontent.com/u/4121662?v=4'),
                      fit: BoxFit.cover
                  )
              )
      )
    
  • 3.PhysicalModel

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
      PhysicalModel(
          color: Colors.transparent,
          clipBehavior: Clip.antiAlias,
          elevation: 5.0,
          shape: BoxShape.circle,
          child: Image.network('https://avatars.githubusercontent.com/u/4121662?v=4',
          width: 120,
          height: 120,
          fit: BoxFit.cover,
          )
      )
    
  • 4.Card

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
      Card(
      shape: const CircleBorder(),
      clipBehavior: Clip.antiAlias,
      elevation: 5,
      child: Image.network(
          'https://avatars.githubusercontent.com/u/4121662?v=4',
          width: 120,
          height: 120,
          fit: BoxFit.cover,
      ),
      )
    

Icon

一.内置图标

内置图标用Icon widget加载

1
Icon( Icons.search, color:Colors.red,size:40)

二.自定义图标

  • 使用自定义图标步骤
    • 1.导入字体图标文件.比如存放路径为fonts/iconfont.ttf
    • 2.配置pubspec.yaml下的fonts
    1
    2
    3
    4
    
      fonts:
          - family:myIcon #指定字体名
              fonts:
                  - asset:fonts/iconfont.ttf
    
    • 3.定义图标常量
    1
    2
    3
    4
    5
    6
    7
    8
    
      class MyIcons{
          static const IconData book =IconData(
              0x3614,             //编码
              fontFamily:'myIcon',
              matchTextDirection:true
          );
    
      }
    
    • 4.在 Icon组件y调用MyIcons中地图标

按钮

TextButton

属性

属性|类型|描述 —|—|—

ElevatedButton

属性

属性|类型|描述 —|—|—

Switch

属性

属性类型描述
valuebool是否选中
onChangedvoid Function(bool)选中状态改变时回调

SwitchListTile

实际就是用ListTitle包裹了Switch

属性

属性类型描述
valuebool是否选中
onChangedvoid Function(bool)选中状态改变时回调
titleWidget对照ListTile
subtitleWidget对照ListTile
controlAffinityListTileControlAffinitySwitch显示位置:
leading:对照ListTile
trailing:对照ListTile
platform

Checkbox

属性

属性类型描述
valuebool?状态
tristateboolnull是否是一种状态
onChangedvoid Function(bool?)选中状态改变时回调

SwitchListTile

SwitchListTile差不错样式的东西

属性

属性|类型|描述 —|—|—

属性

属性类型描述
valueint当前选中
itemsList<Widget>下拉菜单widget
selectedItemBuilderList<Widget>显示选中菜单的widget
onChangedvoid Function(bool)选中状态更改回调

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
DropdownButton(
    value:_selectIndex,
    selectedItemBuilder:(ctx)=>[
        DropdownMenuItem(value:1, child: Text("u chose item1"),),
        DropdownMenuItem(value:2, child: Text("u chose item2"),),
        DropdownMenuItem(value:3, child: Text("u chose item3"),),
    ],
    items: const [
        DropdownMenuItem(value:1, child: Text("item1"),),
        DropdownMenuItem(value:2, child: Text("item2"),),
        DropdownMenuItem(value:3, child: Text("item3"),),
    ],
    onChanged: (value)=>print("DropdownButton changed $value"))

列表

ListView

属性

属性类型描述
scrollDirectionAxis默认垂直Axis.vertical.horizontal
paddingEdgeInsetsGeometry 
resolve列表反向排序 
childrenList<Widget>列表元素

ListView的children为Container

Container的宽度在vertical列表中自动填充ListView宽度;高度在horizontal列表中则高度自动填充ListView高度

ListView三种构造方法

  • 1.ListView(children:for循环构造子widget)
  • 2.ListView.builder(itemCount,itemBuilder(context,index))

ListTitle

常用来构造ListView的子项。

属性

属性类型描述
titleWidget主标题
subtitleWidget副标题
leadingWidget左组件。常用于显示icon
tailingWidget右组件。常用于显示icon

Divider

分隔线

GridView

属性

属性类型描述
scrollDirectionAxis主轴滚动方向
padding  
resolvebool反转列表
mainAxisSpacingdouble主轴子widget间距
crossAxisSpacingdouble副轴子widget间距
maxCorssAxisExtentdouble主轴子widget最大长度
用在GridView.extent中控制横轴子widget最大长度
crossAxisCountint副轴子widget数量
childAspectRatiodouble子widget宽高比
gridDelegate 用在GridView.Builder中控制布局
1.SliverGridDelegateWithFixedCrossAxisCount:对应GridView.count
2.SliverGridDelegateWithMaxCrossAxisCount:对应GridView.extent

三种构造方法

  • 1.GridView.cout(corssAxiscount,children)

  • 2.GridView.extent(maxCorssAxisExtent,children)

  • 3.GridView.builder(gridDelegate,itemCount,itemBuilder(context,index))

AnimatedList 实现动态列表

AnimatedList和ListView功能差不多,但AnimatedList在列表插入、删除节点时执行 一个动画,提高用户体验。

添加、删除元素用到 AnimatedListState 的两个方法

insertItem(index,{duration})

removeItem(index,AnimatedListRemovedItemBuilder builder,{duration})

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//创建
AnimatedList(
    key:_globalKey,
    initialItemCount: list.length,
    itemBuilder:( (ctx,i,animation)=>FadeTransition(opacity:animatiion,child:_buildItem(i)) )
)
//添加
list.add(xxx);
_globalKey,currentState!.insertItem(list.length-1);

//删除
if(canDel){
    canDel=false;
    _globalKey.currentState!.removeItem(i,(ctx,animation){
        var item=_buildItem(i);//创建要删除的item
        list.removeAt(i);
        return FadeTransition(opcity:animation,child,item);
    });
    Timer.periodic(Duration(milliseconds:500),(timer){
        canDel=true;
        timer.cancel();
    });
}

PageView

PageView用于实现轮动图或上下滑动切换视图

属性

属性类型作用
scrollDirectionAxis滚动方向
allowImplicitScrollingint缓存当前页面的前后两页
onPageChanged  
controllerPageController控制PageView滚动

实现PageView无限滚动

老掉牙的东西。基本做法:

  • 1.设置无限大的itemCount
  • 2.构造Widget时通过取模的方法获取到实际索引

缓存页面

内部子widget混入AutomaticKeepAliveClientMixin

对话框

Dialog

1.弹出

对话框通过 showDialog函数来显示

参数类型作用
context  
builderWidgetBuilder回调构建Dialog
barrierDismissiblebool点击遮罩是否消失

2.取消显示

Navigator.pop(context)

3.返回值设置

Navigator.pop(context,returnValue)

4.获取返回值

final result = await showDialog(context,....)

自定义Dialog

  • 1.继承Dialog

继承Dialog重写build函数.

  • 2.设置背景色

Dialog本质就是一个页面,所以自定义的Dailog会填充满屏幕,背景为白色遮住当前页面。

1
2
//设置 dialog 半透明,顶层Material包裹
Material.type=MeterialType.transparency

AlertDialog

属性

属性类型作用
iconWidget 
titleWidget 
contentWidget 
actionsList左下角button

实例

1
2
3
4
5
6
7
8
9
10
11
final String? r=await showDialog(
    context: context,
    builder: (ctx) => AlertDialog(
            title: const Text("title"),
            content: const Text("content"),
            actions: [
            ElevatedButton(
                onPressed: () => Navigator.pop(context, "Ok"),
                child: const Text("Ok"))
            ]
        ));

SimpleDialogOption

SimpleDialog

实例

1
2
3
4
5
6
7
8
9
final int? r=await showDialog(
    context: context,
    builder: (ctx) => SimpleDialog(
        title:  const Text("Chose Options"),
        children: [
        SimpleDialogOption( child: const Text("option1"),onPressed:()=> Navigator.pop(context,1) ),
        SimpleDialogOption(child: const Text("option2"),onPressed:()=>Navigator.pop(context,2) ),
        ],
    ));

BottomSheet

showBottomSheet

showModalBottomSheet

实例

1
2
3
4
5
6
final bool? r=showModalBottomSheet(
    context: context,
    shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)),
    builder: (ctx) => Padding(
        padding: const EdgeInsets.all(10),
        child: Text(content)));

菜单

PopupMenuButton

弹出菜单按钮

实例

1
2
3
4
5
6
7
8
9
10
PopupMenuButton(
        icon: const Icon(Icons.more_vert), 
        onSelected: (value)=>print("your clicked $value"),
        initialValue: 2,
        itemBuilder: (ctx)=><PopupMenuEntry>[
            const PopupMenuItem(value: 1,child:Text("Open"),),
            const PopupMenuItem(value: 2,child:Text("Edit"),),
            const PopupMenuItem(value: 3,child:Text("About"),),
        ]
    )

PopupMenuItem

PopupMenuButton子项

实例

1
PopupMenuItem(value: 1,child:Text("Open"),)

CheckedPopupMenuItem

PopupMenuButton多选子项

实例

1
CheckedPopupMenuItem(value: 1,child:Text("option1"),checked:true)

PopupMenuDivider

菜单分隔线

实例

1
PopupMenuDivider()

动画

一.隐式动画

隐式动画隐藏了动画背后的实现原理和繁琐的操作细节。

属性

属性类型作用
durationDuration动画时长
curveCurve动画运动曲线
child 子widget
onEndVoidCallback动画结束回调

隐式动画表

动画效果其他
AnimatedContainer包装自Container,改变Container里的属性执行动画 
AnimatedPadding包装自Padding,改变Padding属性执行动画 
AnimatedPositioned包装自Positioned,改变Positioned属性执行动画 
AnimatedOpacity包装自FadeTransition,改变opacity执行动画 
AnimatedDefaultTextStyletextStyle属性改变时执行动画实例
AnimatedSwitcher子组件更改时执行动画实例
类型改;或同一组件设置 key=UniqueKey那么属性改变也会执行

AnimatedDefaultTextStyle例子

1
2
3
4
5
AnimatedDefaultTextStyle(
    duration:Duration(seconds:2),
    style:TextStyle(fontSize:change? 20:40)
    child:const Text("gold.duo")
)

AnimatedSwitcher例子

1
2
3
4
5
AnimatedSwitcher(
    duration:const Duration(seconds:2),
    child: !load? const CircularProgressIndicator() : Image.network("https://avatars.githubusercontent.com/u/4121662?v=4"),
    transitionBuilder:(child,animation)=> ScaleTransition(scale:animation,child: FadeTransition(opacity: animation,child: child))
)

二.显式动画

显式动画是需要手动设置动画的时间,运动曲线,取值范围的动画.

显式动画需配合AnimationController(需 Mixins SingleTickerProviderStateMixin)。AnimationController方法

名称作用
repeat重复播放
forward顺序播放
reverse逆序播放
stop停止
reset重置到初始状态
animateTo动画执行到制定值[0,1]
animateBack动画回滚到制定值
drive将Tween(或 CurveTween)链接到此动画
controller.drive(Tween(begin:0.2,end:0.8))
addListener监听动画值([0,1])变化
addStatusListener监听动画状态变化

若不调用repeat、forward、reverse,AnimationController实例赋值给xxTransition后并不会执行动画

显式动画表

动画效果设置属性实例
RotationTransition对子组件旋转turns-
FadeTransition对子组件渐隐渐现opacity-
SliverFadeTransition   
ScaleTransition对子组件放大缩小scale-
SlideTransition左右切换滑动position向右移动50%*width:
1.controller.drive(Tween(begin:const Offset(0,0),end:const Offset(0,5,0)))
2.Tween(begin:const Offset(0,0),end:const Offset(0,5,0)).animate(controller)
Offset里构造的参数不是坐标而是相对自身大小的倍数
SizeTransition   
PositionedTransition   
RelativePositionedTransition   
AlignTransition   
DefaultTextStyleTransition   
1
2
3
4
5
6
7
8
9
10
11
12
13
  late AnimationController _controller;
  late Animation<double> _animation;
  void initState() {
    super.initState();
    _controller=AnimationController(vsync: this,duration:  const Duration(seconds: 1));
    _animation =Tween<double>(begin: 0.0, end: 1).animate(_controller);
    _controller.forward();
  }

  @override
  Widget build(BuildContext context)=>FadeTransition(
    opacity: _animation,
    child:const Text('FadeTransition'));

修改Tween的运动方式

1
2
3
4
Tween(begin:const Offset(0,0),end:const Offset(0,5,0))
.chain(CurveTween(curve:Curves.bounceIn)) //弹跳曲线
.chain(CurveTween(curve:const Interval(0.8,1))//运动到80%暂停,然后完成20%
.animate(controller)

交错动画

AnimationIcon(图标从 A -> B)

1
2
3
4
5
 AnimatedIcon(
    icon:AnimatedIcons.menu_arrow,
    size:40,
    progress:_controller
)

Interval控制动画交错播放

Interval构造传入begin、end,分别代表在动画总时间的某个百分比执行改动画。 所以构造不同的begin、end序列的widget执行动画即所谓的交错执行。

三.Hero

实现点击某一个widget飞入切换到另外一个页面效果(类似微信点击朋友圈点击小图预览大图),关闭也自动产生飞出效果。

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
const url='https://avatars.githubusercontent.com/u/4121662?v=4';

//1.原widget用Hero包裹
class HomePage extends StatelessWidget{
    Widget build(BuildContext context)=>Center(child:InkWell(
    onTap: ()=>Navigator.pushNamed(context, '/search', arguments:url),
    child: Hero(tag: url,
        child: SizedBox(
            width: 50,
            height: 50,
            child: Image.network(url,fit:BoxFit.cover))),
    ));
}

// 2.目标页也用Hero包裹切Hero.tag一定要设置相同的url
class SearchPage extends StatelessWidget{
    Widget build(BuildContext context) {
    final String url = (ModalRoute.of(context)?.settings?.arguments ?? "") as String;
    return Center(child:GestureDetector(
        onTap: () => Navigator.pop(context),
        child: Hero(
            tag: url,
            child: Scaffold(
                body: Center(
                child: Image.network(url, fit: BoxFit.cover),
                )
            ))));
    }
}

其他

Stepper

步骤显示器。典型的物流状态、订单状态、审批流程状态

属性

属性类型作用
stepsStep 
physics  
typeStepperType横向还是纵向
currentStepint当前 step
onStepTappedvoid Function(int value)step 点击回调函数
onStepContinuevoid Function()Next 按钮点击回调函数
onStepCancelvoid Function()Cancel 按钮点击回调函数
controlsBuilderWidget Function(BuildContext context, ControlsDetails details)内容下方按钮构建函数

Step

属性类型作用
titleWidget标题
subtitleWidget副标题
contentWidget内容
stateStepState当前 step 的状态,StepState 会改变每一个 step 的图标,默认为 StepState.indexed
isActivebool是否激活状态,默认为 false,isActive == true 时会变成蓝色

Visibility

属性

属性类型作用
replacementWidget不可见时显示的组件(当maintainState=false)
visiblebool子组件是否可见,默认true(可见)
maintainStatebool不可见时是否维持状态,默认为false
maintainAnimationbool不可见时,是否维持子组件中的动画
maintainSizebool不可见时是否留有空间
maintainSemanticsbool不可见时是否维持它的语义
maintainInteractivitybool不可见时是否具有交互性

PopScope

属性

属性类型作用
canPopbool当canPop为true,走系统路由, onPopInvoked的didPop为true
当canPop为false,不走系统路由,onPopInvoked的didPop为false
onPopInvokedvoid Function(bool didPop)回调
This post is licensed under CC BY 4.0 by the author.