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
更多关于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. 处理暂停与恢复逻辑
在 onPaused
和 onResumed
回调中,你可以执行需要在应用暂停或恢复时处理的逻辑。例如,保存用户数据、暂停或恢复动画、刷新界面等。
6. 注意事项
- 生命周期管理: 确保在
State
的dispose
方法中移除观察者,以避免内存泄漏。 - 后台任务: 注意,当应用进入后台时,某些操作(如网络请求)可能会被系统限制或终止。确保你的应用逻辑能够处理这些情况。
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('应用状态监听示例'),
),
),
);
}
}