Flutter功能暂停与恢复插件paused_secret的使用

Flutter功能暂停与恢复插件paused_secret的使用

paused_secret

paused_secret 是一个用于在 Flutter 应用中实现功能暂停与恢复的插件。它支持多种功能,如禁用屏幕截图、添加/移除暂停/恢复水印覆盖层等。

功能

  • disableScreenshot:仅支持 Android 平台。
  • pausedSecret:支持 Android 13 及以上版本和 iOS 平台。
  • onScreenshot:监听屏幕截图事件。
  • addPausedSecretOverlay/removePausedSecretOverlay:添加/移除暂停时的水印覆盖层。
  • addResumedSecretOverlay/removeResumedSecretOverlay:添加/移除恢复时的水印覆盖层。
  • addWatermarkOverlay/removeWatermarkOverlay:添加/移除水印覆盖层。

使用示例

以下是一个完整的示例代码,展示了如何使用 paused_secret 插件来控制应用的功能暂停与恢复。

import 'dart:async';
import 'dart:io';

import 'package:flutter/material.dart';
import 'package:is_debug/is_debug.dart';
import 'package:paused_secret/paused_secret.dart';
import 'package:permission_handler/permission_handler.dart';

void main() {
  runApp(const MaterialApp(home: MyApp()));
}

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

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final _pausedSecretPlugin = PausedSecret();

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Plugin example app'),
        actions: [
          IconButton(
            onPressed: () {
              openAppSettings();
            },
            icon: const Icon(Icons.developer_board_rounded),
          )
        ],
      ),
      body: ListView(
        physics: const NeverScrollableScrollPhysics(),
        children: [
          ...ListTile.divideTiles(context: context, tiles: _b(context))
        ],
      ),
    );
  }

  bool disableScreenshot = false;
  bool pausedSecret = false;
  bool pausedSecretGlobal = false;
  StreamSubscription<dynamic>? screenshotListener;
  List<bool> overlay = [false, false, false];

  List<Widget> _b(BuildContext context) {
    return [
      const SizedBox(height: 1),
      ListTile(
        title: Text("Running Dart${Platform.version.split(" ").first}"),
        trailing: FutureBuilder<List<String?>>(
          future: Future.wait<String?>([
            IsDebug().getHostPlatformName(),
            IsDebug().getHostPlatformVersion(),
          ]),
          builder: (c, s) => Text('${s.data?.join("_")}'),
        ),
      ),
      CheckboxListTile(
        title: const Text("disableScreenshot"),
        subtitle: const Text(
          "仅支持 Android",
        ),
        value: disableScreenshot,
        onChanged: (b) {
          if (!Platform.isAndroid) {
            ScaffoldMessenger.of(context).showSnackBar(
              const SnackBar(content: Text("仅支持 Android")),
            );
            return;
          }
          disableScreenshot = b == true;
          setState(() {});
          _pausedSecretPlugin.disableScreenshot(disableScreenshot);
        },
      ),
      CheckboxListTile(
        title: const Text("pausedSecret"),
        subtitle: const Text("支持 Android13+ 和 iOS"),
        value: pausedSecret,
        onChanged: (b) {
          pausedSecret = b == true;
          setState(() {});
          _pausedSecretPlugin.pausedSecret(pausedSecret);
        },
      ),
      CheckboxListTile(
        title: const Text("pausedSecretGlobal"),
        subtitle: const Text(
          "支持 Android 和 iOS\n"
          "警告:Android 无法截屏",
        ),
        value: pausedSecretGlobal,
        onChanged: (b) {
          pausedSecretGlobal = b == true;
          setState(() {});
          if (Platform.isAndroid) {
            _pausedSecretPlugin.disableScreenshot(pausedSecretGlobal);
          } else {
            _pausedSecretPlugin.pausedSecret(pausedSecretGlobal);
          }
        },
      ),
      CheckboxListTile(
        title: const Text("screenshotListener"),
        subtitle: const Text(
          "支持 Android 和 iOS\n"
          "Android 14 以下需要权限",
        ),
        value: screenshotListener != null,
        onChanged: (b) {
          if (b == true) {
            if (Platform.isAndroid) {}
            screenshotListener = _pausedSecretPlugin.onScreenshot().listen(
              (event) {
                ScaffoldMessenger.of(context).showSnackBar(
                  const SnackBar(content: Text("正在截屏")),
                );
              },
            );
          } else {
            screenshotListener?.cancel();
            screenshotListener = null;
          }
          setState(() {});
        },
      ),
      ..._bOverlay(context),
      const Padding(
        padding: EdgeInsets.all(16.0),
        child: Center(child: CircularProgressIndicator()),
      ),
      const SizedBox(),
    ];
  }

  List<Widget> _bOverlay(BuildContext context) {
    return [
      Container(
        alignment: Alignment.center,
        padding: const EdgeInsets.all(8),
        child: const Text("SecretOverlayView"),
      ),
      CheckboxListTile(
        title: const Text("pausedSecretOverlay"),
        subtitle: const Text(
          "支持 Android 和 iOS\n"
          "某些 Android 设备不支持\n"
          "它们在暂停时无法绘制屏幕视图",
        ),
        value: overlay[0],
        onChanged: (b) {
          overlay[0] = b == true;
          if (overlay[0]) {
            PausedSecret.addPausedSecretOverlay(context);
          } else {
            PausedSecret.removePausedSecretOverlay();
          }
          setState(() {});
        },
      ),
      CheckboxListTile(
        title: const Text("resumedSecretOverlay"),
        value: overlay[1],
        onChanged: (b) {
          overlay[1] = b == true;
          setState(() {});
          if (overlay[1]) {
            PausedSecret.addResumedSecretOverlay(context);
          } else {
            PausedSecret.removeResumedSecretOverlay();
          }
        },
      ),
      CheckboxListTile(
        title: const Text("watermarkOverlay"),
        value: overlay[2],
        onChanged: (b) {
          overlay[2] = b == true;
          setState(() {});
          if (overlay[2]) {
            PausedSecret.addWatermarkOverlay(context, "jawa0919@163.com");
          } else {
            PausedSecret.removeWatermarkOverlay();
          }
        },
      ),
    ];
  }
}

更多关于Flutter功能暂停与恢复插件paused_secret的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter功能暂停与恢复插件paused_secret的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


paused_secret 是一个用于在 Flutter 应用中管理应用暂停与恢复状态的插件。它可以帮助开发者在应用进入后台(暂停状态)或返回前台(恢复状态)时执行特定的逻辑。以下是关于如何使用 paused_secret 插件的详细指南。

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 paused_secret 插件的依赖:

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

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

2. 导入插件

在需要使用 paused_secret 的 Dart 文件中导入插件:

import 'package:paused_secret/paused_secret.dart';

3. 初始化插件

在应用的入口点(通常是 main.dart)中初始化 paused_secret

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

4. 监听应用状态变化

你可以使用 PausedSecret 提供的回调方法来监听应用的状态变化:

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

class _MyAppState extends State<MyApp> with WidgetsBindingObserver {
  [@override](/user/override)
  void initState() {
    super.initState();
    WidgetsBinding.instance.addObserver(this);

    // 监听应用暂停事件
    PausedSecret.onPaused(() {
      print('应用进入后台,处理暂停逻辑');
      // 例如:保存数据、暂停动画等
    });

    // 监听应用恢复事件
    PausedSecret.onResumed(() {
      print('应用返回前台,处理恢复逻辑');
      // 例如:恢复动画、刷新数据等
    });
  }

  [@override](/user/override)
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    super.dispose();
  }

  [@override](/user/override)
  void didChangeAppLifecycleState(AppLifecycleState state) {
    if (state == AppLifecycleState.paused) {
      PausedSecret.notifyPaused();
    } else if (state == AppLifecycleState.resumed) {
      PausedSecret.notifyResumed();
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Paused Secret Demo',
      home: Scaffold(
        appBar: AppBar(
          title: Text('Paused Secret Demo'),
        ),
        body: Center(
          child: Text('应用状态监听示例'),
        ),
      ),
    );
  }
}

5. 处理暂停与恢复逻辑

onPausedonResumed 回调中,你可以执行需要在应用暂停或恢复时处理的逻辑。例如,保存用户数据、暂停或恢复动画、刷新界面等。

6. 注意事项

  • 生命周期管理: 确保在 Statedispose 方法中移除观察者,以避免内存泄漏。
  • 后台任务: 注意,当应用进入后台时,某些操作(如网络请求)可能会被系统限制或终止。确保你的应用逻辑能够处理这些情况。

7. 示例代码

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

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

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

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

class _MyAppState extends State<MyApp> with WidgetsBindingObserver {
  [@override](/user/override)
  void initState() {
    super.initState();
    WidgetsBinding.instance.addObserver(this);

    PausedSecret.onPaused(() {
      print('应用进入后台,处理暂停逻辑');
    });

    PausedSecret.onResumed(() {
      print('应用返回前台,处理恢复逻辑');
    });
  }

  [@override](/user/override)
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    super.dispose();
  }

  [@override](/user/override)
  void didChangeAppLifecycleState(AppLifecycleState state) {
    if (state == AppLifecycleState.paused) {
      PausedSecret.notifyPaused();
    } else if (state == AppLifecycleState.resumed) {
      PausedSecret.notifyResumed();
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Paused Secret Demo',
      home: Scaffold(
        appBar: AppBar(
          title: Text('Paused Secret Demo'),
        ),
        body: Center(
          child: Text('应用状态监听示例'),
        ),
      ),
    );
  }
}
回到顶部