Flutter弹出窗口插件flutter_popup的使用

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

Flutter弹出窗口插件flutter_popup的使用

flutter_popup简介

flutter_popup包是Flutter应用程序中显示简单且可自定义弹出窗口的便捷工具。它提供了一个高亮功能,可以引导用户的注意力到特定区域。

image image image image

开始使用

pubspec.yaml文件中添加依赖:

dependencies:
  flutter_popup: ^3.3.4

然后导入包:

import 'package:flutter_popup/flutter_popup.dart';

使用方法

基本用法

以下是一个简单的例子,展示了如何使用CustomPopup来创建一个带有文本内容和图标子组件的弹出窗口。

CustomPopup(
  content: Text('George says everything looks fine'),
  child: Icon(Icons.help),
),

自定义样式

你还可以通过传递不同的参数来自定义弹出窗口的外观,例如箭头颜色、遮罩颜色、背景颜色等。

CustomPopup(
  arrowColor: Colors.orange,
  barrierColor: Colors.green.withOpacity(0.1),
  backgroundColor: Colors.white,
  content: Text('George says everything looks fine'),
  child: Icon(Icons.help),
),

复杂内容

你也可以将更复杂的小部件放入弹出窗口中,比如滑块或菜单列表。

CustomPopup(
  content: _Slider(),
  child:Text('slider'),
)

CustomPopup(
  content: Column(
    mainAxisSize: MainAxisSize.min,
    children: List.generate(5, (index) => Text('menu$index')),
  ),
  child: const Icon(Icons.add_circle_outline),
)

高级布局

对于更复杂的布局需求,你可以嵌套多个CustomPopup小部件,并调整其属性以适应你的设计要求。

Container(
  decoration: BoxDecoration(color: Colors.white),
  padding: EdgeInsets.symmetric(vertical: 10),
  child: Row(
    mainAxisAlignment: MainAxisAlignment.spaceAround,
    children: [
      CustomPopup(
        showArrow: false,
        contentPadding:EdgeInsets.symmetric(horizontal: 30, vertical: 10),
        barrierColor: Colors.transparent,
        contentDecoration: BoxDecoration(
          color: Colors.white,
        ),
        content: SizedBox(
          width: double.infinity,
          child: Column(
            mainAxisSize: MainAxisSize.min,
            crossAxisAlignment: CrossAxisAlignment.start,
            children: List.generate(4,(index) => Text('item$index'),),),
        ),
        child: Text('filter1'),
      ),
      Text('filter2'),
      Text('filter3'),
    ],
  ),
)

完整示例Demo

下面是一个完整的Dart代码示例,演示了如何在一个Flutter应用中集成并使用flutter_popup插件。

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

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key});

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

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Material(
      child: Scaffold(
        backgroundColor: Color(0xFFFAFAFA),
        appBar: AppBar(
          title: const Text('example'),
          actions: [
            // example0 menu
            Padding(
              padding: const EdgeInsets.only(right: 30),
              child: CustomPopup(
                content: Column(
                  mainAxisSize: MainAxisSize.min,
                  children: List.generate(5, (index) => Text('menu$index')),
                ),
                child: const Icon(Icons.add_circle_outline),
              ),
            ),
          ],
        ),
        body: Column(
          children: [
            // example1 text
            CustomPopup(
              barrierColor: Colors.green.withOpacity(0.1),
              backgroundColor: Colors.white,
              content: Text('George says everything looks fine'),
              child: Icon(Icons.help, color: Colors.grey),
            ),
            SizedBox(height: 20),

            // example2 slider
            CustomPopup(
              arrowColor: Colors.orange,
              content: _Slider(),
              child: Container(
                padding: const EdgeInsets.all(10),
                color: Colors.primaries[10],
                child: Text('slider'),
              ),
            ),
            SizedBox(height: 20),

            // example3 calendar
            CustomPopup(
              showArrow: false,
              content: SizedBox(
                width: 300,
                child: CalendarDatePicker(
                  initialDate: DateTime.now(),
                  firstDate: DateTime.now(),
                  lastDate: DateTime.now(),
                  onDateChanged: (v) {},
                ),
              ),
              child: Container(
                padding: const EdgeInsets.all(10),
                color: Colors.primaries[10],
                child: Text('calendar'),
              ),
            ),

            SizedBox(height: 20),

            // example4 filter
            Container(
              decoration: BoxDecoration(color: Colors.white),
              padding: EdgeInsets.symmetric(vertical: 10),
              child: Row(
                mainAxisAlignment: MainAxisAlignment.spaceAround,
                children: [
                  CustomPopup(
                    showArrow: false,
                    contentPadding:
                        EdgeInsets.symmetric(horizontal: 30, vertical: 10),
                    barrierColor: Colors.transparent,
                    contentDecoration: BoxDecoration(
                      color: Colors.white,
                    ),
                    content: SizedBox(
                      width: double.infinity,
                      child: Column(
                        mainAxisSize: MainAxisSize.min,
                        crossAxisAlignment: CrossAxisAlignment.start,
                        children: List.generate(
                          4,
                          (index) => Text('item$index'),
                        ),
                      ),
                    ),
                    child: Text('filter1'),
                  ),
                  Text('filter2'),
                  Text('filter3'),
                ],
              ),
            ),
            SizedBox(height: 20),
            Text('data' * 100, maxLines: 20),
          ],
        ),
      ),
    );
  }
}

class _Slider extends StatefulWidget {
  const _Slider();

  @override
  State<_Slider> createState() => __SliderState();
}

class __SliderState extends State<_Slider> {
  double progress = 0.5;

  @override
  Widget build(BuildContext context) {
    return SizedBox(
      width: 300,
      height: 100,
      child: Slider(
        value: progress,
        onChanged: (value) {
          setState(() => progress = value);
        },
      ),
    );
  }
}

以上就是关于flutter_popup插件的基本介绍及使用方法,希望对你有所帮助!如果你有任何问题或需要进一步的帮助,请随时联系我:QQ:965471570, Gmail:herowws90@gmail.com


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

1 回复

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


当然,下面是一个关于如何在Flutter项目中使用flutter_popup插件来创建弹出窗口的示例代码。

首先,确保你已经在pubspec.yaml文件中添加了flutter_popup依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_popup: ^2.0.0  # 请检查最新版本号

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

接下来,你可以按照以下步骤创建一个简单的弹出窗口。

1. 导入必要的包

在你的Dart文件中导入flutter_popup包:

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

2. 创建主应用程序

这里是一个简单的Flutter应用程序示例,它包含一个按钮,点击按钮后会弹出一个窗口。

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

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

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

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Popup Example'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            showPopup(
              context: context,
              builder: (BuildContext context) {
                return PopupWidget();
              },
            );
          },
          child: Text('Show Popup'),
        ),
      ),
    );
  }
}

3. 创建弹出窗口组件

接下来,定义一个PopupWidget类,它将作为弹出窗口的内容。

class PopupWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Container(
      padding: EdgeInsets.all(20),
      decoration: BoxDecoration(
        color: Colors.white,
        borderRadius: BorderRadius.circular(10),
        boxShadow: [
          BoxShadow(
            color: Colors.grey.withOpacity(0.5),
            spreadRadius: 5,
            blurRadius: 7,
            offset: Offset(0, 3), // changes position of shadow
          ),
        ],
      ),
      child: Column(
        mainAxisSize: MainAxisSize.min,
        children: <Widget>[
          Text(
            'This is a Popup Window',
            style: TextStyle(fontSize: 20),
          ),
          SizedBox(height: 20),
          ElevatedButton(
            onPressed: () {
              Popup.dismiss(context);
            },
            child: Text('Close'),
          ),
        ],
      ),
    );
  }
}

4. 使用Popup上下文管理

flutter_popup插件提供了Popup上下文管理工具,你可以使用Popup.of(context)来获取当前Popup实例并进行更多操作,但在这个简单示例中,我们只需要使用Popup.dismiss(context)来关闭弹出窗口。

完整代码总结

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

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

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

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

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Popup Example'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            showPopup(
              context: context,
              builder: (BuildContext context) {
                return PopupWidget();
              },
            );
          },
          child: Text('Show Popup'),
        ),
      ),
    );
  }
}

class PopupWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Container(
      padding: EdgeInsets.all(20),
      decoration: BoxDecoration(
        color: Colors.white,
        borderRadius: BorderRadius.circular(10),
        boxShadow: [
          BoxShadow(
            color: Colors.grey.withOpacity(0.5),
            spreadRadius: 5,
            blurRadius: 7,
            offset: Offset(0, 3), // changes position of shadow
          ),
        ],
      ),
      child: Column(
        mainAxisSize: MainAxisSize.min,
        children: <Widget>[
          Text(
            'This is a Popup Window',
            style: TextStyle(fontSize: 20),
          ),
          SizedBox(height: 20),
          ElevatedButton(
            onPressed: () {
              Popup.dismiss(context);
            },
            child: Text('Close'),
          ),
        ],
      ),
    );
  }
}

这个示例展示了如何使用flutter_popup插件在Flutter应用中创建一个简单的弹出窗口。你可以根据需要进一步自定义和扩展弹出窗口的功能和样式。

回到顶部