Flutter隐私屏幕保护插件privacy_screen的使用
Flutter隐私屏幕保护插件privacy_screen的使用
Flutter插件privacy_screen
提供了一种在应用进入后台时隐藏内容的隐私屏功能。该插件在iOS上使用Swift编写,在Android上使用Kotlin编写,以确保在Flutter进入原生视图(如来自原生插件)时仍能正常工作。
特性
平台 | 功能 |
---|---|
iOS | ✅自定义隐私屏幕图片 |
Android | ❌不支持自定义隐私屏幕图片 |
iOS | ❌禁用截图 |
Android | ⚠️仅在Flutter窗口中有效 |
iOS | ✅自动锁触发与原生生命周期同步 |
Android | ✅自动锁触发与原生生命周期同步 |
iOS | ✅原生生命周期监听器 |
Android | ✅原生生命周期监听器 |
缺点
- iOS: 锁定不能在显示原生视图时呈现,因为Flutter的视图无法覆盖原生视图控制器。
- Android:
FLAG_SECURE
目前仅对Flutter窗口有效,因此在原生视图中不会生效。无法自定义隐私视图。
使用方法
安装
在pubspec.yaml
文件中添加privacy_screen
依赖:
dependencies:
privacy_screen: ^latest_version
导入
import 'package:privacy_screen/privacy_screen.dart';
启用隐私视图
bool result = await PrivacyScreen.instance.enable(
iosOptions: const PrivacyIosOptions(
enablePrivacy: true,
privacyImageName: "LaunchImage",
autoLockAfterSeconds: 5,
lockTrigger: IosLockTrigger.didEnterBackground,
),
androidOptions: const PrivacyAndroidOptions(
enableSecure: true,
autoLockAfterSeconds: 5,
),
backgroundColor: Colors.white.withOpacity(0),
blurEffect: PrivacyBlurEffect.extraLight,
);
禁用隐私视图
bool result = await PrivacyScreen.instance.disable();
在iOS上使用自定义图片
- 在XCode中打开项目的iOS文件夹,并将图片添加到
runner/assets
中。 - 在代码中指定图片名称:
iosOptions: const PrivacyIosOptions(
privacyImageName: "LaunchImage",
)
使用锁定功能
将PrivacyGate
小部件放在根部并提供自己的lockBuilder
小部件:
class MyApp extends StatelessWidget {
MyApp({Key? key}) : super(key: key);
final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();
@override
Widget build(BuildContext context) {
return MaterialApp(
navigatorKey: navigatorKey,
builder: (_, child) {
return PrivacyGate(
lockBuilder: (ctx) => const LockerPage(),
navigatorKey: navigatorKey,
onLifeCycleChanged: (value) => print(value),
onLock: () => print("onLock"),
onUnlock: () => print("onUnlock"),
child: child,
);
},
home: const FirstRoute(),
);
}
}
手动锁定和解锁
// 手动锁定
PrivacyScreen.instance.lock();
// 解锁
PrivacyScreen.instance.unlock();
// 暂停自动锁定
PrivacyScreen.instance.pauseLock();
// 恢复自动锁定
PrivacyScreen.instance.resumeLock();
参数说明
共享选项
参数 | 描述 |
---|---|
backgroundColor | 隐私视图的背景颜色 |
blurEffect | 根据iOS的模糊效果设置 |
iOS选项
参数 | 描述 |
---|---|
enablePrivacy | 当应用程序进入后台时启用隐私视图 |
autoLockAfterSeconds | 在进入后台后多少秒触发锁定 |
privacyImageName | 要在隐私视图上显示的原生iOS资源名称 |
lockTrigger | 触发锁定机制的原生事件 |
Android选项
参数 | 描述 |
---|---|
enableSecure | 添加FLAG_SECURE 以隐藏内容并禁用截屏 |
autoLockAfterSeconds | 在进入后台后多少秒触发锁定 |
完整示例
以下是一个完整的示例代码,展示了如何集成和使用privacy_screen
插件:
import 'package:flutter/material.dart';
import 'package:privacy_screen/privacy_screen.dart';
import 'package:url_launcher/url_launcher.dart';
void main() async {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
MyApp({Key? key}) : super(key: key);
final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();
@override
Widget build(BuildContext context) {
return MaterialApp(
navigatorKey: navigatorKey,
builder: (_, child) {
return PrivacyGate(
lockBuilder: (ctx) => const LockerPage(),
navigatorKey: navigatorKey,
onLifeCycleChanged: (value) => print(value),
onLock: () => print("onLock"),
onUnlock: () => print("onUnlock"),
child: child,
);
},
home: const FirstRoute(),
);
}
}
class FirstRoute extends StatefulWidget {
const FirstRoute({Key? key}) : super(key: key);
@override
State<FirstRoute> createState() => _FirstRouteState();
}
class _FirstRouteState extends State<FirstRoute> {
List<String> lifeCycleHistory = [];
@override
void dispose() {
super.dispose();
}
@override
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Plugin example app'),
),
body: SingleChildScrollView(
child: SizedBox(
width: double.infinity,
child: SafeArea(
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
children: [
ElevatedButton(
onPressed: () => launchUrl(Uri.parse("https://www.flutter.dev/")),
child: const Text("Test Native: Url Launch"),
),
const Divider(),
ElevatedButton(
onPressed: () async {
await PrivacyScreen.instance.enable(
iosOptions: const PrivacyIosOptions(
enablePrivacy: true,
privacyImageName: "LaunchImage",
autoLockAfterSeconds: 5,
lockTrigger: IosLockTrigger.didEnterBackground,
),
androidOptions: const PrivacyAndroidOptions(
enableSecure: true,
autoLockAfterSeconds: 5,
),
backgroundColor: Colors.white.withOpacity(0),
blurEffect: PrivacyBlurEffect.extraLight,
);
},
child: const Text("Enable extraLight"),
),
ElevatedButton(
onPressed: () async {
await PrivacyScreen.instance.enable(
iosOptions: const PrivacyIosOptions(
enablePrivacy: true,
privacyImageName: "LaunchImage",
autoLockAfterSeconds: 5,
lockTrigger: IosLockTrigger.didEnterBackground,
),
androidOptions: const PrivacyAndroidOptions(
enableSecure: true,
autoLockAfterSeconds: 5,
),
backgroundColor: Colors.white.withOpacity(0),
blurEffect: PrivacyBlurEffect.light,
);
},
child: const Text("Enable light"),
),
ElevatedButton(
onPressed: () async {
await PrivacyScreen.instance.enable(
iosOptions: const PrivacyIosOptions(
enablePrivacy: true,
privacyImageName: "LaunchImage",
autoLockAfterSeconds: 5,
lockTrigger: IosLockTrigger.didEnterBackground,
),
androidOptions: const PrivacyAndroidOptions(
enableSecure: true,
autoLockAfterSeconds: 5,
),
backgroundColor: Colors.red.withOpacity(0.4),
blurEffect: PrivacyBlurEffect.dark,
);
},
child: const Text("Enable dark"),
),
ElevatedButton(
onPressed: () async {
await PrivacyScreen.instance.disable();
},
child: const Text("Disable"),
),
const Divider(),
ElevatedButton(
onPressed: () {
PrivacyScreen.instance.lock();
},
child: const Text("Lock"),
),
ElevatedButton(
onPressed: () {
PrivacyScreen.instance.pauseLock();
},
child: const Text("Pause Auto Lock"),
),
ElevatedButton(
onPressed: () {
PrivacyScreen.instance.resumeLock();
},
child: const Text("Resume Auto Lock"),
),
const Divider(),
...lifeCycleHistory.map((e) => Text(e)).toList(),
],
),
),
),
),
),
);
}
}
class LockerPage extends StatelessWidget {
const LockerPage({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return WillPopScope(
onWillPop: () async {
var result = await showDialog(
context: context,
builder: (ctx) => Dialog(
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
const Text(
"Confirmation",
style: TextStyle(fontSize: 24),
),
const Text("Are you sure to unlock?"),
Row(
children: [
Expanded(
child: ElevatedButton(
onPressed: () {
Navigator.of(context).pop(true);
},
child: const Text('Yes'),
),
),
const SizedBox(width: 8.0),
Expanded(
child: ElevatedButton(
onPressed: () {
Navigator.of(context).pop(false);
},
child: const Text('No'),
),
),
],
),
],
),
),
),
);
if (result == true) {
PrivacyScreen.instance.unlock();
}
return false;
},
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
TextFormField(),
ElevatedButton(
child: const Text("Unlock"),
onPressed: () => PrivacyScreen.instance.unlock(),
),
],
),
),
),
);
}
}
这个示例展示了如何使用privacy_screen
插件来保护您的Flutter应用程序的隐私。通过这些步骤,您可以轻松地为您的应用添加强大的隐私保护功能。
更多关于Flutter隐私屏幕保护插件privacy_screen的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter隐私屏幕保护插件privacy_screen的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中使用privacy_screen
插件的一个基本示例。这个插件允许你启用或禁用设备的屏幕保护(如防窥屏功能),以保护敏感信息不被旁观者看到。
首先,确保你已经在pubspec.yaml
文件中添加了privacy_screen
依赖:
dependencies:
flutter:
sdk: flutter
privacy_screen: ^x.y.z # 请替换为最新版本号
然后运行flutter pub get
来安装依赖。
接下来,你可以在你的Flutter项目中使用这个插件。下面是一个简单的示例,展示如何启用和禁用隐私屏幕保护。
示例代码
- 主页面(main.dart)
import 'package:flutter/material.dart';
import 'package:privacy_screen/privacy_screen.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Privacy Screen Example',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: PrivacyScreenExample(),
);
}
}
class PrivacyScreenExample extends StatefulWidget {
@override
_PrivacyScreenExampleState createState() => _PrivacyScreenExampleState();
}
class _PrivacyScreenExampleState extends State<PrivacyScreenExample> {
bool isPrivacyScreenEnabled = false;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Privacy Screen Example'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'Privacy Screen is ${isPrivacyScreenEnabled ? "Enabled" : "Disabled"}',
style: TextStyle(fontSize: 24),
),
SizedBox(height: 20),
ElevatedButton(
onPressed: () async {
try {
bool result = await PrivacyScreen.enable();
setState(() {
isPrivacyScreenEnabled = result;
});
} catch (e) {
print("Error enabling privacy screen: $e");
}
},
child: Text('Enable Privacy Screen'),
),
SizedBox(height: 10),
ElevatedButton(
onPressed: () async {
try {
bool result = await PrivacyScreen.disable();
setState(() {
isPrivacyScreenEnabled = !result;
});
} catch (e) {
print("Error disabling privacy screen: $e");
}
},
child: Text('Disable Privacy Screen'),
),
],
),
),
);
}
}
说明
-
依赖添加:确保在
pubspec.yaml
文件中添加privacy_screen
依赖,并运行flutter pub get
。 -
状态管理:在
PrivacyScreenExample
类中,我们使用一个布尔变量isPrivacyScreenEnabled
来跟踪隐私屏幕的状态。 -
按钮操作:我们有两个按钮,一个用于启用隐私屏幕,另一个用于禁用隐私屏幕。这些按钮分别调用
PrivacyScreen.enable()
和PrivacyScreen.disable()
方法,并更新UI以反映当前状态。 -
错误处理:在实际应用中,你应该添加更多的错误处理逻辑,例如检查设备是否支持隐私屏幕功能。
请注意,privacy_screen
插件的功能和可用性可能因设备和操作系统版本而异。确保在发布前进行充分的测试,并查阅插件的官方文档以获取最新的使用指南和兼容性信息。