flutter

widgets

1、widgets文本和字体。 在树形结构中可以继承父节点的样式

  eg:(1)文本后面直接跟样式

    Text(

"HELLO BODYHELLO BODYHELLO BODYHELLO BODYHELLO BODYHELLO BODYHELLO BODYHELLO BODYHELLO BODYHELLO BODYHELLO BODYHELLO BODYHELLO BODYHELLO BODYHELLO BODYHELLO BODY",

textAlign: TextAlign.center,

maxLines: 2,

overflow: TextOverflow.ellipsis,

textScaleFactor: 1.4,

),

(2)先定义样式。在直接调用

      const style=TextStyle(

//      color: Colors.yellow,

//    0x固定的 ff是不透明度  最后六位是颜色

        color: const Color(0xffff0000),

fontSize: 20,

fontFamily: "yahei",

decoration: TextDecoration.underline,

decorationStyle: TextDecorationStyle.dashed

);

Text("样式",style: style),

(3) span标签的用法 text标签独占一行

      Text.rich(TextSpan(

children: [

TextSpan(text: "主页:",

style: TextStyle(

fontSize: 30

)),

TextSpan(text: "https://www.baidu.com",

style: TextStyle(

color: Colors.blue

)),

],

style: TextStyle(

fontSize: 40

)

))

2、widgets按钮

//有颜色 悬浮按钮  带阴影

          RaisedButton(

child: Text("RaisedButton"),

onPressed: ()=>{

print("RaisedButton on")

},

),

//无颜色  点击时有颜色

            FlatButton(

child: Text("FlatButton"),

onPressed: ()=>{

print("FlatButton on")

},

),

//外面有边框

            OutlineButton(

child: Text("OutlineButton"),

onPressed: ()=>{

print("OutlineButton on")

},

),

//自定义

            FlatButton(

child: Text("FlatButton自定义"),

color: Colors.blue,

textColor: Colors.red,

highlightColor: Colors.yellow,

//圆角

              shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20.0)),

onPressed: ()=>{

print("FlatButton on")

},

),

//            IconButton:图标按钮,继承自StatelessWidget

3、图片和图标

图片

    //          1、加载本地图片  需要在pubspec.yaml里面的assets进行注册

    //          fill填满盒子  图片大小和盒子一样时使用

    //          cover自动计算  宽高看谁能填满 超出部分截断

    //          fitWidth先填满宽

    //          fitHeight先填满高

    //          none图片自由发挥

              Image.asset("static/imgs/1.png",

fit: BoxFit.none,

),

//            2、加载网络图片

              Image.network("https://www.baidu.com/img/bd_logo1.png?qua=high",

//颜色混合

                color: Colors.pink,

//        BlendMode.difference混合模式

      //        BlendMode.darken变深一点

                colorBlendMode: BlendMode.darken,

width: 150,

//

),

图标

              //1、引用字体文件 自带的

              Icon(Icons.access_alarm),

//          2、引用字体文件 自定义的图标

    //引入第三方的字体库

    //          1、下载第三方的字体库

    //          2、把ttf文件copy到项目工程文件中

    //          3、在pubspec.yaml里面的fonts自定义一个字体  family随便写 assets路径是本地ddf的路径

    //          4、自定义一个dart文件 创建一个自己的class都是IconData类型

              Icon(MyIcon.jingdon,

color: Colors.yellow,

),

Icon(MyIcon.xiaomi),

Icon(MyIcon.xiecheng),

],

MyIcon.dart

import 'package:flutter/material.dart';

class MyIcon{

static const IconData xiaomi=const IconData(

//    0x是固定的 后四位取下载下来资源包的html中的后四位

              0xe661,

fontFamily: 'myCoodIcon',

//是否跟文字方向一样

              matchTextDirection: true

);

static const IconData xiecheng=const IconData(

0xe62b,

//    pubspec.yaml自定义的文字名字

                fontFamily: 'myCoodIcon',

//是否跟文字方向一样

                matchTextDirection: true

);

static const IconData jingdon=const IconData(

0xe612,

fontFamily: 'myCoodIcon',

//是否跟文字方向一样

                matchTextDirection: true

);

}

4、下拉框(DropdownButton)

有自己的值  就是有自己的状态 用StatefulWidget

StatelessWidget不保存状态  只负责描绘

  new  DropdownButton

class MyDropDownButton extends StatefulWidget {

@override

State createState() {

//TODO: implement createState

    //把实现类return出来

        return _MyDropDownButton();

}

}

//_MyDropDownButton是MyDropDownButton的实现

    class _MyDropDownButton extends State {

List getCityList(){

List cityList=new List();

cityList.add(DropdownMenuItem(child: new Text("上海"),value: "shanghai",));

cityList.add(DropdownMenuItem(child: new Text("北京"),value: "beijing",));

cityList.add(DropdownMenuItem(child: new Text("广州"),value: "guangzhou",));

cityList.add(DropdownMenuItem(child: new Text("深圳"),value: "shenzhen",));

return cityList;

}

var selectedCity;

@override

Widget build(BuildContext context) {

//TODO: implement build

        return new Column(

children: [

new DropdownButton(

//下拉框的内容

                items: getCityList(),

//提示

                hint: new Text("请选择城市"),

value: selectedCity,

onChanged: (val){

print(val);

//把值存起来并且进行页面刷新  重绘

                  setState(() {

this.selectedCity=val;

});

}

)

],

);

}

}

5、单选框和多选框

  class SwitchAndRedioComponent extends StatefulWidget{

@override

State createState() {

//TODO: implement createState

      return _SwitchAndRedioComponent();

}

}

class _SwitchAndRedioComponent extends State{

var _switchVal=true;

var _CheckboxVal=true;

@override

Widget build(BuildContext context) {

//TODO: implement build

      return new Column(

children: [

Switch(value: _switchVal, onChanged: (val){

print(val);

setState(() {

this._switchVal=val;

});

}),

Checkbox(value: _CheckboxVal,

onChanged:(val){

print(val);

setState(() {

this._CheckboxVal=val;

});

}),

],

);

}

}

6、输入框

  TextEditingController _pswController=new TextEditingController();

//解耦合 复杂计算都放到controller里面

    _pswController.addListener(() {

print(_pswController.text);

});

TextField(

autofocus: true,

decoration:InputDecoration(

labelText: "用户名",

hintText: "请输入用户名",

prefixIcon:Icon(Icons.assignment_ind)

) ,

//键盘

            keyboardType: TextInputType.text,

onChanged: (val){

print(val);

},

),

TextField(

autofocus: false,

decoration:InputDecoration(

labelText: "密码",

hintText: "请输入密码",

prefixIcon:Icon(Icons.remove_red_eye),

) ,

//键盘

            keyboardType: TextInputType.text,

//密码输入框

            obscureText: true,

controller: _pswController,

)

表单

  //表单 声明key

GlobalKey _formKey=new GlobalKey();

//拿到表单的值

  TextEditingController _usernameController=new TextEditingController();

//表单

  Form(

key:_formKey,

autovalidate: true,

child:new Column(

children: [

//输入框 跟form搭配使用的

        TextFormField(

autofocus:true ,

controller: _usernameController,

decoration: InputDecoration(

labelText: "用户名",

hintText: "请输入用户名",

icon: Icon(Icons.perm_contact_calendar)

),

//校验值

          validator: (val){

//                  trim()方法的作用就是去掉字符串前面和后面的空格.

if(val.trim().length<6){

return "用户名需要六位以上!";

}

return val.trim().length>0?null:"请输入用户名";

},

),

RaisedButton(

child: new Text("提交"),

onPressed: (){

//        as FormState强制类型转换

            if((_formKey.currentState as FormState).validate()){

print("提交给后台");

print(_usernameController);

print(_usernameController.text);

}

},

)

],

) ,

)

线性布局

row横向排列

column纵向排列

    crossAxisAlignment: CrossAxisAlignment.center,

//          start上边缘对齐

    //          end下边缘对齐

    //          center居中对齐

弹性布局

//方向 横向

          direction: Axis.horizontal,

//方向 垂直

          direction: Axis.vertical,

Flex和 Expanded成对使用 代表弹性布局

  flex占据的份数

定位  SizedBox  Positioned组成

      body: SizedBox(

width: 400,

height: 400,

child: Stack(

alignment: Alignment.topRight,

children: [

Positioned(

left: 15,

top: 30,

child: Container(

width: 100,

height: 100,

color: Colors.red,

),

),

//          Positioned(

//            right:100,

//            top: 30,

//            child: Container(

//              width: 300,

//              height: 300,

//              color: Colors.yellow,

//            ),

//          ),

],

),

)

流式布局 Wrap

spacing横向间距

    runSpacing垂直间距

    alignment: WrapAlignment.end,对齐方式

内边距

  //        padding: EdgeInsets.all(30),

//        padding: EdgeInsets.fromLTRB(10, 20, 30, 40),

padding: EdgeInsets.only(top: 100),

布局限制类容器

    //    body: SizedBox(具体宽高

    //      height: 400,

//      width: 300,

//      child: Container(

//        color: Colors.red,

//      ),

//    ),

body: ConstrainedBox(范围

    //      constraints: BoxConstraints.expand(),//填满剩余容器

          constraints: BoxConstraints(

// minWidth: double.infinity,横向填满

            minWidth: 100,

minHeight: 200,

maxWidth: 200,

maxHeight: 300

),

child: Container(

width: 50,

height: 100,

color: Colors.red,

),

),

);

}

装饰容器

  DecoratedBox对child进行修饰

  //装饰容器

      body: DecoratedBox(decoration: BoxDecoration(

gradient: LinearGradient(colors: [Colors.yellow, Colors.red]),

borderRadius: BorderRadius.all(Radius.circular(3)),

boxShadow:[

BoxShadow(

color: Colors.black,

offset: Offset(3, 3),

blurRadius: 4.0

)

],

),

child: FlatButton(onPressed: null, child: Text("test")),

),

);

}

}

变换 Transform改变表现的样子,所占的位置还是原来的位置

    skewX skewY拉伸

      Container(

//            color: Colors.red,

//            child: Transform(

//              transform: new Matrix4.skewX(0.5),

//              transform: new Matrix4.skewY(0.5),

//              child: Container(

//                color: Colors.blue,

//                child: Text("hhhhhhhhhh"),

//              ),

//            ),

//          )

scale放大

    Container(

color: Colors.red,

child: Transform.scale(

scale:4,

child: Container(

color: Colors.blue,

child: Text("hhhhhhhhhh"),

),

),

)

],

rotate旋转

      Container(

color: Colors.red,

width: 300,

height: 300,

child: Transform.rotate(

angle:math.pi*3/4,

child: Container(

color: Colors.blue,

child: Text("hhhhhhhhhh"),

),

),

)

container

body: Column(

children: [

Container(

alignment: Alignment.bottomRight,

height: 200,

width: 300,

color: Colors.red,

child: Text("1111"),

//上下边距会相加

    //          margin: EdgeInsets.only(bottom: 20),

),

Container(

//          margin: EdgeInsets.all(20),

margin: EdgeInsets.only(top: 20),

alignment: Alignment.bottomRight,

height: 200,

width: 300,

color: Colors.blue,

child: Text("222222"),

),

Container(

//          margin: EdgeInsets.all(20),

padding: EdgeInsets.all(20),

alignment: Alignment.bottomRight,

color: Colors.yellow,

child: Text("333"),

),

],

),

可滚动的小部件 widget

Scrollbar结合 SingleChildScrollView形成可滚动的区域

只有一个元素并且长

    body: Scrollbar(

child: SingleChildScrollView(

child: Container(

height: 3000,

color: Colors.red,

),

)),

listview组件 最常用

  body: Column(

children: [

ListTile(

title: Text("固定的表头"),

),

Container(

height: 400,

child: ListView.builder(

itemCount: 50,

//每一个item的高度

                  itemExtent: 50,

itemBuilder: (BuildContext context, int index) {

//                return Text("列表内容$index");

return Text("列表内容" + index.toString());

}),

)

],

),

GridView做九宫格八宫格的时候用

    body: GridView(

//对GridView的限制

            gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(

//每一行有多少个

              crossAxisCount: 4,

childAspectRatio: 1

),

children: [

Text("1"),

Text("2"),

Text("3"),

Text("4"),

Text("5"),

Text("6"),

Text("7"),

Text("8"),

Text("9"),

],

),

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