Flutter弹窗管理插件on_popup_window_widget的使用

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

Flutter弹窗管理插件on_popup_window_widget的使用

OnPopupWindowWidget是一个强大的Flutter弹窗插件,能够满足你在对话框中的各种需求。以下是关于如何使用该插件的详细指南和示例代码。

特性

  • 支持Material 3设计规范
  • 响应式布局
  • 使用简便,无需额外支持

开始使用

安装步骤

  1. 在你的pubspec.yaml文件中添加on_popup_window_widget依赖:
    dependencies:
      flutter:
        sdk: flutter
      on_popup_window_widget: ^latest_version
    
  2. 运行flutter pub get来安装依赖。

示例代码

基本用法

import 'package:flutter/material.dart';
import 'package:on_popup_window_widget/on_popup_window_widget.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('On Popup Window Widget Example')),
        body: Center(
          child: ElevatedButton(
            onPressed: () {
              showDialog(
                context: context,
                builder: (context) => OnPopupWindowWidget(
                  title: const Text("This is the title"),
                  footer: const Text("This is the footer"),
                  child: const Text("This is the child"),
                ),
              );
            },
            child: Text('Show Dialog'),
          ),
        ),
      ),
    );
  }
}

添加关闭按钮

showDialog(
  context: context,
  builder: (context) => OnPopupWindowWidget(
    title: const Text("This is the title"),
    footer: const Text("This is the footer"),
    child: const Text("This is the child"),
    overlapChildren: const [
      Positioned(
        right: -10,
        top: -10,
        child: Container(
          width: 50,
          height: 50,
          color: Colors.blue,
          child: Icon(Icons.cancel, color: Colors.white),
        ),
      ),
    ],
  ),
);

使用Widget模式

OnPopupWindowWidget.widgetMode(
  title: const Text("This is the title"),
  footer: const Text("This is the footer"),
  child: const Text("This is the child"),
)

完整示例Demo

以下是一个更完整的示例,展示了如何在应用中使用OnPopupWindowWidget的各种功能:

import 'package:flutter/material.dart';
import 'package:on_popup_window_widget/on_popup_window_widget.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      theme: ThemeData(useMaterial3: true),
      home: Scaffold(
        appBar: AppBar(title: Text('On Popup Window Widget Demo')),
        body: MainWidget(),
      ),
    );
  }
}

class MainWidget extends StatelessWidget {
  final List<String> languages = [
    "Bangle", "English", "Spanish", "French", "German",
    "Chinese", "Hindi", "Arabic", "Russian", "Portuguese",
    "Japanese", "Italian"
  ];

  List<Widget> generateLanguageButtons(BuildContext context) {
    return languages.map((lang) => Padding(
      padding: const EdgeInsets.symmetric(vertical: 4),
      child: ElevatedButton(
        onPressed: () {},
        child: Text(lang),
      ),
    )).toList();
  }

  Future<void> showCustomDialog(BuildContext context, int indent) async {
    await showDialog(
      context: context,
      builder: (context) => OnPopupWindowWidget(
        biggerMaxSize: 1000,
        indent: indent,
        title: const Text("Please select your Language"),
        footer: Container(
          color: Colors.red,
          child: Column(
            children: [
              ElevatedButton(
                onPressed: () async {
                  await showCustomDialog(context, indent + 1);
                },
                child: const Text("Okay Okay Okay"),
              ),
              TextFormField(),
            ],
          ),
        ),
        overlapChildren: [
          Positioned(
            right: -10,
            top: -10,
            child: IconButton(
              icon: Icon(Icons.cancel, color: Colors.white),
              onPressed: () {
                if (kDebugMode) print("Tap Tap");
              },
            ),
          ),
        ],
        child: Container(
          child: Column(children: generateLanguageButtons(context)),
        ),
      ),
    );
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return SingleChildScrollView(
      child: Column(
        mainAxisSize: MainAxisSize.min,
        children: [
          ElevatedButton(
            onPressed: () => showDialog(
              context: context,
              builder: (context) => OnPopupWindowWidget(
                biggerMaxSize: 1000,
                title: const Text("Please select your Language"),
                footer: const ElevatedButton(
                  onPressed: null,
                  child: Text("Okay"),
                ),
                child: Column(
                  children: [
                    Container(height: 100, color: Colors.amber),
                    TextFormField(),
                  ],
                ),
              ),
            ),
            child: const Text("Press here"),
          ),
          ElevatedButton(
            onPressed: () async {
              await showCustomDialog(context, 1);
            },
            child: const Text("Overlay Widget"),
          ),
          Center(
            child: OnPopupWindowWidget.widgetMode(
              title: const Text("Please select your Language"),
              footer: const ElevatedButton(
                onPressed: null,
                child: Text("Okay"),
              ),
              overlapChildren: [
                Positioned(
                  right: -10,
                  top: -10,
                  child: IconButton(
                    icon: Icon(Icons.cancel, color: Colors.white),
                    onPressed: () => print("________________________________________"),
                  ),
                ),
              ],
              child: Column(children: generateLanguageButtons(context)),
            ),
          ),
        ],
      ),
    );
  }
}

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

1 回复

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


当然,下面是一个关于如何在Flutter项目中使用on_popup_window_widget插件进行弹窗管理的示例代码。请注意,on_popup_window_widget并不是一个官方或广泛认可的Flutter插件,因此我假设你指的是一个自定义的或第三方插件,其功能是管理弹窗。以下代码是一个模拟实现,假设该插件提供了类似的API。

首先,你需要在pubspec.yaml文件中添加依赖(假设插件名为on_popup_window_widget,实际上你需要替换为实际的插件名):

dependencies:
  flutter:
    sdk: flutter
  on_popup_window_widget: ^x.y.z  # 替换为实际的版本号

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

接下来,在你的Flutter项目中,你可以按照以下方式使用弹窗管理插件:

import 'package:flutter/material.dart';
import 'package:on_popup_window_widget/on_popup_window_widget.dart';  // 假设的导入路径

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

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

class HomeScreen extends StatefulWidget {
  @override
  _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  final PopupWindowController _popupWindowController = PopupWindowController();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Popup Window Demo'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            _showPopupWindow(context);
          },
          child: Text('Show Popup'),
        ),
      ),
    );
  }

  void _showPopupWindow(BuildContext context) {
    _popupWindowController.show(
      context: context,
      builder: (BuildContext context) {
        return Material(
          elevation: 8.0,
          child: Container(
            padding: EdgeInsets.all(16.0),
            decoration: BoxDecoration(
              color: Colors.white,
              borderRadius: BorderRadius.circular(8.0),
            ),
            child: Column(
              mainAxisSize: MainAxisSize.min,
              children: <Widget>[
                Text('This is a popup window!'),
                SizedBox(height: 16.0),
                ElevatedButton(
                  onPressed: () {
                    _popupWindowController.dismiss();
                  },
                  child: Text('Close'),
                ),
              ],
            ),
          ),
        );
      },
    );
  }
}

// 假设的PopupWindowController类,用于管理弹窗的显示和隐藏
class PopupWindowController {
  BuildContext? _context;
  OverlayEntry? _overlayEntry;

  void show({required BuildContext context, required WidgetBuilder builder}) {
    _context = context;
    _overlayEntry = _createOverlayEntry(builder);
    Overlay.of(context)!.insert(_overlayEntry!);
  }

  void dismiss() {
    _overlayEntry?.remove();
    _overlayEntry = null;
    _context = null;
  }

  OverlayEntry _createOverlayEntry(WidgetBuilder builder) {
    return OverlayEntry(
      builder: (BuildContext context) {
        return Positioned(
          width: double.infinity,
          child: Material(
            type: MaterialType.transparency,
            child: InkWell(
              onTap: () {
                if (_context != null) {
                  dismiss();
                }
              },
              child: Container(
                color: Colors.black.withOpacity(0.5),
                child: Center(
                  child: BackdropFilter(
                    filter: ImageFilter.blur(sigmaX: 10, sigmaY: 10),
                    child: builder(_context!),
                  ),
                ),
              ),
            ),
          ),
        );
      },
    );
  }
}

注意:上述代码示例实际上并没有直接使用一个名为on_popup_window_widget的插件,因为该名称并非官方或广泛认可的插件。相反,它展示了一个自定义的弹窗管理实现,你可以根据需要调整或扩展。

如果你确实有一个具体的on_popup_window_widget插件,并且它有特定的API,你需要查阅该插件的文档来了解如何正确导入和使用它。上述代码提供了一个通用的弹窗管理示例,可以作为你实现类似功能的起点。

回到顶部