Flutter模态框管理插件modals的使用

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

Flutter模态框管理插件modals的使用

Flutter中的modals插件简化了Overlay(覆盖层)的操作。无论是显示上下文菜单还是其他类型的弹出框,这个插件都能轻松应对。本文将介绍如何使用modals插件来展示、定位和移除模态框。

功能特性

  • 简单地显示模态框
    • 使用绝对位置定位模态框
    • 使用对齐方式定位模态框
    • 基于另一个小部件的位置定位模态框
  • 设置模态框的优先级
  • 方便地移除模态框
    • 通过ID移除模态框
    • 一次性移除所有模态框
    • 点击遮罩层时移除模态框
    • 在路由变化时移除模态框

如何使用

显示模态框

使用showModal函数可以显示模态框,该函数接受一个ModalEntry作为参数。ModalEntry有三种类型:positioned, aligned, 和 anchored

Positioned(绝对定位)

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Center(
      child: ElevatedButton(
        onPressed: () {
          showModal(ModalEntry.positioned(context,
              tag: 'containerModal',
              left: 200,
              top: 200,
              child: Container(
                color: Colors.red,
                width: 50,
                height: 50,
              )));
        },
        child: const Text('Show Modal'),
      ),
    );
  }
}

此示例将你的widget定位在屏幕左上角偏移200, 200的位置。

Aligned(对齐定位)

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Center(
      child: ElevatedButton(
        onPressed: () {
          showModal(ModalEntry.aligned(context,
              tag: 'containerModal',
              alignment: Alignment.center,
              child: Container(
                color: Colors.red,
                width: 50,
                height: 50,
              )));
        },
        child: const Text('Show Modal'),
      ),
    );
  }
}

此示例将你的widget居中显示在屏幕上。

Anchored(锚点定位)

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Center(
      child: Column(
        children: [
          const ModalAnchor(
              tag: 'anchor',
              child: Card(
                color: Colors.grey,
                child: Padding(
                  padding: EdgeInsets.all(8.0),
                  child: Icon(Icons.anchor),
                ),
              )),
          Column(
            mainAxisSize: MainAxisSize.min,
            children: [
              ElevatedButton(
                onPressed: () {
                  showModal(ModalEntry.anchored(context,
                      tag: 'anchoredModal',
                      anchorTag: 'anchor',
                      modalAlignment: Alignment.centerLeft,
                      anchorAlignment: Alignment.centerRight,
                      child: Container(
                        color: Colors.red,
                        width: 50,
                        height: 50,
                      )));
                },
                child: const Text('Show Modal'),
              ),
            ],
          ),
        ],
      ),
    );
  }
}

此示例展示了如何将widget放置在ModalAnchor widget旁边。要使某个小部件成为锚点,请用ModalAnchor包裹它。

模态框优先级

为了设置模态框的优先级,可以使用aboveTagbelowTag参数。

  • aboveTag: 将模态框放在指定标签之上。
  • belowTag: 将模态框放在指定标签之下。

移除模态框

你可以通过以下四种方式移除模态框:

  • removeModal(String id):根据给定的ID移除模态框。
  • removeAllModals():移除所有模态框。
  • 配置ModalEntry中的参数:
    • barrierDismissible: 当设置为true(默认是false),点击遮罩层时会移除模态框。
    • barrierColor: 改变遮罩层的颜色(默认是Colors.transparent)。
    • removeOnPop: 当存在模态框的路由被弹出时移除模态框。
    • removeOnPushNext: 当新的路由被推送到当前路由之上时移除模态框。

要在路由变化时观察并移除模态框,请在根Widget中添加导航器观察者:

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'AppModals',
      navigatorObservers: [modalsRouteObserver],
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const _Home(),
    );
  }
}

更多关于Flutter模态框管理插件modals的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter模态框管理插件modals的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中,管理模态框(Modals)通常涉及到显示对话框、底部表单(Bottom Sheets)等临时UI元素。虽然Flutter本身提供了一些内置的模态框功能(如showDialogshowBottomSheet),但使用第三方插件如flutter_modals可以简化这些操作并提供更多功能。不过,值得注意的是,flutter_modals这个具体的包在Flutter社区中可能不是非常知名或广泛使用,因此我将基于Flutter内置的模态框管理功能来提供一个示例代码案例。

下面是一个使用Flutter内置功能管理模态框的简单示例,包括对话框和底部表单:

1. 添加依赖

首先,确保你的pubspec.yaml文件中没有需要特别添加的依赖项,因为我们将使用Flutter SDK自带的功能。

2. 创建主应用文件

创建一个新的Flutter项目或在现有项目中修改main.dart文件:

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Modal Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  void _showDialog() {
    showDialog(
      context: context,
      builder: (BuildContext context) {
        return AlertDialog(
          title: Text('提示'),
          content: Text('这是一个对话框!'),
          actions: <Widget>[
            TextButton(
              onPressed: () {
                Navigator.of(context).pop();
              },
              child: Text('确定'),
            ),
          ],
        );
      },
    );
  }

  void _showBottomSheet() {
    showModalBottomSheet(
      context: context,
      builder: (BuildContext context) {
        return Container(
          padding: EdgeInsets.all(16.0),
          child: Column(
            mainAxisSize: MainAxisSize.min,
            children: <Widget>[
              Text('这是一个底部表单!'),
              SizedBox(height: 16.0),
              ElevatedButton(
                onPressed: () {
                  Navigator.of(context).pop();
                },
                child: Text('关闭'),
              ),
            ],
          ),
        );
      },
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('模态框管理示例'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: _showDialog,
              child: Text('显示对话框'),
            ),
            SizedBox(height: 20.0),
            ElevatedButton(
              onPressed: _showBottomSheet,
              child: Text('显示底部表单'),
            ),
          ],
        ),
      ),
    );
  }
}

3. 运行应用

将上述代码保存为main.dart文件,然后运行你的Flutter应用。你将看到一个包含两个按钮的页面,一个用于显示对话框,另一个用于显示底部表单。

解释

  • showDialog函数用于显示一个对话框。我们创建了一个AlertDialog,它包含标题、内容和操作按钮。
  • showModalBottomSheet函数用于显示一个底部表单。我们创建了一个包含文本和一个关闭按钮的Container

虽然这个示例没有使用特定的flutter_modals插件,但它展示了如何在Flutter中有效地管理模态框。如果你确实需要使用第三方插件来简化模态框管理,请确保查阅该插件的官方文档以获取详细的用法和示例。

回到顶部