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();
      },
    );
  }
}
相关推荐
REDcker5 分钟前
C++ 崩溃堆栈捕获库详解
linux·开发语言·c++·tcp/ip·架构·崩溃·堆栈
帅帅在睡觉10 分钟前
组件的创建与挂载
javascript·vue.js·elementui
2501_9466756414 分钟前
Flutter与OpenHarmony打卡图标选择器组件
flutter
qq_4061761416 分钟前
JavaScript闭包:从底层原理到实战
开发语言·前端·javascript
沐知全栈开发16 分钟前
`.toggleClass()` 方法详解
开发语言
冰暮流星16 分钟前
javascript之Math对象——绝对值,开次方,四舍五入
前端·javascript
啊啊啊啊懒19 分钟前
vite创建完项目之后vue文件中有标签报错
前端·javascript·vue.js
Rysxt_19 分钟前
鸿蒙开发语言ArkTS全面介绍
开发语言·华为·harmonyos
三天不学习21 分钟前
【入门教学】Python包管理与pip常用包
开发语言·python·pip
沐知全栈开发32 分钟前
桥接模式(Bridge Pattern)
开发语言