Flutter浮动按钮覆盖层插件scrumlab_float_button_overlay的使用

Flutter浮动按钮覆盖层插件scrumlab_float_button_overlay的使用

scrumlab_float_button_overlay 插件简介

scrumlab_float_button_overlay 是一个用于在 Flutter 应用中实现类似浮动按钮覆盖层功能的插件。它可以让应用服务在后台保持可见,类似于一个浮动按钮。

使用步骤

1. 导入插件

首先,在项目中导入 scrumlab_float_button_overlay 插件:

import 'package:scrumlab_float_button_overlay/scrumlab_float_button_overlay.dart';

2. 初始化权限检查

在应用启动时,调用 checkPermissions 方法以确保插件所需的权限已启用。

[@override](/user/override)
void initState() {
  super.initState();
  initPlatformState();
  
  // 注册回调函数
  FloatButtonOverlay.registerCallback(serviceCallback, onClickCallback);
}

Future<void> initPlatformState() async {
  try {
    FloatButtonOverlay.checkPermissions;
  } on PlatformException {}
}

3. 在 main 方法中初始化 Flutter 应用

确保在 main 方法中初始化 Flutter 并运行应用。

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

4. 显示/隐藏浮动按钮

显示浮动按钮

通过 openOverlay 方法设置浮动按钮的属性,例如通知标题、通知文本、图标路径等。

FloatButtonOverlay.openOverlay(
  activityName: 'MainActivity', // 主活动名称
  iconPath: file.path, // 图标路径
  notificationText: "Float Button Overlay ☠️", // 通知文本
  notificationTitle: 'Float Button Overlay ☠️', // 通知标题
  packageName: packageInfo.packageName, // 包名
  showTransparentCircle: true, // 是否显示透明圆圈
  iconWidth: 100, // 图标宽度
  iconHeight: 100, // 图标高度
  transpCircleHeight: 150, // 透明圆圈高度
  transpCircleWidth: 150, // 透明圆圈宽度
);

隐藏浮动按钮

通过 closeOverlay 方法隐藏浮动按钮。

FloatButtonOverlay.closeOverlay;

完整示例代码

以下是一个完整的示例代码,展示了如何使用 scrumlab_float_button_overlay 插件。

import 'dart:io';
import 'package:scrumlab_float_button_overlay/scrumlab_float_button_overlay.dart';
import 'package:flutter/material.dart';
import 'dart:async';
import 'package:flutter/services.dart';
import 'package:package_info_plus/package_info_plus.dart'; // 使用 package_info_plus 进行版本信息获取
import 'package:path_provider/path_provider.dart';

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

Future<File> getImageFileFromAssets(String path) async {
  final byteData = await rootBundle.load('assets/$path');

  final file = File('${(await getTemporaryDirectory()).path}/$path');
  await file.writeAsBytes(byteData.buffer
      .asUint8List(byteData.offsetInBytes, byteData.lengthInBytes));

  return file;
}

File? file;
PackageInfo? packageInfo;

class MyApp extends StatefulWidget {
  [@override](/user/override)
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _platformVersion = 'Unknown';
  TextEditingController iconWidthController = TextEditingController();
  TextEditingController iconHeightController = TextEditingController();
  TextEditingController transpWidth = TextEditingController();
  TextEditingController transpHeight = TextEditingController();
  bool showTransparencyBg = false;

  [@override](/user/override)
  void initState() {
    super.initState();
    WidgetsFlutterBinding.ensureInitialized();
    initPlatformState();
    FloatButtonOverlay.registerCallback(serviceCallback, onClickCallback);
  }

  Future<void> initPlatformState() async {
    String platformVersion;
    try {
      platformVersion =
          await FloatButtonOverlay.platformVersion ?? 'Unknown version';
    } on PlatformException {
      platformVersion = 'Failed to get platform version.';
    }

    if (!mounted) return;

    setState(() {
      _platformVersion = platformVersion;
    });
  }

  void serviceCallback(String tag) {
    print(tag);
  }

  void onClickCallback(String tag) {
    print(tag);
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Float Button Overlay - Example'),
          backgroundColor: Colors.black45,
        ),
        body: Padding(
          padding: const EdgeInsets.all(16.0),
          child: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              crossAxisAlignment: CrossAxisAlignment.center,
              children: [
                Text('Running on: $_platformVersion\n'),
                TextField(
                  controller: iconWidthController,
                  decoration: InputDecoration(labelText: "Icon Width"),
                ),
                TextField(
                  controller: iconHeightController,
                  decoration: InputDecoration(labelText: "Icon Height"),
                ),
                TextField(
                  controller: transpWidth,
                  decoration: InputDecoration(labelText: "Transparency Width"),
                ),
                TextField(
                  controller: transpHeight,
                  decoration: InputDecoration(labelText: "Transparency Height"),
                ),
                Row(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: [
                    Text('Show Transparency Background?'),
                    Switch(
                        value: showTransparencyBg,
                        onChanged: (value) {
                          setState(() {
                            showTransparencyBg = value;
                          });
                        }),
                  ],
                ),
                TextButton(
                  onPressed: () async {
                    file = await getImageFileFromAssets('caveira.png');
                    packageInfo = await PackageInfo.fromPlatform();

                    debugPrint("Vai abrir o overlay");
                    FloatButtonOverlay.openOverlay(
                      activityName: 'MainActivity',
                      iconPath: file?.path ?? '',
                      notificationText: "Float Button Overlay ☠️",
                      notificationTitle: 'Float Button Overlay ☠️',
                      packageName: packageInfo?.packageName ?? '',
                      showTransparentCircle: showTransparencyBg,
                      iconWidth: int.parse(iconWidthController.text.isEmpty
                          ? '100'
                          : iconWidthController.text),
                      iconHeight: int.parse(iconHeightController.text.isEmpty
                          ? '100'
                          : iconHeightController.text),
                      transpCircleHeight: int.parse(transpHeight.text.isEmpty
                          ? '150'
                          : transpHeight.text),
                      transpCircleWidth: int.parse(
                          transpWidth.text.isEmpty ? '150' : transpWidth.text),
                    );
                  },
                  child: Container(
                    color: Colors.black45,
                    height: 40,
                    width: 100,
                    child: Center(
                      child: Text(
                        "Show Button",
                      ),
                    ),
                  ),
                ),
                TextButton(
                  onPressed: () {
                    debugPrint("Vai fechar o overlay");
                    FloatButtonOverlay.closeOverlay;
                  },
                  child: Container(
                    color: Colors.black54,
                    height: 40,
                    width: 100,
                    child: Center(
                      child: Text(
                        "Close Button",
                      ),
                    ),
                  ),
                ),
              ],
            ),
          ),
        ),
      ),
    );
  }
}

更多关于Flutter浮动按钮覆盖层插件scrumlab_float_button_overlay的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter浮动按钮覆盖层插件scrumlab_float_button_overlay的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


scrumlab_float_button_overlay 是一个用于在 Flutter 应用中创建浮动按钮覆盖层的插件。它允许你在应用的任何位置添加一个浮动按钮,并且可以自定义按钮的行为和外观。以下是如何使用这个插件的基本步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 scrumlab_float_button_overlay 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  scrumlab_float_button_overlay: ^1.0.0  # 请使用最新版本

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

2. 导入插件

在你的 Dart 文件中导入插件:

import 'package:scrumlab_float_button_overlay/scrumlab_float_button_overlay.dart';

3. 使用 FloatButtonOverlay

你可以将 FloatButtonOverlay 包裹在你的 MaterialAppScaffold 中,以便在应用中显示浮动按钮。

以下是一个简单的示例:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: FloatButtonOverlay(
        child: Scaffold(
          appBar: AppBar(
            title: Text('Floating Button Overlay Example'),
          ),
          body: Center(
            child: Text('Hello, World!'),
          ),
        ),
        floatButton: FloatingActionButton(
          onPressed: () {
            // 处理按钮点击事件
            print('Floating Button Pressed!');
          },
          child: Icon(Icons.add),
        ),
      ),
    );
  }
}

4. 自定义浮动按钮

你可以通过 floatButton 参数来自定义浮动按钮的外观和行为。上面的示例中使用了 FloatingActionButton,但你也可以使用其他类型的按钮或自定义 widget。

5. 控制浮动按钮的位置

FloatButtonOverlay 允许你通过 alignment 参数来控制浮动按钮的位置。默认情况下,按钮位于右下角。

FloatButtonOverlay(
  alignment: Alignment.bottomLeft,  // 将按钮放置在左下角
  child: Scaffold(
    // 其他代码
  ),
  floatButton: FloatingActionButton(
    onPressed: () {
      print('Floating Button Pressed!');
    },
    child: Icon(Icons.add),
  ),
)

6. 处理按钮点击事件

你可以在 onPressed 回调中处理按钮的点击事件。例如,你可以导航到另一个页面、显示一个对话框或执行其他操作。

FloatButtonOverlay(
  child: Scaffold(
    // 其他代码
  ),
  floatButton: FloatingActionButton(
    onPressed: () {
      // 导航到另一个页面
      Navigator.push(
        context,
        MaterialPageRoute(builder: (context) => AnotherPage()),
      );
    },
    child: Icon(Icons.add),
  ),
)

7. 自定义覆盖层

FloatButtonOverlay 还允许你通过 overlayBuilder 参数来自定义覆盖层的内容。你可以使用这个参数来添加更多的 UI 元素或动画效果。

FloatButtonOverlay(
  child: Scaffold(
    // 其他代码
  ),
  floatButton: FloatingActionButton(
    onPressed: () {
      print('Floating Button Pressed!');
    },
    child: Icon(Icons.add),
  ),
  overlayBuilder: (BuildContext context) {
    return Center(
      child: Text('Custom Overlay Content'),
    );
  },
)
回到顶部