Flutter 容器类 Widget

作者: d74f37143a31 | 来源:发表于2019-01-26 23:16 被阅读8次

在开发中我们的基础控件大部分在容器类 Widget中显示,所以先来了Flutter有哪些容器类Widget

这篇文章可能会有点乱,大概了解一下容器类 Widget 就行,知道哪些 容器 widget 可以实现哪些功能,使用的使用翻文档即可

Container

Container 是最常用的容器类widget,下面是Container的定义:

Container({
  this.alignment,
  this.padding, //容器内补白,属于decoration的装饰范围
  Color color, // 背景色
  Decoration decoration, // 背景装饰
  Decoration foregroundDecoration, //前景装饰
  double width,//容器的宽度
  double height, //容器的高度
  BoxConstraints constraints, //容器大小的限制条件
  this.margin,//容器外补白,不属于decoration的装饰范围
  this.transform, //变换
  this.child,
})
image

实现上面图片的这个例子的伪代码如下:

Container(
  margin: EdgeInsets.only(top: 50.0, left: 120.0), //容器外补白
  constraints: BoxConstraints.tightFor(width: 200.0, height: 150.0), //卡片大小
  decoration: BoxDecoration(//背景装饰
      gradient: RadialGradient( //背景径向渐变
          colors: [Colors.red, Colors.orange],
          center: Alignment.topLeft,
          radius: .98
      ),
      boxShadow: [ //卡片阴影
        BoxShadow(
            color: Colors.black54,
            offset: Offset(2.0, 2.0),
            blurRadius: 4.0
        )
      ]
  ),
  transform: Matrix4.rotationZ(.2), //卡片倾斜变换
  alignment: Alignment.center, //卡片内文字居中
  child: Text( //卡片文字
    "5.20", style: TextStyle(color: Colors.white, fontSize: 40.0),
  ),
);

Scaffold、TabBar、底部导航

参考:Scaffold、TabBar、底部导航

Scaffold

Flutter Material库提供了一个Scaffold Widget,它是一个路由页的骨架,可以非常容易的拼装出一个完整的页面

image
image

上面两图中包含的内容:

  1. 一个导航栏
  2. 导航栏右边有一个分享按钮
  3. 有一个抽屉菜单
  4. 有一个底部导航
  5. 右下角有一个悬浮的动作按钮

实现的伪代码如下:

class ScaffoldRoute extends StatefulWidget {
  @override
  _ScaffoldRouteState createState() => _ScaffoldRouteState();
}

class _ScaffoldRouteState extends State<ScaffoldRoute> {
  int _selectedIndex = 1;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar( //导航栏
        title: Text("App Name"), 
        actions: <Widget>[ //导航栏右侧菜单
          IconButton(icon: Icon(Icons.share), onPressed: () {}),
        ],
      ),
      drawer: new MyDrawer(), //抽屉
      bottomNavigationBar: BottomNavigationBar( // 底部导航
        items: <BottomNavigationBarItem>[
          BottomNavigationBarItem(icon: Icon(Icons.home), title: Text('Home')),
          BottomNavigationBarItem(icon: Icon(Icons.business), title: Text('Business')),
          BottomNavigationBarItem(icon: Icon(Icons.school), title: Text('School')),
        ],
        currentIndex: _selectedIndex,
        fixedColor: Colors.blue,
        onTap: _onItemTapped,
      ),
      floatingActionButton: FloatingActionButton( //悬浮按钮
          child: Icon(Icons.add),
          onPressed:_onAdd
      ),
    );
  }
  void _onItemTapped(int index) {
    setState(() {
      _selectedIndex = index;
    });
  }
  void _onAdd(){
  }
}

Appar

AppBar是一个Material风格的导航栏,它可以设置标题、导航栏菜单、底部Tab等

AppBar({
  Key key,
  this.leading, //导航栏最左侧Widget,常见为抽屉菜单按钮或返回按钮。
  this.automaticallyImplyLeading = true, //如果leading为null,是否自动实现默认的leading按钮
  this.title,// 页面标题
  this.actions, // 导航栏右侧菜单
  this.bottom, // 导航栏底部菜单,通常为Tab按钮组
  this.elevation = 4.0, // 导航栏阴影
  this.centerTitle, //标题是否居中 
  this.backgroundColor,
  ...   //其它属性见源码注释
})

TabBar

Material组件库中提供了一个TabBar组件,它可以快速生成Tab菜单

底部导航

可以通过Scaffold的bottomNavigationBar属性来设置底部导航
具体实现参考:https://book.flutterchina.club/chapter5/material_scaffold.html

image

BoxConstraints和SizedBox

BoxConstraints 用于对齐 子widget添加额外的约束。

const BoxConstraints({
  this.minWidth = 0.0, //最小宽度
  this.maxWidth = double.infinity, //最大宽度
  this.minHeight = 0.0, //最小高度
  this.maxHeight = double.infinity //最大高度
})

SizedBox 用于给子widget指定固定的宽高,如:

SizedBox(
  width: 80.0,
  height: 80.0,
  child: redBox
)

DecoratedBox

DecoratedBox可以在其子widget绘制前(或后)绘制一个装饰Decoration(如背景、边框、渐变等)

DecoratedBox定义如下:

const DecoratedBox({
  Decoration decoration,
  DecorationPosition position = DecorationPosition.background,
  Widget child
})
  • decoration:代表将要绘制的装饰,它类型为Decoration,Decoration是一个抽象类,它定义了一个接口 createBoxPainter(),子类的主要职责是需要通过实现它来创建一个画笔,该画笔用于绘制装饰。
  • position:此属性决定在哪里绘制Decoration,它接收DecorationPosition的枚举类型,该枚举类两个值:
    • background:在子widget之后绘制,即背景装饰。
    • foreground:在子widget之上绘制,即前景。

BoxDecoration

它是一个Decoration的子类,实现了常用的装饰元素的绘制

BoxDecoration({
  Color color, //颜色
  DecorationImage image,//图片
  BoxBorder border, //边框
  BorderRadiusGeometry borderRadius, //圆角
  List<BoxShadow> boxShadow, //阴影,可以指定多个
  Gradient gradient, //渐变
  BlendMode backgroundBlendMode, //背景混合模式
  BoxShape shape = BoxShape.rectangle, //形状
})
image

该效果实现如下:

DecoratedBox(
    decoration: BoxDecoration(
      gradient: LinearGradient(colors:[Colors.red,Colors.orange[700]]), //背景渐变
      borderRadius: BorderRadius.circular(3.0), //3像素圆角
      boxShadow: [ //阴影
        BoxShadow(
            color:Colors.black54,
            offset: Offset(2.0,2.0),
            blurRadius: 4.0
        )
      ]
    ),
  child: Padding(padding: EdgeInsets.symmetric(horizontal: 80.0, vertical: 18.0),
    child: Text("Login", style: TextStyle(color: Colors.white),),
  )
)

相关文章

  • Flutter 容器类 Widget

    在开发中我们的基础控件大部分在容器类 Widget中显示,所以先来了Flutter有哪些容器类Widget 这篇文...

  • Flutter之容器类Widget

    Flutter和Dart系列文章 项目GitHub地址 容器类Widget和布局类Widget都作用于其子Widg...

  • 11、Flutter布局组件

    Flutter中的布局容器主要分为两类:只能包含一个子Widget的布局容器和可以包含多个子Widget的容器,下...

  • 4.1 容器类Widget-Padding

    原文在此,这里只为学习 容器类Widget和布局类Widget区别 共同点容器类Widget和布局类Widget都...

  • Flutter七:Flutter容器类Widget

    容器(Container)填充(Padding)溢出父容器(OverFlowBox) 限定最大最小宽高布局(Con...

  • Flutter 容器 Padding

    容器类Widget 不同于 布局类Widget: 首先,布局类Widget 的子Widget 一般都是数组,而容器...

  • Flutter之Widget和Element

    一、Widget Flutter是移动UI框架,Widget组件是UI的基础。 它们都是抽象类,继承Widget,...

  • Flutter 学习 - 功能类Widget

    前言 功能类的Widget指的是非UI的Widget,具有一定的功能性,Flutter中有很多功能类的Widget...

  • Flutter入门03 -- Widget的整体结构

    Flutter 的所有类都可以看做是 Widget,大部分的类都是继承自 Widget 类,所以学习和了解 Flu...

  • Flutter中的widget和其生命周期

    1.Widget 在Flutter中所有的组成都是widget,可以成为组件或者控件Widget可以分为2类Sta...

网友评论

    本文标题:Flutter 容器类 Widget

    本文链接:https://www.haomeiwen.com/subject/ncyerqtx.html