Flutter悬浮窗管理插件flutter_overlay_window的使用

Flutter悬浮窗管理插件flutter_overlay_window的使用

插件简介

flutter_overlay_window 是一个用于在Flutter应用程序中显示悬浮窗的插件,它允许您的应用在其他应用程序之上显示内容。这使得开发人员能够创建类似TrueCaller、Messenger聊天头等需要悬浮窗口的应用功能。

预览

TrueCaller悬浮窗示例 穿透点击悬浮窗示例 Messenger聊天头悬浮窗示例
TrueCaller overlay example click-through overlay example Messanger chat-head example

安装

添加依赖

pubspec.yaml文件中添加flutter_overlay_window依赖:

dependencies:
  flutter_overlay_window: any # 或者指定最新版本

Android配置

AndroidManifest.xml中添加以下权限和服务配置:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_SPECIAL_USE" />

<application>
    ...
    <service android:name="flutter.overlay.window.flutter_overlay_window.OverlayService" 
        android:exported="false"
        android:foregroundServiceType="specialUse">
        <property android:name="android.app.PROPERTY_SPECIAL_USE_FGS_SUBTYPE"
            android:value="explanation_for_special_use"/>
    </service>
</application>

创建悬浮窗入口点

main.dart中为悬浮窗创建一个入口点:

@pragma("vm:entry-point")
void overlayMain() {
  runApp(const MaterialApp(
    debugShowCheckedModeBanner: false,
    home: Material(child: Text("My overlay"))
  ));
}

使用方法

以下是flutter_overlay_window的一些主要API及其用法:

  • 检查悬浮窗权限是否已授予
final bool status = await FlutterOverlayWindow.isPermissionGranted();
  • 请求悬浮窗权限
final bool status = await FlutterOverlayWindow.requestPermission();
  • 显示悬浮窗
await FlutterOverlayWindow.showOverlay(
  height: 200, // 可选参数:悬浮窗高度,默认全屏覆盖
  width: 300,  // 可选参数:悬浮窗宽度,默认匹配父容器
  alignment: OverlayAlignment.center, // 可选参数:悬浮窗对齐方式,默认居中
  visibilitySecret: NotificationVisibility.visibilityPublic, // 可选参数:通知可见性,默认保密
  flag: OverlayFlag.defaultFlag, // 可选参数:悬浮窗标志,默认默认标志
  overlayTitle: "overlay activated", // 可选参数:通知标题,默认"overlay activated"
  overlayContent: "This is an overlay", // 可选参数:通知内容
  enableDrag: true, // 可选参数:是否启用拖拽,默认不启用
  positionGravity: PositionGravity.none, // 可选参数:拖拽后位置,默认无
  startPosition: null, // 可选参数:初始位置,默认为空
);
  • 关闭悬浮窗
await FlutterOverlayWindow.closeOverlay();
  • 发送数据给悬浮窗
await FlutterOverlayWindow.shareData("Hello from the other side");
  • 监听来自悬浮窗的消息
FlutterOverlayWindow.overlayListener.listen((event) {
  print("Current Event: $event");
});
  • 更新悬浮窗标志
await FlutterOverlayWindow.updateFlag(OverlayFlag.focusPointer);
  • 更新悬浮窗大小
await FlutterOverlayWindow.resizeOverlay(80, 120);
  • 更新悬浮窗位置
await FlutterOverlayWindow.moveOverlay(OverlayPosition(0, 156));
  • 获取当前悬浮窗位置
await FlutterOverlayWindow.getOverlayPosition();

示例代码

以下是一个完整的示例项目结构和代码实现:

main.dart

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

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  runApp(const MyApp());
}

@pragma("vm:entry-point")
void overlayMain() {
  WidgetsFlutterBinding.ensureInitialized();
  runApp(
    const MaterialApp(
      debugShowCheckedModeBanner: false,
      home: TrueCallerOverlay(),
    ),
  );
}

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

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      debugShowCheckedModeBanner: false,
      home: HomePage(),
    );
  }
}

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Home Page')),
      body: Center(
        child: ElevatedButton(
          onPressed: () async {
            final bool status = await FlutterOverlayWindow.isPermissionGranted();
            if (!status) {
              await FlutterOverlayWindow.requestPermission();
            }
            await FlutterOverlayWindow.showOverlay();
          },
          child: const Text('Open Overlay'),
        ),
      ),
    );
  }
}

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

  @override
  Widget build(BuildContext context) {
    return Container(
      color: Colors.blue,
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          const Text('True Caller Overlay', style: TextStyle(color: Colors.white)),
          ElevatedButton(
            onPressed: () async {
              await FlutterOverlayWindow.closeOverlay();
            },
            child: const Text('Close Overlay'),
          ),
        ],
      ),
    );
  }
}

以上是flutter_overlay_window插件的详细使用说明及示例代码,希望对您有所帮助!


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

1 回复

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


当然,下面是一个关于如何使用 flutter_overlay_window 插件在 Flutter 中创建和管理悬浮窗的示例代码。flutter_overlay_window 插件允许你在 Android 和 iOS 上创建悬浮窗(Overlay Window),这在需要显示浮动内容(如聊天头、悬浮按钮等)时非常有用。

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

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

然后,运行 flutter pub get 来获取依赖。

接下来是示例代码,展示了如何创建一个简单的悬浮窗:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Overlay Window Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () async {
              // 创建悬浮窗
              OverlayWindow overlayWindow = OverlayWindow();

              // 配置悬浮窗参数
              OverlayWindowParams params = OverlayWindowParams(
                width: 300,
                height: 200,
                alignment: Alignment.topRight,
                margin: EdgeInsets.only(top: 20, right: 20),
                backgroundBlur: 5.0, // 背景模糊程度
                backgroundColor: Colors.black54.withOpacity(0.7), // 背景颜色
                borderRadius: BorderRadius.circular(16), // 圆角
              );

              // 构建悬浮窗内容
              Widget overlayContent = Material(
                elevation: 8.0,
                shape: RoundedRectangleBorder(
                  borderRadius: BorderRadius.circular(16),
                ),
                child: Container(
                  color: Colors.white,
                  child: Center(
                    child: Text('This is an overlay window!'),
                  ),
                ),
              );

              // 显示悬浮窗
              await overlayWindow.add(
                context: context,
                params: params,
                child: overlayContent,
              );

              // 你可以通过 overlayWindow.remove() 来移除悬浮窗
              // await overlayWindow.remove();
            },
            child: Text('Show Overlay Window'),
          ),
        ),
      ),
    );
  }
}

在这个示例中,我们创建了一个简单的 Flutter 应用,其中包含一个按钮。点击按钮时,会创建一个悬浮窗,显示一些文本内容。

关键步骤解释:

  1. 创建 OverlayWindow 实例OverlayWindow overlayWindow = OverlayWindow();
  2. 配置悬浮窗参数OverlayWindowParams 包含了悬浮窗的宽度、高度、位置、边距、背景模糊、背景颜色和圆角等参数。
  3. 构建悬浮窗内容:这里我们使用了 MaterialContainer 小部件来创建悬浮窗的内容。
  4. 显示悬浮窗:调用 overlayWindow.add() 方法,并传入上下文、参数和内容。这将显示悬浮窗。

你可以根据需要调整悬浮窗的参数和内容。此外,overlayWindow.remove() 方法可以用来移除悬浮窗。

请确保在实际项目中处理悬浮窗的生命周期,比如应用进入后台或前台时适当地添加或移除悬浮窗。

回到顶部