Flutter-UI-基础控件

Posted 冯汉栩

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flutter-UI-基础控件相关的知识,希望对你有一定的参考价值。

一直觉得自己写的不是技术,而是情怀,一个个的教程是自己这一路走来的痕迹。靠专业技能的成功是最具可复制性的,希望我的这条路能让你们少走弯路,希望我能帮你们抹去知识的蒙尘,希望我能帮你们理清知识的脉络,希望未来技术之巅上有你们也有我。

小知识

1.int _currentIndex = 0; 创建带有下划线属性 是一个私有属性

Center

作用:用于中心对齐文字
属性
child

Center(
  child: ,
)

Text

child: Text(
    'fenghanxuqwertyuiopasdfgjkgh',
    overflow: TextOverflow.clip,//ellipsis 超出一行3个点   fade 超出一行渐变  clip 超出一行裁剪
    maxLines: 3,//设置Label的行数
    textScaleFactor: 2,//字体放大两倍
    textAlign: TextAlign.center,//对齐方式
    textDirection: TextDirection.ltr,
    style: TextStyle(//设置文字样式
        decoration: TextDecoration.lineThrough,//中间有一个行横线
        decorationColor: Colors.white,//中间有一个行横线 颜色
        decorationStyle: TextDecorationStyle.dashed,//中间有一个行横线 虚线
        letterSpacing: 0.0,//字体之间的左右间距
        fontStyle: FontStyle.italic,//字体倾斜
        fontWeight: FontWeight.w900,//字体粗细(加粗)
        backgroundColor: Colors.red,//设置背景颜色
        fontSize: 20.0,//设置文字大小
        color: Color.fromRGBO(234, 123, 155, 1.0),//设置文字颜色
//          color: Colors.yellow,//设置文字颜色
   ),
),

MaterialApp

是一个跟组件 作为App的跟组件 相当于每个页面都要加的 加了之后页面默认是白色的。不然是黑色的

属性
home - 主页
title - 标题
color - 颜色
theme - 主题
routes - 路由

固定页面结构
return MaterialApp(
  home: Scaffold(
    appBar: AppBar(
      title: Text('Flutter Demol'),
    ),
    body: HomeContent(),
  ),
  theme: ThemeData(
    primarySwatch: Colors.yellow,//修改主题颜色   想导航栏的颜色
  ),
);

Scaffold

属性
appBar - 显示假面顶部的一个AppBar
body - 当前界面所显示的主要内容
drawer - 抽屉菜单控件

Container

容器组件
属性
child
height
width
decoration 设置背景颜色和边框颜色

child: Container(
  child: Text('fenghanxuqwertyuiopasdfgjkgh'),
  height: 300,
  width: 300,
  decoration: BoxDecoration(
     color: Colors.blue,//容易背景颜色
     border: Border.all(
              color: Colors.green,//边框颜色
              width: 2//边框宽度
     ),
     borderRadius: BorderRadius.all(Radius.circular(10.0),),//设置容器圆角
  ),
//padding: EdgeInsets.all(20),//容器之间的内边距
  padding: EdgeInsets.fromLTRB(20, 20, 20, 20),//容器之间的内边距
//margin: EdgeInsets.all(20), //容器之间的外距离
  margin:  EdgeInsets.fromLTRB(20, 20, 20, 20),//容器之间的外距离
//transform: Matrix4.translationValues(10, 10, 10),//容器位移
//transform: Matrix4.rotationZ(0.3),//旋转 Matrix4.rotationX(0.3), Matrix4.rotationY(0.3),
//transform: Matrix4.diagonal3Values(0.5, 0.5, 0.5),//缩放倍数
  alignment: Alignment.bottomRight,//内容相对容器的对齐方式
),

Image

网络图片加载不成功两个问题:
1.是否连接wifi
2.重新烧录需要点击是否同意访问网络
3.url是否有效
加载网络图片

child: Image.network(
  'https://www.itying.com/images/upload/Image/3333333.png',
  alignment: Alignment.bottomRight,//图片相对容器的对齐方式
  color: Colors.yellow,//图片背景颜色
  colorBlendMode: BlendMode.colorBurn,//图片混合模式
  fit: BoxFit.cover,//显示效果 cover  自适应 fill  铺满可能变形 fitWidth 宽充满 filHright 高充满 repeat 多张图片平铺
),

图片切圆方法
加载网络图片

child: Container(
  child: ClipOval(
    child: Image.asset('https://www.itying.com/images/flutter/2.png',
    width: 100,
    height: 100,
    fit: BoxFit.cover,),
  ),
),

导入本地图片

child: Container(
  child: ClipOval(
    child: Image.asset('images/NahuoLogo1024.png',
    width: 100,
    height: 100,
    fit: BoxFit.cover,),
  ),
),

ListView 列表

最简单的列表

    return ListView(
//      scrollDirection: Axis.horizontal,//设置水平列表
      padding: EdgeInsets.all(10),//设置上下左右间距20
      children: <Widget>[
        ListTile(
          leading: Icon(Icons.home,color: Colors.blue,size: 40,),//加载系统图标
          title: Text(
            'fenghanxu',
            style: TextStyle(
              fontSize: 20,
            ),
          ),
          subtitle: Text('subtitleFenghanxu'),
          trailing: Icon(Icons.search,color: Colors.blue,size: 40,),
        ),
        ListTile(
          leading: Image.network('https://www.itying.com/images/flutter/1.png'),//加载网络图片
          title: Text('fenghanxu'),
          subtitle: Text('subtitleFenghanxu'),
        ),
      ],
    );

通过for循环实现动态遍历ListItem列表

class _MyHomePageState extends State<MyHomePage> {

  List<Widget> _getData(){
    List<Widget> list = new List();
    for(var i = 0; i < 20; i++){
      list.add(ListTile(
        title: Text('i am is $i list'),
      ));
    }
    return list;
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: ListView(
//      scrollDirection: Axis.horizontal,//设置水平列表
          padding: EdgeInsets.all(10),//设置上下左右间距20
          children: _getData(),
        ),
      ),
    );
  }
}

GridView 网格

GridView.count 静态网格布局

//GridView  for循环数据
import 'package:flutter/material.dart';
import 'res/listData.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Flutter Demol'),),
        body: HomeContent(),
      ),
    );
  }

}


class HomeContent extends StatelessWidget {

  List<Widget> _getListData(){
    var tempList = listData.map((value){
      return Container(
        child: Column(
          children: <Widget>[
            Image.network(value['imageUrl']),
            SizedBox(
              height: 20,//图片跟文字的间距是20
            ),
            Text(
              value['title'],
              textAlign: TextAlign.center,
              style: TextStyle(
                  fontSize: 15
              ),
            )
          ],
        ),
        decoration: BoxDecoration(//添加边框
            border: Border.all(
                color: Color.fromRGBO(233, 233, 233, 0.9),
                width: 1.0
            )
        ),
      );
    });
    return tempList.toList();
  }

  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return GridView.count(
      crossAxisSpacing: 20.0,//设置cell的左右间距为20
      mainAxisSpacing: 20.0,//设置cell的上下间距为20
      padding: EdgeInsets.all(10),//设置cell的内间距为10(上下左右)
      crossAxisCount: 2,//控制列数
      childAspectRatio: 0.9,//只能调节X Y轴的比例  宽高比0.7
      children: this._getListData(),
    );

  }

}

GridView.builder 动态网格布局

//GridView  数据   GridView.count 静态网格布局
import 'package:flutter/material.dart';
import 'res/listData.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Flutter Demol'),),
        body: HomeContent(),
      ),
    );
  }

}


class HomeContent extends StatelessWidget {

  Widget _getListData(context,index){
    return Container(
      child: Column(
        children: <Widget>[
          Image.network(listData[index]['imageUrl']),
          SizedBox(
            height: 20,//图片跟文字的间距是20
          ),
          Text(
            listData[index]['title'],
            textAlign: TextAlign.center,
            style: TextStyle(
                fontSize: 20
            ),
          )
        ],
      ),
      decoration: BoxDecoration(//添加边框
          border: Border.all(
              color: Color.fromRGBO(233, 233, 233, 0.9),
              width: 1.0
          )
      ),
    );
//    return tempList.toList();
  }

  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return GridView.builder(
      gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
        crossAxisSpacing: 10.0,//设置cell的左右间距为20
        mainAxisSpacing: 10.0,//设置cell的上下间距为20
        crossAxisCount: 2,
      ),
      itemCount: listData.length,//便利的次数是数组的次数
      itemBuilder: this._getListData,//数据方法
    );

  }

}

BoxDecoration 边框

BoxDecoration(
     color: Colors.blue,//容易背景颜色
     border: Border.all(
              color: Colors.green,//边框颜色
              width: 2//边框宽度
     ),
     borderRadius: BorderRadius.all(Radius.circular(10.0),),//设置容器圆角
  )

SizedBox 间隙

SizedBox( height: 20,)//图片跟文字的间距是20

Padding 外边框控件

return Padding(
  padding: EdgeInsets.fromLTRB(10, 10, 0, 0),
  child: Image.network(
      'https://www.itying.com/images/flutter/1.png', fit: BoxFit.cover),
);

Row 水平布局控件

return Row(
  //center start end  spaceAround 两边留固定空隙  spaceBetween 中间留空隙 spaceEvenly  两边留平均空隙
  mainAxisAlignment: MainAxisAlignment.start,//X轴的显示方式
  //crossAxisAlignment: CrossAxisAlignment.end,//Y轴的显示方式 要用一个参考物用的比较小
  children: <Widget>[
    IconContainer(Icons.search,color: Colors.blue,size: 30,),
    IconContainer(Icons.home,color: Colors.yellow,size: 30,),
    IconContainer(Icons.settings,color: Colors.green,size: 30,),
  ],
);

Column 垂直布局控件

return Container(
  width: 200,
  height: 400,
  color: Colors.pink,
  child: Column(
    //center start end  spaceAround 两边留固定空隙  spaceBetween 中间留空隙 spaceEvenly  两边留平均空隙
    mainAxisAlignment: MainAxisAlignment.spaceEvenly,//X轴的显示方式
    //crossAxisAlignment: CrossAxisAlignment.end,//Y轴的显示方式 要用一个参考物用的比较小
    children: <Widget>[
      IconContainer(Icons.search,color: Colors.blue,size: 30,),
      IconContainer(Icons.home,color: Colors.yellow,size: 30,),
      IconContainer(Icons.settings,color: Colors.orange,size: 30,),
    ],
  ),
);

Expanded 控件相对父View的宽度比例

return Container(
  width: 400,
  height: 100,
  color: Colors.pink,
  child: Row(
    //center start end  spaceAround 两边留固定空隙  spaceBetween 中间留空隙 spaceEvenly  两边留平均空隙
    mainAxisAlignment: MainAxisAlignment.spaceEvenly,//X轴的显示方式
    //crossAxisAlignment: CrossAxisAlignment.end,//Y轴的显示方式 要用一个参考物用的比较小
    children: <Widget>[
      Expanded(
        flex: 1,
        child: IconContainer(Icons.search,color: Colors.blue,size: 30,),
      ),
      Expanded(
        flex: 2,
        child: IconContainer(Icons.home,color: Colors.yellow,size: 30,),
      ),
    ],
  ),
); 

Stack

Stack配合Align 使用 Stack 它可以控制子组件的位置

return  Center(
  child: Container(
    height: 400.0,
    width: 300.0,
    color: Colors.red,
    child: Stack(
      alignment: Alignment.center,
      children: <Widget>[
        Align(
          alignment: Alignment.topLeft,
          child: Icon(Icons.home,size: 40,color: Colors.white),
        ),
        Align(
          alignment: Alignment.center,
          child: Icon(Icons.search,size: 40,color: Colors.white),
        ),
        Align(
          alignment: Alignment.bottomRight,
          child: Icon(Icons.select_all,size: 40,color: Colors.white),
        ),
        Align(
          alignment: Alignment(1.0,-0.2),
          child: Icon(Icons.security,size: 40,color: Colors.white),
        ),
      ],
    ),
  ),
);

Stack配合Positioned 使用 Stack 它可以控制子组件的位置

return  Center(
  child: Container(
    height: 400.0,
    width: 300.0,
    color: Colors.red,
    child: Stack(
      alignment: Alignment.center,
      children: <Widget>[
        Positioned(
          left: 10,
          child: Icon(Icons.home,size: 40,color: Colors.white),
        ),
        Positioned(
          bottom: 0,
          left: 100,
          child: Icon(Icons.search,size: 40,color: Colors.white),
        ),
        Positioned(
          right: 10,
          top: 10,
          child: Icon(Icons

以上是关于Flutter-UI-基础控件的主要内容,如果未能解决你的问题,请参考以下文章

AJAX相关JS代码片段和部分浏览器模型

[vscode]--HTML代码片段(基础版,reactvuejquery)

如何在导航控件片段中关闭导航 DrawerLayout onBackPressed

jmeter的Include Controller控件和Test Fragment控件和Module Controller控件

jmeterInclude Controller控件&Test Fragment的使用

控件集合无法修改,因为控件包含代码块(即 <% ... %>)