flutter 属性记录

931 阅读3分钟

start


flutter doctor // 检测依赖
flutter packages get // 安装依赖
flutter run

终端热键

  • r 键 点击后热加载。
  • p 键 显示网格,可看布局情况。 很常用
  • o 键 切换android 和 ios 的预览模式
  • q 键 退出调试预览模式

插件

  • Flutter
  • Dart
  • Awesome Flutter Snippets

flutter msg

Flutter一切皆组件!

  • StatefulWidget: 具有可变状态的窗口部件,也就是你在使用应用的时候就可以随时变化,比如我们常见的进度条,随着进度不断变化。
  • StatelessWidget: 不可变状态窗口组件, 也就是你在使用时不可以改变,比如固定的文字。

text widget 文本组件

属性 属性值 属性描述 eg
TextAlign left center right start end 文本对齐方式 textAlign: TextAlign.start
maxLines 1 设置最多的行数 maxLines: 2
overflow clip ellipsis fade 文本截断方式(切断、打点、渐进消失) overflow: TextOverflow.ellipsis
style fontSize color decoration ... 设置文本样式 style: TextStyle()

height: 该属性用于指定行高,但它并不是一个绝对值,而是一个因子,具体的行高等于fontSize * height
flutter 的fontSize 适配方案?

Container 容器组件

相当于html 的<div>标签。
border 边框使用container 容器下decoration 的border。

  child: Container(
    child: new Text('xxxxxx',style: TextStyle(fontSize: 40.0),),
    alignment: Alignment.topLeft,
    width: 400.0,
    height: 100.0,
    padding: const EdgeInsets.all(10.0),
    margin: const EdgeInsets.fromLTRB(0, 20.0, 20.0, 0),
    decoration:new BoxDecoration(
      border:Border.all(width:2.0,color:Colors.red)
    ),
  )
属性 属性值 属性描述 eg
Alignment bottomCenter bottomLeft bottomRight 等9个 针对容器内child(内容)的对齐方式 alignment: Alignment.topLeft
padding EdgeInsets.all(10.0) 设置padding EdgeInsets.fromLTRB(value1,value2,value3,value4)

还有对应的 width|height|color|margin 等

  • decoration 是container 的修饰器,主要功能是设置背景和边框。

Image 图片组件的使用

  • Image.asset 加载项目资源图片,会增大打包体积,相对路径
  • Image.network 网络资源图片
  • Image.file & Image.memory 基本少用
属性 属性值 属性描述 eg
fit full|contain|cover|fitWidth 等6个 拉伸与挤压 fit: BoxFit.contain
  • fit属性可以控制图片的拉伸和挤压? 测试有误

ListView 列表组件

new ListView(
  children:<Widget>[
    new ListTitle(
      leading: new Icon(Icons.access_time),
      title: new Text('access_time')
    ),
    ...
  ]
)

动态列表用ListView.builder() 这种形式。

GridView 网格列表组件

网格列表经常用来显示多张图片。如相册功能。

body: GridView(
  gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
  crossAxisCount: 3,
    mainAxisSpacing: 2.0,
    crossAxisSpacing: 2.0,
    childAspectRatio: 0.7
  ),
  children: <Widget>[
    new Image.network(''),
    new Image.network(''),
    new Image.network(''),
    new Image.network(''),
  ]
)

页面布局

水平布局、垂直布局、GridView布局、ListView布局、Container布局等。

水平布局Row

Row 控件分灵活排列和非灵活排列 非灵活排列形式:

body: new Row(
  children: <Widget>[
    new XXX,
    new XXX,
    new XXX,
  ]
)

灵活排列。有间隙,使用Expanded 来解决。(占满空间)

body: new Row(
  children: <Widget>[
    Expanded(child: new XXXX),
    Expanded(child: new XXXX),
    Expanded(child: new XXXX),
    Expanded(child: new XXXX),
  ]
)

当然灵活排列与非灵活排列是可以混用的。

垂直布局Column 组件

这里也有主轴与侧轴的区分。

body: Column(
  crossAxisAlignment: CrossAxisAlignment.start, // 文字对齐方式
  mainAxisAlignment: MainAxisAlignment.center,
  children: <Widget>[
    Text('line1 xxx'),
    Text('line1 xxx'),
    Text('line1 xxx')
  ]
)

Stack 层叠布局 (类似前端的定位)

tips: CircleAvatar 组件,里头有radius 的值可以设置弧度情况。

new CircleAvatar(
  backgroundImage: new NetworkImage('http://XXXX'),
  radius: 100.0,
)

Stack 基本使用

var stack = new Stack(
  children: <Widget>[
    new CircleAvatar(
      backgroundImage: new NetworkImage('http://jspang.com/static//myimg/blogtouxiang.jpg'),
      radius: 100.0,
    ),
    new Positioned(
      top:10.0,
      left:10.0,
      child: new Text('JSPang.com'),
    ),
    new Positioned(
      bottom:10.0,
      right:10.0,
      child: new Text('技术胖'),
    )
  ],
);

卡片布局,类似ul => li

ListTile(
  title:new Text('XXXXXXXXXXXXX',style: TextStyle(fontWeight: FontWeight.w500),),
  subtitle: new Text('aaa:1513938888'),
  leading: new Icon(Icons.account_box,color: Colors.lightBlue,),
)

页面导航 (与前端导航和超链接有所不同)

RaisedButton 按钮组件 (用的比较多)

它有两个最基本属性:

  • child: 可以放入容器,图标,文字。这样可以构建多彩的按钮。
  • onPressed 点击事件,此时会调用Navigator 组件。
child: RaisedButton(
  child: Text('查看商品详情页面'),
  onPressed: (){
    Navigator.push(context, new MaterialPageRoute(
      builder: (context) => XXXX
    ));
  },
)

Navigator.push 和 Navigator.pop

  • push: 是跳转下一个页面,接收两个参数,上下文context & 跳转函数
  • pop: 返回上一个页面,使用时传递一个context(上下文)参数,使用时要注意的是,你必须是有上级页面的,也就是说上级页面使用了Navigator.push

参数传递

静态资源和项目图片处理

1、先pubspec.yaml 文件进行声明。

assets:
  - images/blogtouxiang.jpg

2、项目中直接使用

Widget build(BuildContext context) {
  return Container(
    child: Image.asset('images/blogtouxiang.jpg'),
  );
}