Flutter - 底部弹窗 showModalBottomSheet自定义bottom弹框


在这里插入图片描述

bottom弹框-代码撂这儿了

import 'package:flutter/material.dart';

class AlertGridItem extends Object {

  final String title;
  final int codePoint;  // 图标使用的iconfont昂

  AlertGridItem(this.title, this.codePoint);

}

// Utils 是临时创建的 (小朋友们自行归位nao~)
class Utils {

  // 获取屏幕宽度 (狗子(我本人) 放到了common.dart里)
  static double kScreenWidth(BuildContext context) => MediaQuery.of(context).size.width;
  // 项目中通用背景色 (有条件的可以单独放在color_marco.dart 文件自己建哈)
  static final backDarkGrayColor = Color.fromRGBO(240, 240, 240, 1.0);
  // 文字通用样式 方便统一改字体
  static TextStyle getCustomTextStyle() {
    return TextStyle(
        color: Colors.black,
        fontSize: 17
    );
  }

}

class PracticeBottomSheet extends StatefulWidget {
  @override
  _PracticeBottomSheetState createState() => _PracticeBottomSheetState();
}

class _PracticeBottomSheetState extends State<PracticeBottomSheet> {

  // 点击事件
  void tapAction(actionName) {

    if (actionName == 'show') {

      showModalBottomSheet(
          context: context,
          isScrollControlled: true,
          backgroundColor: Colors.transparent,
          builder: (BuildContext context) {

            // 屏幕宽
            final screenW = Utils.kScreenWidth(context);
            // 列表item宽高
            double itemW = 60;
            double itemH = 86;
            // 几列
            int rowCount = 3;
            // 列表 列间距
            double collectionLeftPadding = 40;
            double itemSpace = (screenW-itemW*rowCount-collectionLeftPadding*2)/2;
            // 列表数据
            final moreSourceArray = [AlertGridItem('微信', 0xe665),AlertGridItem('朋友圈', 0xe667),AlertGridItem('批量下载', 0xe60e),AlertGridItem('转载', 0xe889),AlertGridItem('海报', 0xe674),AlertGridItem('举报', 0xe6ed)];
            // 几行
            double itemColumnCount = moreSourceArray.length / 3 + ((moreSourceArray.length % 3) == 0 ? 0.0 : 1.0).toDouble();
            // collection的高度
            final collectionViewHeight = itemColumnCount * itemH + 20 * (itemColumnCount-1);

            // print('column个数${itemColumnCount}');
            return StatefulBuilder(
                builder: (stateContext, state) {
                  return GestureDetector(
                    child: ClipRRect(
                      borderRadius: BorderRadius.vertical(top: Radius.circular(8)),
                      child: Container(
                        height: collectionViewHeight + 30 + 20 + 55,
                        color: Utils.backDarkGrayColor,
                        child: Column(
                          children: <Widget>[
                            SizedBox(height: 30),

                            // 功能列表
                            Container(
                              padding: EdgeInsets.only(left: collectionLeftPadding,right: collectionLeftPadding),
                              height: collectionViewHeight,
                              child: GridView.builder(
                                physics: NeverScrollableScrollPhysics(),
                                gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
                                    crossAxisCount: rowCount,
                                    mainAxisSpacing: 20,
                                    crossAxisSpacing: itemSpace,
                                    childAspectRatio: itemW/itemH
                                ),
                                itemBuilder: (BuildContext gridContext, int index) {
                                  return Container(
                                    height: itemH,
                                    width: itemW,
                                    child: GestureDetector(
                                      child: Column(
                                        mainAxisAlignment: MainAxisAlignment.spaceAround,
                                        children: <Widget>[
                                          ClipRRect(
                                            borderRadius: BorderRadius.all(Radius.circular(4)),
                                            child: Container(
                                              width: 50,
                                              height: 50,
                                              color: Colors.white,
                                              child: Icon(IconData(moreSourceArray[index].codePoint,fontFamily: 'iconfont'),size: 30,),
                                            ),
                                          ),
                                          Text(moreSourceArray[index].title,style: TextStyle(fontSize: 12),)
                                        ],
                                      ),
                                      onTap: () {
                                        Navigator.pop(context);
                                        tapAction(moreSourceArray[index].title);
                                      },
                                    ),
                                  );
                                },
                                itemCount: moreSourceArray.length,
                              ),
                            ),

                            SizedBox(height: 20),

                            // 取消
                            GestureDetector(
                              child: Container(
                                alignment: Alignment.center,
                                height: 55,
                                color: Colors.white,
                                child: Text('取消',style: Utils.getCustomTextStyle(),),
                              ),
                              onTap: () {
                                Navigator.pop(context);
                              },
                            )
                          ],
                        ),
                      ),
                    ),
                    // 关键代码
                    onVerticalDragUpdate: (e) => false,
                  );
                });
          });

    }

  }

  @override
  Widget build(BuildContext context) {
    return Container(
      child: RaisedButton(
        child: Text('点我'),
        onPressed: () {
          tapAction('show');
        },
      ),
    );
  }
}

Iconfont使用

1、下载ttf文件

阿里巴巴矢量图库 -> 当前项目 -> 下载至本地
类似贼个样子:
在这里插入图片描述
姐妹们别害臊点它、点它、点它。

2、在pubspec.yaml中添加fonts配置

在这里插入图片描述

3、使用

上边代码找找看啦!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值