Flutter StatefluWidget与基础组件(1.2)

在这里插入图片描述

记忆是一首歌曲,忘了词却又能哼得出它的旋律。不要说我变了,我只不过学会了,别人怎样对我,我就该怎样去对别人。失去了缘分的人,即使在同一个城市里也不太容易碰到;一次转身就意味着一辈子。

MaterialApp

只列举常用的属性

MaterialApp常用参数类型说明
titleString任务管理界面看到的title(下面我会带大家详细查看具体位置)
themeThemeData设置主题
homeWidget主页面
routesMap<String, WidgetBuilder>设置路由(后面说跳转页面的时候会具体说)
supportedLocalesIterable<Locale>支持多国语言默认<Locale>[Locale(‘en’, ‘US’)]
darkThemeThemeDate暗主题(我看不出有什么效果)
import 'package:flutter/material.dart';

//StatefluWidget与基础组件
class Flutter_Demo5 extends StatefulWidget {
  @override
  _Flutter_Demo5State createState() => _Flutter_Demo5State();
}

class _Flutter_Demo5State extends State<Flutter_Demo5> {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: "StatefluWidget与基础组件",
      //主题
      theme:
          ThemeData(primarySwatch: Colors.green, brightness: Brightness.light),

      //暗主题
      darkTheme:
          ThemeData(primarySwatch: Colors.yellow, brightness: Brightness.dark),
      home: Scaffold(
        appBar: AppBar(
          title: Text("StatefluWidget与基础组件"),
        ),
        body: Container(
          color: Colors.white,
        ),
      ),
      color: Colors.pink,
      routes: <String, WidgetBuilder>{
        //定义跳转路由
      },
      supportedLocales: <Locale>[
        const Locale('en', 'US'),
        const Locale('fi', 'FI'),
      ],
      debugShowCheckedModeBanner: false, //右上角DEBUG图标 默认为true
//      showPerformanceOverlay: true,//打开性能监控,覆盖在屏幕最上面,默认false
//        checkerboardOffscreenLayers:true,//打开渲染到屏幕外位图的图层的checkerboarding。,默认false
//    debugShowMaterialGrid: true,//显示网格,默认false
//        checkerboardRasterCacheImages:true,//打开光栅缓存图像的检查板,默认false
    );
  }
}


title使用切换到任务管理界面(我的是华为手机):

Scaffold与BottomNavigationBar

Scaffold参数类型说明
appBarAppBar顶部显示文本
bodyWidgitAppBar以下,显示内容
persistentFooterButtonsList<Widget>位置如下图
bottomsheetWidget位置如下图
drawWidget位置如下图
floatingActionButtonWidget(FloatingActionButton)位置如下图
bottomNavigationBarWidget(BottomNavigationBar)位置如下图
primarybool是否显示顶部状态栏,默认为true
endDrawWidget后缀Draw

BottomNavigationBar类型介绍:

BottomNavigationBar({
    Key key,
    @required this.items,//必须要实现的,最少要有两个子widgets
    this.onTap,//点击事件,知道当前点击的是哪一个widget
    this.currentIndex = 0,//当前显示的是哪一个widget
    this.elevation = 8.0,//阴影
    BottomNavigationBarType type,//设置items的布局
    Color fixedColor,//相当于selectedItemColor,但是不能跟selectedItemColor同时存在
    this.backgroundColor,//设置背景颜色
    this.iconSize = 24.0,//设置图标大小
    Color selectedItemColor,//设置选中时的颜色
    this.unselectedItemColor,//设置没选中时的颜色
    this.selectedIconTheme = const IconThemeData(),//设置选中时的icon的主题
    this.unselectedIconTheme = const IconThemeData(),//设置没选中时的icon的主题
    this.selectedFontSize = 14.0,//设置选中时文字大小
    this.unselectedFontSize = 12.0,//设置没选中时的文字大小
    this.selectedLabelStyle,//设置选中时的labe样式
    this.unselectedLabelStyle,//设置没选中时的labe样式
    this.showSelectedLabels = true,//设置选中时是否显示文字
    bool showUnselectedLabels,//设置没选中时是否显示文字
  })

在这里插入图片描述

 home: Scaffold(
        drawer: Container(
          color: Colors.white,
          width: 300,
          child: Column(
            children: <Widget>[
              Container(
                child: Text("drawer1"),
              ),
              Container(
                child: Text("drawer2"),
              ),
              Container(
                child: Text("drawer3"),
              )
            ],
          ),
        ),
        primary: false,
        floatingActionButton: FloatingActionButton(
          child: Text("点我"),
        ),
        bottomSheet: Text("bottomSheet"),
        endDrawer: Container(
          //右侧Drawer
          color: Colors.white,
          width: 300,
          height: 300,
          child: Text("endDrawer"),
        ),
        persistentFooterButtons: <Widget>[
          Container(
            child: Text("按钮一"),
          ),
          Container(
            child: Text("按钮二"),
          ),
        ],
        bottomNavigationBar: BottomNavigationBar(
          currentIndex: mIndex,
          onTap: (index) {
            setState(() {//每次点击按钮都会刷新整个StatefluWidget
              mIndex = index;
            });
          },
          items: [
            BottomNavigationBarItem(
              icon: Icon(Icons.cached), //默认状态
              activeIcon: Icon(
                //选中状态
                Icons.cached,
                color: Colors.green,
              ),
              title: Text("刷新"), //颜色跟随主题颜色变化
            ),
            BottomNavigationBarItem(
              icon: Icon(Icons.ac_unit),
              activeIcon: Icon(
                Icons.ac_unit,
                color: Colors.green,
              ),
              title: Text("雪花"),
            )
          ],
        ),
        appBar: AppBar(
          title: Text("StatefluWidget与基础组件"),
        ),
        body: mIndex == 0		//使用三目用算法显示当前显示页面
            ? Container(
                color: Colors.white,
              )
            : Container(
                width: 200,
                alignment: Alignment.center,
                height: 200,
                child: Text("雪花"),
                color: Colors.green,
              ),
      ),

AppBar

AppBar参数类型说明
leadingWidget最左边显示按钮一般为返回键(不能和draw按钮重复)
titleWidget显示文本
actionsList<Widget>右边显示Widget(此按钮会和endDraw重复)
shapeShapeBorder(RoundedRectangleBorder)AppBar形状
backgroundColorColorAppBar背景颜色
brightnessBrightness状态栏颜色
Brightness.dark亮色
Brightness.light深色
iconThemeIconThemeDataAppBar中leading中的操作
elevationdoubleAppBar阴影
toolbarOpacitydoubleAppBar透明度
最大值1,最小值0
bottomOpacitydoubleAppBar中bottom透明度
最大值1,最小值0
bottomPreferredSizeWidget(TabBar)位置如下图

具体位置请看下图:

一般Button都是配合TabBar使用:

TabBar参数类型说明
tabsList<Widget>子Tab
isScrollablebool是否可以滚动
indicatorColorColor指示器颜色
indicatorPaddingEdgeInsetsGeometry指示器内边距
indicatorBoxDecoration选中颜色,(指示器和选中颜色只能选一个)
indicatorSizeTabBarIndicatorSize默认是:TabBarIndicatorSize.tab
TabBarIndicatorSize.label跟文字等宽
labelColorColorTab颜色
labelStyleTextStyleTab样式
labelPaddingEdgeInsetsGeometryTab内边距
unselectedLabelStyleTextStyleTab未选中样式
unselectedLabelColorColorTab未选中颜色
onTapValueChanged<int>点击Tab响应事件

使用TabBar需要用DefaultTabController包裹,并且length需要设置为当前Tab的数量

 home: DefaultTabController(
        length: 3,
        child: Scaffold(
          drawer: Container(
            color: Colors.white,
            width: 300,
            child: Column(
              children: <Widget>[
                Container(
                  child: Text("drawer1"),
                ),
                Container(
                  child: Text("drawer2"),
                ),
                Container(
                  child: Text("drawer3"),
                )
              ],
            ),
          ),
          primary: true,
          //AppBar标题是否显示完整 默认是true
          floatingActionButton: FloatingActionButton(
            child: Text("点我"),
          ),
          bottomSheet: Text("bottomSheet"),
          endDrawer: Container(
            //右侧Drawer
            color: Colors.white,
            width: 300,
            height: 300,
            child: Text("endDrawer"),
          ),
          persistentFooterButtons: <Widget>[
            Container(
              child: Text("按钮一"),
            ),
            Container(
              child: Text("按钮二"),
            ),
          ],
          bottomNavigationBar: BottomNavigationBar(
            currentIndex: mIndex,
            onTap: (index) {
              setState(() {
                mIndex = index;
              });
            },
            items: [
              BottomNavigationBarItem(
                icon: Icon(Icons.cached), //默认状态
                activeIcon: Icon(
                  //选中状态
                  Icons.cached,
                  color: Colors.green,
                ),
                title: Text("刷新"), //颜色跟随主题颜色变化
              ),
              BottomNavigationBarItem(
                icon: Icon(Icons.ac_unit),
                activeIcon: Icon(
                  Icons.ac_unit,
                  color: Colors.green,
                ),
                title: Text("雪花"),
              )
            ],
          ),
          appBar: AppBar(
            leading: Icon(Icons.arrow_back),
            //此按钮会和draw按钮重复

            title: Text("StatefluWidget与基础组件"),
            //按钮显示文字
            actions: <Widget>[
              //右边显示//此按钮会和endDraw按钮重复
              Container(
                child: Text("actions"),
              ),
            ],
            shape: RoundedRectangleBorder(
                //AppBar形状
                borderRadius: BorderRadius.all(Radius.circular(20))),
            backgroundColor: Colors.red,
            //背景色 默认跟随主题色
            brightness: Brightness.light,
            //状态栏亮度
            iconTheme: IconThemeData(
                color: Colors.blue, //AppBar中leading的颜色
                opacity: 0.8 //AppBar中leading的透明度  1不透明
                ),

            //阴影
            elevation: 20,

            //AppBar透明度
            toolbarOpacity: 0.7,
            //botton透明度
            bottomOpacity: 0.7,

            bottom: mIndex != 0
                ? TabBar(
                    isScrollable: false,
                    //是否可滚动
                    tabs: <Widget>[
                      //TabBar子Tab
                      Tab(
                        text: "page1",
                        icon: Icon(Icons.call),
                      ),
                      Tab(
                        text: "page2",
                        icon: Icon(Icons.save),
                      ),
                      Tab(
                        text: "page3",
                        icon: Icon(Icons.data_usage),
                      ),
                    ],
                    indicatorColor: Colors.greenAccent,
                    //指示器选中颜色
                    indicatorPadding: EdgeInsets.zero,
                    //指示器内边距
//                indicator: BoxDecoration(//选中颜色(指示器与选中颜色只能选一个)
//                  color: Colors.deepOrange,
//                ),
                    indicatorSize: TabBarIndicatorSize.tab,
                    //tab指示器计算方式TabBarIndicatorSize.lable与文字等宽
                    labelColor: Colors.blue,
                    //Tab默认颜色
                    labelStyle: TextStyle(fontSize: 18),
                    //Tab样式
                    labelPadding: EdgeInsets.all(5),
                    //Tab内边距
                    unselectedLabelColor: Colors.yellow,
                    //Tab未选中颜色
                    unselectedLabelStyle: TextStyle(fontSize: 15),
                    //Tab为选中样式
                    onTap: (index) {
                      mIndex = index;
                      print('现在是第:${index}个');
                    },
                  )
                : null,
          ),
          body: mIndex == 0
              ? Container(
                  color: Colors.white,
                )
              : TabBarView(//使用TabBarView来响应
                  children: <Widget>[
                    initTabitem("page1", Colors.blue),
                    initTabitem("page2", Colors.red),
                    initTabitem("page3", Colors.yellow),
                  ],
                ),
        ),
      ),
      
 initTabitem(String s, Color color) {
    return Container(
      color: color,
      child: Text(s),
    );
  }

来看看效果图吧:

注:我的审美很好,这样写是为了让大家看到的效果更佳明显!!!

RefreshIndicator

刷新组件

RefreshIndicator参数类型说明
onRefreshRefreshCallback下拉刷新回调
colorColor指示器颜色
backgroudColorColor背景颜色
displacementdouble下拉显示距离

注:使用RefreshIndicator子Widget必须是可以滚动的!

 body: RefreshIndicator(
            child: ListView(
              children: <Widget>[
                Container(
                  color: Colors.white,
                )
              ],
            ),
            onRefresh:initRefresh ,//必写参数
            color: Colors.green,//指示器颜色
            backgroundColor: Colors.yellow,//背景颜色
            displacement: 20,//下拉距离
          )
 Future<Null> initRefresh() async {
    await Future.delayed(new Duration(milliseconds: 1000)); //刷新1s
    return null;
  }

回调方法中Future,async和await可以点击参考文档

来看看效果图吧:

在这里插入图片描述

Image

图片加载控件(只举例常用属性)

Image参数类型说明
srcStringImage显示图片路径
widthdouble图片宽度
heightdouble图片高度
fitBoxFitBoxFit.fill完全填充,宽高比可能会变
BoxFit.contain等比拉伸,直到一边填充满
BoxFit.cover等比拉伸,直到2边都填充满,此时一边可能超出范围
BoxFit.fitWidth等比拉伸,宽填充满
BoxFit.fitHeight等比拉伸,高填充满
BoxFit.none不拉伸,超出范围截取
BoxFit.scaleDown只缩小,等比

加载网络图片

 Image.network(
             //添加网络图片
               "http://pic1.win4000.com/pic/c/cf/cdc983699c.jpg",
                width: 100,
                 height: 150,
                 fit: BoxFit.fill,
          ),

加载本地图片

1.先在本地创建images文件夹,将需要加载的图片放进去
在这里插入图片描述

2,在pubspec.yaml下声明图片(一定要写对,连一个空格都不能写错!!!)
在这里插入图片描述

在代码中使用asset加载本地图片:

Image.asset(
         "images/green.jpeg",
         width: 100,
         height: 150
        ),

来看看加载的图片吧:
图一网络加载图片用到了BoxFit.fill完全填充,所以会占满整个宽度!

# TextField > 文本输入组件
TextField参数类型说明
obscureTextbool隐藏文字
keyboardTypeTextInputType弹出键盘类型TextInputType.text
TextInputType.multiline
TextInputType.number
TextInputType.phone
TextInputType.datetime
TextInputType.emailAddress
TextInputType.url
textInputActionTextInputAction弹出键盘右下角按钮就是这个按钮
TextInputAction.none

TextInputAction.newline
(按住ctrl可以点进来,注释写的很清楚我就不再重复说啦)在这里插入图片描述
textCapitalizationTextCapitalization大小写控制
TextCapitalization.words…
在这里插入图片描述
cursorColorColor光标颜色
cursorWidthdouble光标宽度
cursorRadiusRadius光标圆角
maxLinesint最大行数(要比最小行数大)
minLinesint最小行数(要比最大行数小)
maxLengthint最大输入字符个数(右下角会有当前输入角标)
controllerTextEditingController直接new TextEditingController()控制器配置(删除文本内容需要使用)
focusNodeFocusNode直接new FocusNode()关闭软键盘配置(关闭软键盘需要使用)
decorationInputDecoration装饰器InputDecoration.collapsed(hintText: “无下划线”)无下划线装饰器(具体装饰器使用下面会介绍)
onChangedValueChanged<String>当前输入响应回调

InputDecoration只举例常用类型

InputDecoration参数类型说明
counterWidget自定义技数
iconWidget左侧外图标
prefixIconWidget左侧内图标
suffixIconWidget右侧图标
helperTextString帮助文字
helperStyleTextStyle帮助文字样式
hintTextString提示文字
labelTextString悬浮提示文字
errorTextString错误提示
borderInputBorder(OutlineInputBorder)边框设置

在这里插入图片描述
代码注释都标注了,来看看效果图吧~

TextField(
//                          obscureText:true,//隐藏文字
                  keyboardType: TextInputType.number,
                  //设置键盘弹出类型
                  textInputAction: TextInputAction.next,
                  //键盘按钮右下角按钮
                  textCapitalization: TextCapitalization.characters,
                  //大小写控制(我看不出效果!)
                  cursorColor: Colors.yellow,
                  //光标颜色
                  cursorWidth: 10,
                  //光标宽度
                  cursorRadius: Radius.circular(20),
                  //光标圆角
                  maxLines: 3,
                  //最大行数
                  minLines: 1,
                  //最小行数
                  maxLength: 8,
                  //最大输入字符
                  controller: mController = new TextEditingController(),
                  //初始化控制器controller
                  focusNode: focusNode = new FocusNode(),
                  //配置关闭软件按钮
//                        decoration: InputDecoration.collapsed(hintText: "无下划线"),//无下划线输入框

                  decoration: InputDecoration( //右下角最大输入样式
                      counter: Text("最大输入字符"),
                      icon: Icon(Icons.accessibility),
                      //左侧图标
                      prefixIcon: Icon(Icons.title),
                      //左侧内图标
                      suffixIcon: IconButton( //右侧图标
                        icon: Icon(Icons.delete),
                        onPressed: () {
                          print('SZJonPressed');
                          mController?.clear();//清除文字
                          focusNode?.unfocus();//关闭软键盘
                        },
                      ),

                      helperText: "请输入手机号",
                      //帮助提示
                      helperStyle: TextStyle(color: Colors.green),
                      hintText: "请输入",
                      //hint提示
                      labelText: "账号",
                      //悬浮提示 先显示lableText在显示hintText
                      errorText: "请正确输入手机号",
                      errorMaxLines: 5,
                      //错误提示
//                      errorBorder: OutlineInputBorder(),


                      border: OutlineInputBorder( //设置边框
                        borderRadius: BorderRadius.all(
                            Radius.circular(30)), //设置圆角
                      )

                  ),

                  onChanged: (value) { //响应回调
                    print('当前输入的是${value}');
                    mValue = value;
                  },


                )

效果图:

PageView

切换页面控件

PageView参数类型说明
scrollDirectionAxis设置滚动方向Axis.vertical垂直滚动
Axis.horizontal
controllerPageController控制器
onPageChangedValueChanged<int>响应当前页数
childrenList<Widget>子Page的Widget
PageController参数类型说明
viewportFractiondouble设置每一个Page不占满屏幕,漏出上一个和下一个Page!
initialPageint设置默认显示page
keepPagebool是否保存当前page状态
Container(
                        height: 100,
                        margin: EdgeInsets.only(top: 30),
                        child: PageView(
                            scrollDirection: Axis.vertical,//设置滑动方向  默认是Axis.horizontal
                          controller: PageController(
                            viewportFraction: 0.9,//设置每一个Page不占满屏幕,漏出上一个和下一个Page!
                              initialPage: 0,//设置默认Page
                             keepPage: true//是否保存当前滚动page

                          ),
                          onPageChanged: (index){
                            print("SZJonPageChanged${index}\t\t");
                          },

                          children: <Widget>[
                            initPageViewItem("page1", Colors.green),
                            initPageViewItem("page2", Colors.yellow),
                            initPageViewItem("page3", Colors.red),
                            initPageViewItem("page4", Colors.blue),
                          ],
                        ),
                      )
 initPageViewItem(String s, Color color) {
    return Container(
      color: color,
      alignment: Alignment.center,
      child: Text(s),
    );
  }

来看看效果图吧:
在这里插入图片描述
查看完整代码.

上一章:Flutter StatelessWidget与基础组件(1.1)

下一章:Flutter 如何进行Flutter布局开发(1.3)

原创不易,您的点赞是对我最大的鼓励,留下您的点赞吧~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

s10g

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值