Flutter顶部模态弹窗插件top_modal_sheet的使用

发布于 1周前 作者 vueper 来自 Flutter

Flutter顶部模态弹窗插件top_modal_sheet的使用

top_modal_sheet

简单的从屏幕顶部出现的模态弹窗。

安装

在你的pubspec.yaml文件中添加依赖:

dependencies:
  top_modal_sheet: ^2.1.0

然后导入它:

import 'package:top_modal_sheet/top_modal_sheet.dart';

使用方法

只需调用showTopModalSheet来显示模态弹窗。

MaterialButton(
  color: Colors.white,
  elevation: 5,
  child: const Text("Show TopModal 1"),
  onPressed: () async {
    var value = await showTopModalSheet<String?>(context, DummyModal());
    setState(() { _topModalData = value; });
  },
)

对于更详细的例子,请参阅example文件夹。

示例代码

以下是一个完整的示例demo,演示了如何使用top_modal_sheet插件创建一个顶部模态弹窗。此示例包括主应用程序设置、按钮触发模态弹窗和模态弹窗内容。

import 'dart:io';

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:top_modal_sheet/top_modal_sheet.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle(
      statusBarColor: Colors.transparent,
      statusBarIconBrightness: Brightness.dark,
      statusBarBrightness:
          Platform.isAndroid ? Brightness.dark : Brightness.light,
      systemNavigationBarColor: Colors.teal,
      systemNavigationBarDividerColor: Colors.grey,
      systemNavigationBarIconBrightness: Brightness.dark,
    ));

    return MaterialApp(
      title: 'Demo',
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        primarySwatch: Colors.teal,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: const MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key}) : super(key: key);

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  String _topModalData = "";

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        centerTitle: true,
        title: const Text("TopModalSheet sample"),
      ),
      body: Center(
        child: Text(
          _topModalData,
          style: Theme.of(context).textTheme.headlineLarge,
        ),
      ),
      floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat,
      floatingActionButton: FloatingActionButton.extended(
        elevation: 5,
        label: const Text("Show TopModal 1"),
        onPressed: _showTopModal,
      ),
    );
  }

  Future<void> _showTopModal() async {
    final value = await showTopModalSheet<String?>(
      context,
      const DummyModal(),
      backgroundColor: Colors.white,
      borderRadius: const BorderRadius.vertical(
        bottom: Radius.circular(20),
      ),
    );

    if (value != null) setState(() => _topModalData = value);
  }
}

class DummyModal extends StatelessWidget {
  const DummyModal({Key? key}) : super(key: key);

  static const _values = ["CF Cruz Azul", "Monarcas FC"];

  @override
  Widget build(BuildContext context) {
    return SafeArea(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.spaceEvenly,
        crossAxisAlignment: CrossAxisAlignment.stretch,
        children: <Widget>[
          const Text(
            "Choose Wisely",
            style: TextStyle(color: Colors.teal, fontSize: 20),
            textAlign: TextAlign.center,
          ),
          Row(
            mainAxisAlignment: MainAxisAlignment.spaceEvenly,
            children: _values
                .map(
                  (value) => Expanded(
                    child: Padding(
                      padding: const EdgeInsets.only(left: 10, right: 5),
                      child: OutlinedButton(
                        child: Column(
                          children: [
                            FlutterLogo(
                              size: MediaQuery.of(context).size.height * .15,
                            ),
                            Padding(
                              padding: const EdgeInsets.symmetric(vertical: 2),
                              child: Text(value),
                            )
                          ],
                        ),
                        onPressed: () => Navigator.pop(context, value),
                      ),
                    ),
                  ),
                )
                .toList(),
          ),
          const SizedBox(height: 16),
        ],
      ),
    );
  }
}

屏幕截图

以下是使用top_modal_sheet插件创建的顶部模态弹窗的效果图。

main_screen top_modal top_modal_result

如果有什么遗漏或问题,欢迎随时提issue或者贡献代码!


更多关于Flutter顶部模态弹窗插件top_modal_sheet的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter顶部模态弹窗插件top_modal_sheet的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter中使用top_modal_sheet插件来实现顶部模态弹窗的示例代码。首先,你需要确保你的项目中已经包含了top_modal_sheet插件。如果还没有添加,你可以在你的pubspec.yaml文件中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  top_modal_sheet: ^x.y.z  # 请替换为最新版本号

然后运行flutter pub get来安装依赖。

接下来是一个简单的使用示例:

  1. 导入必要的包

在你的Dart文件中(比如main.dart),导入top_modal_sheet包:

import 'package:flutter/material.dart';
import 'package:top_modal_sheet/top_modal_sheet.dart';
  1. 创建一个简单的Flutter应用

下面是一个完整的示例,展示了如何使用TopModalSheet来显示一个顶部模态弹窗:

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Top Modal Sheet Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () {
              showTopModalSheet(
                context: context,
                builder: (context) {
                  return Container(
                    decoration: BoxDecoration(
                      color: Colors.white,
                      borderRadius: BorderRadius.circular(16.0),
                    ),
                    padding: EdgeInsets.all(16.0),
                    child: Column(
                      mainAxisSize: MainAxisSize.min,
                      children: [
                        Text('This is a top modal sheet!'),
                        SizedBox(height: 16.0),
                        ElevatedButton(
                          onPressed: () {
                            Navigator.of(context).pop();
                          },
                          child: Text('Close'),
                        ),
                      ],
                    ),
                  );
                },
              );
            },
            child: Text('Show Top Modal Sheet'),
          ),
        ),
      ),
    );
  }
}

// 自定义showTopModalSheet函数,因为top_modal_sheet库可能不提供直接的show函数
Future<void> showTopModalSheet<T>({
  required BuildContext context,
  required WidgetBuilder builder,
}) async {
  showModalBottomSheet<T>(
    context: context,
    isScrollControlled: true,
    enableDrag: false,
    shape: RoundedRectangleBorder(
      borderRadius: BorderRadius.vertical(top: Radius.circular(16.0))
    ),
    backgroundColor: Colors.transparent,
    builder: (context) {
      return DraggableScrollableSheet(
        expand: false,
        initialChildSize: 0.5,
        minChildSize: 0.2,
        maxChildSize: 0.8,
        builder: (context, scrollController) {
          return Container(
            decoration: BoxDecoration(
              color: Colors.transparent,
            ),
            child: Column(
              children: [
                Expanded(
                  child: Container(
                    decoration: BoxDecoration(
                      color: Colors.white,
                      borderRadius: BorderRadius.only(
                        topLeft: Radius.circular(16.0),
                        topRight: Radius.circular(16.0),
                      ),
                    ),
                    child: builder(context),
                  ),
                ),
                // 添加一个透明的占位符,使DraggableScrollableSheet能够正确显示
                Container(height: MediaQuery.of(context).viewInsets.bottom),
              ],
            ),
          );
        },
      );
    },
  );
}

注意top_modal_sheet库可能不提供直接的showTopModalSheet函数,上面的代码通过showModalBottomSheetDraggableScrollableSheet的组合实现了一个类似顶部模态弹窗的效果。如果你使用的top_modal_sheet库提供了直接的方法,请按照该库的文档进行使用。

这个示例代码展示了如何创建一个按钮,点击按钮后显示一个顶部模态弹窗,并在弹窗中显示一些文本和一个关闭按钮。你可以根据自己的需求修改弹窗的内容和样式。

回到顶部