flutter常用组件

251 阅读3分钟
### Container(盒容器)
```dart
@override
  Widget build(BuildContext context){
    return Container(
      decoration: new BoxDecoration(
        color:Colors.yellow
      ),
      child: Flex(
        direction: Axis.horizontal,
        children: <Widget>[
        FlatButton(
          child: Text("按钮"),
          textColor: Colors.red,
          onPressed: (){
              dalog(context);
            },
        )
      ],),
    );
  }

主要是关注decoration (装饰) 可以设置container的属性,这里color指的是背景色

image.png

decoration还可以设置background背景图片

decoration: BoxDecoration(
  image: DecorationImage(
    image: AssetImage("images/login.jpg"),
    fit: BoxFit.cover
  )
),

AlertDialog(提示框)

 @override
  Widget build(BuildContext context){
    return Container(
      child: FlatButton(
          child: Text("按钮"),
          textColor: Colors.red,
          onPressed: (){
              dalog(context);
            },
        )
    );
  }

void dalog(BuildContext context){
  showDialog<void>(
    context: context,
    barrierDismissible:false,
    builder: (BuildContext context){
      return AlertDialog(
        title: Text("测试"),
        content: SingleChildScrollView(
          child: ListBody(children: <Widget>[
            Text("中间内容"),
            Text("中间内容1")
          ],),
        ),
        actions: <Widget>[
          FlatButton(
              child: Text("actions"),
              onPressed: (){
                Navigator.of(context).pop(); //关闭弹框9
              },
            )
        ],
      );
    }
  );
}

image.png

simpleDialog (简洁的弹框,多步骤弹框)


@override
  Widget build(BuildContext context){
    return Container(
      child: FlatButton(
          child: Text("按钮"),
          textColor: Colors.red,
          onPressed: (){
              simpleDialog(context);
            },
        )
    );
  }

enum Department{
  one,
  two,
  three
}

Future<void> simpleDialog(BuildContext context) async{
    switch(await showDialog<Department>(
      context: context, 
      builder: (BuildContext context){
        return SimpleDialog(
            title: Text("simpletitle"),
            children: <Widget>[
              SimpleDialogOption(
                  onPressed: (){
                    Navigator.pop(context, Department.one);
                  },
                  child: Text("one"),
              ),
              SimpleDialogOption(
                  onPressed: (){
                    Navigator.pop(context, Department.two);
                  },
                  child: Text("two"),
              ),
              SimpleDialogOption(
                  onPressed: (){
                    Navigator.pop(context, Department.three);
                  },
                  child: Text("three"),
              )
            ],
          );
      }
    )) {
      case Department.one:
        print("第一种情况");
        break;
      case Department.two:
        print("第二种情况");
        break;
      case Department.three:
        print("第三种情况");
        break;
    }
}

image.png image.png

alertdialog会返回一个结果,这样可以通过switch或其他方法做多次弹框等其他操作

BottomNavigationBar

import 'package:flutter/material.dart';
import './../main/index.dart';
import './../shopping/index.dart';
import './../product/index.dart';
import './../mine/index.dart';
class BottomBar extends StatefulWidget {
  @override
  _BottomBarState createState() => _BottomBarState();
}

class _BottomBarState extends State<BottomBar> {
  int _index=0;
  List<Widget> list = new List<Widget>();
  @override
  void initState(){
    list
      ..add(Main())
      ..add(Product())
      ..add(Shopping())
      ..add(Mine());
      super.initState();
      //添加界面到list
  }
  @override
  Widget build(BuildContext context) {
    return Container(
      height: 300,
      decoration: BoxDecoration(color: Colors.white),
        child: Scaffold(
        appBar: AppBar(
          title: Text("主页"),
        ),
        body: list[_index],
        bottomNavigationBar: BottomNavigationBar(
          backgroundColor: Color.fromRGBO(245,245,245,1),
          iconSize: 15,
          showUnselectedLabels: true,
           // 超过3个bottombar需要设置这个属性为true才能
          //显示没有选中的bottombar的文字
          // fixedColor: Colors.white,
          selectedItemColor: Color.fromRGBO(254,69,67, 1),
          unselectedItemColor: Colors.grey, 
          items: [
            BottomNavigationBarItem(icon: Icon(IconData(0xe610,fontFamily: "Iconfont" ), size: 22.0,),title: Text("首页")),
            BottomNavigationBarItem(icon: Icon(IconData(0xe630, fontFamily: "Iconfont"), size: 20.0,),title: Text("全部商品")),
            BottomNavigationBarItem(icon: Icon(IconData(0xe608, fontFamily: "IconFont"), size: 22.0,),title: Text("购物车")),
            BottomNavigationBarItem(icon: Icon(IconData(0xe614, fontFamily: "IconFont"), size: 22.0,),title: Text("我的"))
          ], //这里用的是阿里图标
          currentIndex: _index,
          onTap: (int i){ //点击之后选中某个界面
            setState(() {
            _index = i; 
            });
          },
        ),
      ));
  }
}

阿里图标的使用,

把阿里图标下载到本地,选中iconfont.ttf 文件到文件根目录font下, 在pubspec.yaml中

  fonts:
    - family: Iconfont
      fonts:
        - asset: font/iconfont.ttf

在文中使用

Icon(IconData(0xe614, fontFamily: "IconFont"), size: 22.0,)

把&#xe620; 换成0xe620;

Padding组件

padding组件主要给元素设置padding值

@override
  Widget build(BuildContext context){
    return Padding(
      padding: EdgeInsets.only(left: 15, right: 15,top: 15),
      child: buildGrid(),
    );
  }

用padding包裹子元素,EdgeInsets 来设置padding的值,EdgeInsets.only设置top,left,bottom,right特定位置的paddng,EdgeInsets.all(); 设置上中下左位置的padding

Row元素

Widget buildGrid(){
    List<Widget> titls =[];
    Widget content;
    for(var item in list) {
      titls.add(
        Expanded(
          child: Image(image: AssetImage(item['src'])),
          flex: 1,
        )
      );
    }
    content = Row(children: titls);
    return content;
  }

在row元素厘米,可以用Expanded设置每个子元素占比多少

附带点击事件的盒子InkWell,

InkWell 带有单机双击事件等,

InkWell(
    onTap: (){
      print("1111111");
    },
    child: Text("xxxx"),
  )

按钮组件

RaisedButton:凸起的按钮,其实就是 Material Design 风格的 Button

FlatButton:扁平化的按钮

OutlineButton:线框按钮

IconButton:图标按钮

ButtonBar:按钮组

FloatingActionButton:浮动按钮

DropdownButton:下拉框按钮

TabBar, TabBarView使用

class StudentDetails extends StatefulWidget {
  @override
  _StudentDetailsState createState() => _StudentDetailsState();
}

class _StudentDetailsState extends State<StudentDetails> {
  double width = 0;
  double height = 0;
  TabController _controller;
  @override
  void initState() {
    super.initState();
    _controller = TabController(length: 3, vsync: ScrollableState());
  }

  @override
  Widget build(BuildContext context) {
    setState(() {
      width = width;
      height = height;
    });
    return Scaffold(
        appBar: AppBar(
          backgroundColor: ComColors.white,
          centerTitle: true,
          title: P(
            "每周报告",
            color: Colors.black,
            fontSize: titleSize,
          ),
          automaticallyImplyLeading: false,
          bottom: TabBar(
            controller: _controller,
            labelColor: ComColors.green,
            unselectedLabelColor: ComColors.back,
            isScrollable: false,
            indicator: UnderlineTabIndicator(
                borderSide: BorderSide(style: BorderStyle.none)),
            tabs: <Widget>[
              Text(
                "周报告"
              ),
              Text( "错题本"),
              Text( "字词闯关")
            ],
          ),
        ),
        body: TabBarView(
          controller: _controller,
          children: [
            Container(
              child: P("报告"),
            ),
            Container(
              child: P("错题本"),
            ),
            Container(
              child: P("字词闯关"),
            )
          ],
        ));
  }
}

上拉抽屉 showModalBottomSheet

可以遮住bottombar的抽屉

showModalBottomSheet(
        backgroundColor: Colors.black54,
        context: context,
        builder: (BuildContext context) {
          return Container(
            height: height,
            width: width,
            child: InkWell(
                onTap: () => Navigator.pop(context),
                child: Stack(children: [
                  Positioned(
                      bottom: 0,
                      left: 0,
                      height: 170,
                      width: width,
                      child: ClipRRect(
                        borderRadius: const BorderRadius.only(
                            topLeft: Radius.circular(15),
                            topRight: Radius.circular(15)),
                        child: Container(
                          height: 170,
                          padding: const EdgeInsets.all(20),
                          color: ComColors.white,
                          child: Column(
                            children: [
                              SheetIListtem(
                                title: "发布日常跟线任务",
                                doPress: () => {},
                              ),
                              SheetIListtem(
                                title: "问题反馈",
                                doPress: () => {
                                  Navigator.of(context).pushNamed("problem")
                                },
                              ),
                              SheetIListtem(
                                title: "发布退换货任务",
                                doPress: () => {},
                              ),
                            ],
                          ),
                        ),
                      ))
                ])),
          );
        })

image.png

showBottomSheet 不能遮住bottombar的抽屉

旋转角度的组件

RotatedBox(
                                quarterTurns: 0,
                                child: 
                              )