flutter showModalBottomSheet常用属性及说明

目录
  • showModalBottomSheet常用属性
    • showModalBottomSheet
  • flutter常见控件及例子
    • 贝塞尔曲线
    • 底部弹窗
    • 下拉框
    • 展开闭合控件
    • 输入框
    • 弹出框加叠加(一个红包的样子)

showModalBottomSheet常用属性

在使用showModalBottomSheet这个控件时,想要设置圆角,在内容widget设置不管用,然后直接看这个控件的实现原理,一看有个shape属性,感觉有戏!果然设置完毕后,成功了。

注意:一定不要设置builder中的背景颜色,否则会覆盖导致不能显示出圆角!

showModalBottomSheet

shape可以设置成自己想要的形状!通常直接设置圆角即可

  • isScrollControlled:是否时全屏还是半屏
  • isDismissible:外部是否可以点击,false不可以点击,true可以点击,点击后消失
  • backgroundColor : 通常可以设置白色和透明,
  • barrierColor:设置遮挡底部的半透明颜色,默认是black54,可以设置成透明的;
  • enableDrag: 是否可以向下拖动关闭,默认是true打开的;

以下代码:

  showModalBottomSheet(
      context: context,
       isScrollControlled:false,
      backgroundColor: Colors.white,
      shape: RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(10))),
      builder: (BuildContext context) {
        return Container(
        	height:50,//对话框高度就是此高度
          child: Center(child: Text("居中文字")),
        );
      });

flutter常见控件及例子

贝塞尔曲线

class BottomClipper extends CustomClipper<Path>{//切割类继承
  @override
  Path getClip(Size size) {//必备属性一
    var path = Path();
    path.lineTo(0, 0);
    path.lineTo(0, size.height-60);
    var frit = Offset(size.width/2,size.height);
    var frit2 = Offset(size.width,size.height-60);
    path.quadraticBezierTo(frit.dx, frit.dy, frit2.dx, frit2.dy);//二次贝塞尔曲线
    path.lineTo(size.width, size.height-60);
    path.lineTo(size.width, 0);
    return path;
  }
  @override
  bool shouldReclip(CustomClipper<Path> oldClipper) {//必备属性二
    // TODO: implement shouldReclip
    return false;
  }
}

调用方法

 ClipPath(
                      clipper: BottomClipper(),
                      child: Container(),
)

底部弹窗

底部弹起
 showModalBottomSheet(
                      context: context,
                      builder:(BuildContext context){
                        return  TabMyApp();//返回的是一个容器
                      }
                    );
// ps:这个控件由于是系统自带空间,下面带了一个白色背景容器,导致弹起容器不能设置圆角
// 解决思路,因为这个背景的大小取决于覆盖于其上的容器大小,故,可以给他一个很小的容器,再用用stack控件把一个较大的
// 的控件悬浮其上,在设置悬浮其上的容器,这样看不到下边大概是
Stack(
    alignment: const FractionalOffset(0.5, 0.935),//相对坐标
      children: <Widget>[
         SizeBox(
			height:10
		),
        // 看的到的容器 设置圆角
		Container(
			height:300
			...
		)
]
)

下拉框

DropdownButtonHideUnderline(
                          child:new DropdownButton(
                              hint: new Text(''),//第一次把hint展示位下拉菜单条目的第一个值(默认值)
                              //设置这个value之后,选中对应位置的item,
                              //再次呼出下拉菜单,会自动定位item位置在当前按钮显示的位置处
                              value: selectItemValue,//下拉菜单选择完之后,呈现给用的值
                              items: generateItemList(),//下拉菜单item点击之后的回调
                              iconSize: 24.0,
                              isDense: true,
                              onChanged: (T){
                                setState(() {
                                  selectItemValue=T;
                                });
                              }
                          ),
                        ),
回调函数
var selectItemValue;
  var selectItemValue1;
  /*DropDownState(){
    selectItemValue=getDropdownMenuItem()[0].value;
  }*/
  List<DropdownMenuItem> generateItemList() {
    List<DropdownMenuItem> items = new List();
    for(int i =0;i<100;i++){
      DropdownMenuItem itemi = new DropdownMenuItem(
          value: i.toString(), child: new Text(i.toString())
      );
      items.add(itemi);
    }
    return items;
  }

展开闭合控件

ExpansionTile
const ExpansionTile({
    Key key,
    this.leading,
    @required this.title,//开关的名称
    this.backgroundColor,//展开背景色
    this.onExpansionChanged,
    this.children = const <Widget>[],
    this.trailing,
    this.initiallyExpanded = false,//默认关闭
  }) : assert(initiallyExpanded != null),
       super(key: key);

输入框

Row(
              mainAxisAlignment: MainAxisAlignment.spaceBetween,
              mainAxisSize: MainAxisSize.min,
              children: <Widget>[
                Container(
                  constraints: BoxConstraints.tightFor( width: 200.0),
                  child:  TextField(
                    autofocus: false,
                    //maxLength: 8,
                    textAlign: TextAlign.right,//右对齐
                    keyboardType: TextInputType.number,//数字键盘
                    onChanged: (v) {
                      setState(() {
                        price = double.parse('$v');
                      });
                      //记录金额
                      print("onChange: $v");
                    },
                    decoration: InputDecoration(
                        border: InputBorder.none,//去掉输入框的下滑线
                        hintText: "0.00",
                        hintStyle: TextStyle( fontSize: 14.0)
                    ),
                  ),
                ),
                Text(' 元  ',style: TextStyle(color: Colors.black),),
              ],
            ),
          ],
        ),

弹出框加叠加(一个红包的样子)

showDialog<Null>(//调用方法
                      context: context, //BuildContext对象
                      barrierDismissible: false,
                      builder: (BuildContext context) {
                        return new LoadingDialog( //调用对话框
                            text: '滚烫',
                            ponto:  "https://ss0.baidu.com/6ONWsjip0QIZ8tyhnq/it/u=3463668003,3398677327&fm=58"
                        );
                      });
//弹出的内容
class LoadingDialog extends Dialog {
  String text;//传递的名字
  String ponto;//头像地址
  LoadingDialog({Key key, @required this.text,this.ponto}) : super(key: key);
  @override
  Widget build(BuildContext context) {
    var stack = new Stack(//创建折叠层
      alignment: const FractionalOffset(0.5, 0.935),//相对坐标
      children: <Widget>[
        //底层
        new Material( //创建透明层
        type: MaterialType.transparency, //透明类型
          child: new Center( //保证控件居中效果
            child: new SizedBox(
              width: 260.0,
              height: 420.0,
              child: new Container(
                decoration: ShapeDecoration(
                  color: Colors.red,
                  shape: RoundedRectangleBorder(
                    borderRadius: BorderRadius.all(
                      Radius.circular(8.0),
                    ),
                  ),
                ),
                child: new Column(
                  mainAxisAlignment: MainAxisAlignment.start,
                  crossAxisAlignment: CrossAxisAlignment.center,
                  children: <Widget>[
                    //new CircularProgressIndicator(),
                    ClipPath(
                      clipper: BottomClipper(),
                      child: Container(
                        height: 360,
                        width: 300,
                        //color:
                        decoration: ShapeDecoration(
                          color: Colors.red[600],
                          shape: RoundedRectangleBorder(
                            borderRadius: BorderRadius.all(
                              Radius.circular(8.0),
                            ),
                          ),
                        ),
                        child: Column(
                          mainAxisAlignment: MainAxisAlignment.center,
                          children: <Widget>[
                            Image.network(
                              ponto,
                              scale: 3.0,
                            ),
                            SizedBox(
                              height: 10,
                            ),
                            Text(text,style: new TextStyle(fontSize: 16.0,color: Colors.orangeAccent)),
                            Text('恭喜发财,大吉大利',style: new TextStyle(fontSize: 24.0,color: Colors.orangeAccent)),
                            SizedBox(
                              height: 100,
                            ),
                          ],
                        ),
                      ),
                    ),
                  ],
                ),
              ),
            ),
          ),
        ),
       //折叠层
        Container(
          height: 200,
          child:Column(
            children: <Widget>[
              Container(
                height: 70,
                width: 70,
                child: FlatButton(
                  onPressed: (){
                    Navigator.push( context,
                        new MaterialPageRoute(builder: (context) {
                          return  Hongbaoxiangqing();
                        })).then((String){//回调函数
                      Navigator.pop(context);
                    });
                  },
                  child: Text('開',style: TextStyle(fontSize: 30),),
                ),
                decoration: BoxDecoration( //背景装饰
                  color: Colors.amber[200],
                  borderRadius: BorderRadius.circular(35),
                ),
              ),
              SizedBox(
                height: 70,
              ),
              FlatButton(
                  onPressed: (){
                    Navigator.pop(context);
                  },
                  child:Icon(
                    Icons.clear,color: Colors.red[800],
                  )
              )
            ],
          ),
        ),
      ],
    );
    return stack;
  }
}
//美化界面
class BottomClipper extends CustomClipper<Path>{//切割类继承
  @override
  Path getClip(Size size) {//必备属性一
    var path = Path();
    path.lineTo(0, 0);
    path.lineTo(0, size.height-60);
    var frit = Offset(size.width/2,size.height);
    var frit2 = Offset(size.width,size.height-60);
    path.quadraticBezierTo(frit.dx, frit.dy, frit2.dx, frit2.dy);//二次贝塞尔曲线
    path.lineTo(size.width, size.height-60);
    path.lineTo(size.width, 0);
    return path;
  }
  @override
  bool shouldReclip(CustomClipper<Path> oldClipper) {//必备属性二
    // TODO: implement shouldReclip
    return false;
  }
}

InkWell

  • inkWell 在listTile里看到的控件,用这个可以自己组合Tile控件,并自带点击 和 长按 两个事件,
  • 同时在用到按钮的时候,我发现自带的按钮都有一定的大小,用InkWell写的按钮可以自定义大小

多文字一行显示不同效果

 RichText(
                      text: TextSpan(
                          children: <TextSpan>[
                            TextSpan(
                              text:'        黑名单功能目标:一是期望能打击具有不良行为的个人和单位的社会声誉,促使其与您',style:TextStyle(fontSize: 15,color: Colors.white),),
                            TextSpan(text:'和解',style:TextStyle(fontSize: 18,color: Colors.blue),),
                            TextSpan(text:';二是为用户提供一个向亲朋好友',style:TextStyle(fontSize: 15,color: Colors.white),),
                            TextSpan(text:'示警',style:TextStyle(fontSize: 18,color: Colors.red),),
                            TextSpan(text:'的平台;三是心中有气,',style:TextStyle(fontSize: 15,color: Colors.white),),
                            TextSpan(text:'不吐不快',style:TextStyle(fontSize: 18,color: Colors.green),),
                            TextSpan(text:'。',style:TextStyle(fontSize: 15,color: Colors.white),),
                          ]
                      ),
                    ),

RichText为必须,TextSpan相当于html里的span,属于行级元素

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Android开发Flutter 桌面应用窗口化实战示例

    目录 前言 一.应用窗口的常规配置 应用窗口化 自定义窗口导航栏 美化应用窗口 二.windows平台特定交互 注册表操作 执行控制台指令 实现应用单例 三.桌面应用的交互习惯 按钮点击态 获取应用启动参数 四.写在最后 前言 通过此篇文章,你可以编写出一个完整桌面应用的窗口框架. 你将了解到: Flutter在开发windows和Android桌面应用初始阶段,应用窗口的常规配置: windows平台特定交互的实现,如:执行控制台指令,windows注册表,应用单例等: 桌面应用的交互习惯,如

  • 使用flutter的showModalBottomSheet遇到的坑及解决

    目录 遇到了三个比较坑的地方 我们解决完后的效果如下 解决问题一 解决问题二 解决问题三 在使用官方的showModalBottomSheet这个组件时到目前为止 遇到了三个比较坑的地方 1. 无法直接设置圆角: 2. 组件最多只能撑满半屏幕,再多就出界了: 3. 在这个组件里面如果有选择按钮等其他一些需要改变状态的组件时,即便使用setState,状态也无法更新. 我们解决完后的效果如下 解决问题一 使用stack包裹住子组件解决圆角的问题,且需要设置背景颜色为Colors.balck54,这

  • Flutter入门学习Dart语言变量及基本使用概念

    目录 正文 变量 变量的声明赋值 变量的划分 默认值 变量的类型推断修饰符 Late变量 类型判断is和类型转换as 一些重要概念 空安全和可空类型? 表达式和语句 注释 DartPad 正文 Dart是Google发布的开源编程语言,是一种面向对象的语言.其主要应用是Flutter框架开发(Android.IOS),此外,也可以用在服务器.脚本.Web开发中.随着Flutter3.0开始支持全平台开发,Dart也可以实现桌面应用. 关于Dart的介绍不再细说.下面开始Dart的使用介绍 首先记

  • flutter中使用流式布局示例详解

    目录 简介 Flow和FlowDelegate Flow的应用 总结 简介 我们在开发web应用的时候,有时候为了适应浏览器大小的调整,需要动态对页面的组件进行位置的调整.这时候就会用到flow layout,也就是流式布局. 同样的,在flutter中也有流式布局,这个流式布局的名字叫做Flow.事实上,在flutter中,Flow通常是和FlowDelegate一起使用的,FlowDelegate用来设置Flow子组件的大小和位置,通过使用FlowDelegate.paintChildre可

  • Flutter异步操作实现流程详解

    目录 一.FutureBuilder 二.StreamBuilder 在Flutter中,借助 FutureBuilder 组件和 StreamBuilder 组件,可以非常方便地完成异步操作. 一.FutureBuilder 在讲解FutureBuilder之前,你首先要知道Future是什么,了解了这个,后面再了解该组件就轻松许多. 在不同的编程语言中会有不同的名词来定义,在Dart语言中 选择使用Future类型配合async.await关键字来实现异步支持. Future 表示一个现在不

  • Flutter有无状态类与State及生命周期详细介绍

    目录 无状态类 有状态类 状态 State生命周期 Flutter中的生命周期类似于Vue.React中的生命周期一样,有初始化.状态更新.停用.销毁等. 在React中,组件分为函数式组件和类式组件,它们的区别就是一个无状态.一个有状态.那么在Flutter中亦是如此,它有两种类,一种是无状态类,一种是有状态类.其生命周期的使用就是有状态类的特定用法. 无状态类 无状态类内部有build方法,在表面上看 每次数据更新都会执行build方法.但实际上,在组件树中,当每次数据发生变更时,无状态类都

  • flutter showModalBottomSheet常用属性及说明

    目录 showModalBottomSheet常用属性 showModalBottomSheet flutter常见控件及例子 贝塞尔曲线 底部弹窗 下拉框 展开闭合控件 输入框 弹出框加叠加(一个红包的样子) showModalBottomSheet常用属性 在使用showModalBottomSheet这个控件时,想要设置圆角,在内容widget设置不管用,然后直接看这个控件的实现原理,一看有个shape属性,感觉有戏!果然设置完毕后,成功了. 注意:一定不要设置builder中的背景颜色,

  • 详解flutter中常用的container layout实例

    目录 简介 Container的使用 旋转Container Container中的BoxConstraints 总结 简介 在上一篇文章中,我们列举了flutter中的所有layout类,并且详细介绍了两个非常常用的layout:Row和Column. 掌握了上面两个基本的layout还是不够的,如果需要应付日常的layout使用,我们还需要掌握多一些layout组件.今天我们会介绍一个功能强大的layout:Container layout. Container的使用 Container是一

  • ASP.NET单选按钮控件RadioButton常用属性和方法介绍

    1.常用属性: (1)Checked属性:用来设置或返回单选按钮是否被选中,选中时值为true,没有选中时值为false. (2)AutoCheck 属性:如果 AutoCheck 属性被设置为 true(默认),那么当选择该单选按钮时,将自动清除该组中所有其他单选按钮.对一般用户来说,不需改变该属性,采用默认值(true)即可. (3)Appearance 属性:用来获取或设置单选按钮控件的外观.当其取值为 Appearance.Button 时,将使单选按钮的外观像命令按钮一样:当选定它时,

  • js基础之DOM中document对象的常用属性方法详解

    -----引入 每个载入浏览器的 HTML 文档都会成为 Document 对象. Document 对象使我们可以从脚本中对 HTML 页面中的所有元素进行访问. 属性 1  document.anchors  返回对文档中所有 Anchor 对象的引用.还有document.links/document.forms/document.images等 2  document.URL       返回当前文档的url 3  document.title       返回当前文档的标题 4  do

  • Android控件之EditView常用属性及应用方法

    EditView类继承自TextView类,EditView与TextView最大的不同就是用户可以对EditView控件进行编辑,同时还可以为EditView控件设置监听器,用来判断用户的输入是否合法. 以下为EditView常用属性及对应方法说明

  • Android EditText常用属性功能汇总

    本文总结分析了Android EditText常用属性.分享给大家供大家参考,具体如下: android:hint="请输入数字!"//设置显示在空间上的提示信息 android:numeric="integer"//设置只能输入整数,如果是小数则是:decimal android:singleLine="true"//设置单行输入,一旦设置为true,则文字不会自动换行. android:password="true"//设

  • 关于ajax对象一些常用属性、事件和方法大小写比较常见的问题总结

    最近比较空闲,于是抽个时间整理些关于ajax方法的东东.在项目中经常发现ajax板块好多问题都是属性,方法,事件大小写不区分问题,最终导致了程序运行出现麻烦. 下面是ajax对象的一些常用属性,事件和方法 1)标准的ajax对象的属性有readyState,status,responseText,responseXML 2)非标准ajax对象属性,针对IE浏览器的,有responseBody,2进制数据流.如果不考虑浏览器兼容,这个属性+VBScript能很好的解决乱码问题. Visual Ba

  • 浅析Android TextView常用属性

    [说明] TextView是用来显示文本的组件.以下介绍的是XML代码中的属性,在java代码中同样可通过 "组件名.setXXX()方法设置.如,tv.setTextColor(); [属性一] android:textColor="#000" 表示文字的颜色. [提示]颜色可以随便写一个"#000"形式的属性值,再通过点击左边显示行号旁边的颜色显示方块,弹出来颜色选择器对颜色进行选择.当设置的颜色为系统提供的Color资源内的颜色时,如"@c

  • C#Button窗体常用属性及事件详解

    1.常用属性 Name:名称: BackColor:设置控件背景颜色: Enabled:是否可用: FlayStyle:控件样式: Image:设置控件图像: ImageAlign:图像对齐方式: ImageList:图像ImageList索引值: Location:坐标: Size:大小: Tabindex:控件顺序索引: Text:文本: TextAlign:文本对齐方式: Visible:控件是否可见: 2.控件事件: Click:单击事件: 知识点扩充: 在真实的C#开发场景中,我们对于

  • C# 列表List的常用属性和方法介绍

    1.创建列表 (列表可以存储任何类型的数据,在创建列表对象的时候首先要指定你要创建的这个列表要存储什么类型的)(泛型) //创建列表 //方法一 List<int> intList = new List<int>();//创建了一个空的列表 通过类型后面的<>来表示这个列表存储的数据的类型 //方法二 var intlist1 = new List<string>(); //方法三 var intlist2 = new List<int>(){1

随机推荐