Flutter:showModalBottomSheet底部弹出完整页面

dart 复制代码
  // 弹出:商品详情信息页面
  void showInfoBottomSheet(int shopId, int goodsId) {
    showModalBottomSheet(
      context: Get.context!,
      isScrollControlled: true,
      backgroundColor: Colors.transparent,
      isDismissible: true,
      enableDrag: true,
      builder: (context) {
        return Container(
          height: MediaQuery.of(context).size.height * 0.8,
          decoration: BoxDecoration(
            color: AppTheme.pageBgColor,
            borderRadius: BorderRadius.only(
              topLeft: Radius.circular(40.w),
              topRight: Radius.circular(40.w),
            ),
          ),
          clipBehavior: Clip.antiAlias,
          child: InfoPage(
            arguments: {
              'shopId': shopId,
              'goodsId': goodsId,
              'customCallback': () {
                // 关闭弹窗
                Get.back();
                // 执行确认后的业务逻辑
                print('用户确认了商品ID: $goodsId');
                showCreateOrderBottomSheet(shopId, goodsId);
              },
            },
          ),
        );
      },
    );
  }

info页面需要接收参数和回调

dart 复制代码
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:get/get.dart';

class InfoController extends GetxController {
  final Map<String, dynamic> arguments;
  InfoController({required this.arguments});
  // ID
  int shopId = 0;
  int goodsId = 0;
  // 自定义回调函数
  VoidCallback? customCallback;

  void _initData() async {
    shopId = arguments['shopId'] ?? 0;
    goodsId = arguments['goodsId'] ?? 0;
    customCallback = arguments['customCallback'];
    update(["info"]);
  }

  // 确认操作
  void onConfirm() {
    customCallback?.call();
  }

}
dart 复制代码
import 'package:ayidaojia/common/index.dart';
import 'package:ducafe_ui_core/ducafe_ui_core.dart';
import 'package:flutter/material.dart';
import 'package:flutter_widget_from_html_core/flutter_widget_from_html_core.dart';
import 'package:get/get.dart';

import 'index.dart';

class InfoPage extends GetView<InfoController> {
  const InfoPage({super.key, required this.arguments});
  final Map<String, dynamic> arguments;

  // 主视图
  Widget _buildView() {
    return <Widget>[
    ].toColumn();
  }
  // 底部按钮
  Widget _buildBottomBar() {
    var bottomStatusBarHeight = MediaQuery.of(Get.context!).padding.bottom;
    return <Widget>[
      ButtonWidget(
        text: '立即抢购',
        width: 750,
        height: 98,
        borderRadius: 0,
        onTap: () => controller.onConfirm(),
      ),
    ]
    .toRow(mainAxisAlignment: MainAxisAlignment.center)
    .paddingOnly(bottom: bottomStatusBarHeight);
  }

  @override
  Widget build(BuildContext context) {
    return GetBuilder<InfoController>(
      init: InfoController(arguments: arguments),
      id: "info",
      builder: (_) {
        return <Widget>[
          // 主体内容 内部可滚动
          Expanded(
            child: SingleChildScrollView(
              child: _buildView(),
            ),
          ),
          // 固定在底部按钮的按钮
          _buildBottomBar(),
        ].toColumn();
      },
    );
  }
}
相关推荐
飞浪纪元[FWC–FE]4 分钟前
从零到一键绿:Qt 5.14.2 + VS2019 开发环境搭建、Kit 套件配置与构建错误修复完全手册
开发语言·qt
Wang's Blog15 分钟前
Java 项目实战:交友项目 - 联系人列表
java·开发语言·交友
我命由我1234519 分钟前
访客系统形式(有用户概念、无用户概念)
java·开发语言·前端·javascript·python·产品运营·产品经理
架构师伯子明21 分钟前
FFmpeg C++学习(一):编译和demo
开发语言·c++·学习
海域云SeaArea_24 分钟前
Windows Server 2008 R2 从零安装 IIS7.5(二):php.ini 配置
开发语言·windows·php
叼烟扛炮33 分钟前
[LangChain] 学习笔记(02):LCEL 链式调用与动态模型配置实战
服务器·开发语言·网络·笔记·学习·langchain
xixingzhe235 分钟前
图表中同比与环比的区别:看趋势还是看变化?
开发语言·python
andyweike43 分钟前
Swift
开发语言·ios·swift
纪念 2291 小时前
C++算法(六)
开发语言·c++·算法
程序员大阳1 小时前
副队长JavaScript教程(65)-详解JSON:轻量级数据交换格式
javascript·json·序列化·反序列化·stringify·parse