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"),

],

),

你可能感兴趣的:(flutter)