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();
      },
    );
  }
}
相关推荐
言乐67 小时前
Python游戏水平测试辅助系统
开发语言·python·游戏·django·pygame
我命由我1234513 小时前
CesiumJS 笔记 - 获取容器中心点、Cartesian3 clone 方法、修改 Cartesian3 对象的高度
前端·javascript·css·前端框架·html·html5·js
抱抱宝14 小时前
Agent-study项目教程(03):手写 Mini-ReAct Agent(不依赖框架)
javascript·人工智能·gpt·react.js·prompt·agent
用户9385156350714 小时前
Next.js 笔记系统(二):Redis 数据服务与侧边栏组件拆分实战
javascript·全栈
WWJA王文举14 小时前
I²C通信完整流程详解:START、地址、ACK、数据、Repeated START和STOP一次讲透
c语言·开发语言
zhanghaha131415 小时前
Python进阶教程:6_JSON 数据解析 —— 新手完全指南
开发语言·python·json
qq_4480111616 小时前
C语言中的动态内存分配
c语言·开发语言·php
汉字萌萌哒17 小时前
2024CSP-J入门级C++真题详解
开发语言·c++
arbboter17 小时前
【网络工具】NetProxy网络代理用户手册
开发语言·网络·c#·网络代理·网络异常·代理工具
Heo18 小时前
大厂前端调试不能只会debugger
前端·javascript·面试