flutter布局常用控件的默认大小,及常用控件

Container() 容器

可以指定大小,不指定大小的话根据子控件的大小设置大小,例如内部包含一个listview,listview默认 
大小是铺满父容器并且不可以指定宽高,这样的话由于子空间是铺满,Container也会铺满他的父容器
Container指定了大小的话,listview只会铺满Container的大小

listview() 列表

本身不支持设置大小,默认会铺满自己的父容器

Center() 居中

本身不支持设置大小,会默认铺满自己的父容器

text() 文本

本身的大小,即是文本内容的大小

Row()和Column() 线性布局

Row 和Column本身不支持设置大小,Row高度会随子控件的高度,Column高度会铺满父容器 ,
Row宽度会铺满父容器,Column宽度会随子控件大小
可以通过mainAxisSize: MainAxisSize.min, 让主轴大小自适应
crossAxisAlignment: CrossAxisAlignment.center, //通过交叉抽 设置对齐方式 交叉轴是主轴相反
mainAxisAlignment: MainAxisAlignment.center, //通过主轴设置对其方式 row=横 Column=竖

对齐参数:
      //将子控件放在当前轴的开始位置  start
      //将子控件放在当前轴的结束位置     end
      //将子控件放在当前轴的中间位置      center
      //将当前轴空白位置进行均分,排列子元素,手尾没有空隙    spaceBetween
      //将当前轴空白区域均分,使中间各个子控件间距相等,首尾子控件间距为中间子控件间距的一 
        半      spaceAround                   
      //将当前轴空白区域均分,使各个子控件间距相等      spaceEvenly

Expanded() 权重

搭配Row()和Column() 相当于权重,默认会平均分配父容器的主轴大小,可以通过flex: 2,的值
来改变其中一个的权重大小

Stack() 相对布局

默认情况下的大小是根据子控件的大小决定的,可以搭配Positioned使用进行定位

Positioned() 定位

结合Stack使用,没使用,上下左右,定位属性时候,大小会根据子容器决定,使用定位属性,此控件大小变成铺满屏幕,只不过子空间大小之外的空间,是空白没有绘制的区域,因为计算位置的时候得通过全屏来计算,所以大小变成全屏

ClipOval() 圆形

圆容器,结合image可以设置圆形图片,宽高适应子布局

Divider() 一条线

padding() 边距

包围在别的组件外边,提供外边距的组件

AspectRatio() 宽高比

设置宽高比的容器,并且最长的轴可以铺满父容器

card() 卡片布局

卡片布局

wrap() 流式布局

流式布局组件

bottomNavigationBar() 底部导航栏

底部导航栏,在Scaffol() 内部属性使用,默认是三个选项,大于三个需要开启type里面的属性
new Scaffold(     //在Scaffold内使用
      body: new Text("内容1"),
      bottomNavigationBar: new BottomNavigationBar(
        currentIndex: 1,   //当前要显示页面的索引
      items: [
        BottomNavigationBarItem(
          icon: new Icon(Icons.print),
          title: new Text("页面1"),
        ),
        BottomNavigationBarItem(
          icon: new Icon(Icons.accessibility),
          title: new Text("页面2"),
        ),
        BottomNavigationBarItem(
          icon: new Icon(Icons.ac_unit),
          title: new Text("页面3"),
        ),
      ],
        onTap: (items){        //当前点击的监听,参数是索引
          print(items);
        },
      ),
    );

Button 按钮

image.png

image.png
                RaisedButton() ,  //突起按钮
                FlatButton() , //扁平化按钮
                OutlineButton(),//线框按钮
                ButtonBar(),   //按钮组
                FloatintActionBotton(),  //浮动按钮
                 IconButton(),   //图标按钮

TextField() 文本输入框

image.png

定义一个controller 属性 类型是TextEditingController() 属性的.text=文本框的值,绑定的时候里面的值就是默认值,没有默认值可以不给值


image.png

Radio() 单选

image.png

groupValue是谁的值,当前就是谁被选中

RadioListTitle() 单选,带图片的

image.png

Switch 开关按钮

image.png

Checkbos 多选按钮

image.png

image.png

DefaultTabController() Tab切换效果

顶部tob栏,实现类似Android Tablayou+ViewPager的效果

DefaultTabController(     //使用tab切换,必须嵌套在Scaffold外面  
        length: 3,                           //指定tab数量
        child: new Scaffold(
          appBar: new AppBar(       //tab写在appBar里面
          title:  new Text("标题"),     //appbar 的标题  如果不想要标题,不写此项tab上面会留出空白,可 
       //以直接把tabbar写在标题里面,不要bottom属性
            bottom: new TabBar(    //要标题的话,tab写在这里 
               isScrollable: true,    //tabbar 是否可以滑动
              tabs: <Widget>[
                new Tab(text: "11111",),
                new Tab(text: "2222",),
                new Tab(text: "3333",),
              ],
            ),

          ),
          body:TabBarView(         //tab滑动切换的内容,根据个数索引相对应  类似VIewPager
            children: <Widget>[
              new Text("1111"),
              new Text("2222"),
              new Text("3333"),
            ],
          )
        )
    );

TabController Tab切换效果

实现 Tab切换效果和上面一样,可以监听tab的事件,(推荐使用)

//必须创建一个有状态组件
class MyTabLayout extends StatefulWidget{
  @override
  _MyTabLayoutState createState() => _MyTabLayoutState();
}

//多继承 SingleTickerProviderStateMixin
class _MyTabLayoutState extends State<MyTabLayout> with SingleTickerProviderStateMixin{
  TabController _tabController;     //创建一个TabController的私有变量

  @override
  void initState() {   //初始化方法
    super.initState();
    // Add code after super
    _tabController=new TabController(length: 3, vsync: this);   //设置两个属性,一个长度,一个对象
    _tabController.addListener((){   //监听改变状态事件
      print(_tabController.index);   //打印当前点击的索引
    });
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
        appBar: new AppBar(
          title: TabBar(
            controller: _tabController,    //将tabController和TabBar进行关联
            tabs: <Widget>[
              Tab(text: "tab1",),
              Tab(text: "tab2",),
              Tab(text: "tab3",),
            ],
          ),
        ),
        body: TabBarView(
          controller: _tabController,   //将tabController和TabBarView进行关联
          children: <Widget>[
            new Text("内容1"),
            new Text("内容2"),
            new Text("内容3"),
          ],
        ),
    );
  }
}

Drawer() 侧滑

Scaffold(  //在Scaffold内设置
      
      drawer: new Drawer(
        child: new Text("左侧滑"),
      ),
      
      endDrawer: new Drawer(
        child: new Text("右侧滑"),
      ),
    );

页面跳转 路由

//跳转到 MyHone 页面
Navigator.of(context).push(new MaterialPageRoute(builder: (context)=>new Myhome()));
//返回上一个页面
Navigator.pop(context);
//替换路由,跳转的同时把栈内当前页面替换成别的页面
Navigator.of(context).pushReplacement(new MaterialPageRoute(builder: (context)=>new Myhome()));
//跳转到一个页面,并且把栈内全部页面滞空,可用于返回根目录
 Navigator.of(context).pushAndRemoveUntil(new MaterialPageRoute(builder: (context)=>new Myhome())
      ,(route)=>route==null);

Flutter 轮播图

image.png

DiaLog

image.png
image.png
image.png
image.png
image.png
image.png

自定义DiaLog

class MyDiaLog extends Dialog{
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return  new Material(
      type: MaterialType.transparency,
      child: new Center(
        child:Container(
          width: 100,
          height: 100,
          color: Colors.blue,
        ) ,
      ),
    );
  }
}



//调用
showDialog(
                       context: context,
                        builder: (context){
                         return MyDiaLog();
                        });

GestureDetector 获取内部点击事件

定时任务和延时任务

// 延时milliseconds执行返回
    Future.delayed(Duration(milliseconds: milliseconds),voidCallback);


//定时循环执行任务
_timer = Timer.periodic(Duration(milliseconds: milliseconds), callback);
_timer.cancel();  //取消任务

时间类

//获取指定年月日的 时间 
//转成成毫秒值
form=DateTime(dt.year,dt.month,1).millisecondsSinceEpoch.toString();

//获取当前的时间
DateTime.now().millisecondsSinceEpoch.toString();

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,186评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,858评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,620评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,888评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,009评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,149评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,204评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,956评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,385评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,698评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,863评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,544评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,185评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,899评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,141评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,684评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,750评论 2 351