我的博客:https://www.cnblogs.com/liuzhi20101016/
我的掘金:https://juejin.im/user/5dd3f99c6fb9a01ffb355246
我的简书:https://www.jianshu.com/u/3adf2f8593b8
在这之前,相信很多同学肯定也是遇到了同一个问题:就是按照其他博主给的代码也执行了,粘贴板里也能打印出内容,可就是弹窗死活不弹出,那么为什么呢?
需要在flutter项目工程的
main.dart
中执行:
核心代码:
1 @override
2 void initState() {
3 // 在当前页面放一个观察者。
4 WidgetsBinding.instance.addObserver(this);
5 super.initState();
8 @override
9 void dispose() {
10 // 移除当前页面的观察者。
11 WidgetsBinding.instance.removeObserver(this);
12 super.dispose();
13 }
15 @override
16 void didChangeAppLifecycleState(AppLifecycleState state) {
17 // 当App生命周期状态为恢复时。
18 if (state == AppLifecycleState.resumed) {
19 getClipboardContents();
20 }
21 }
23 /// 使用异步调用获取系统剪贴板的返回值。
24 getClipboardContents() async {
25 // 访问剪贴板的内容。
26 ClipboardData clipboardData = await Clipboard.getData(Clipboard.kTextPlain);
27 // 剪贴板不为空时。
28 if (clipboardData != null && clipboardData.text.trim() != '') {
29 String _name = clipboardData.text.trim();
30 // 淘口令的正则表达式,能判断类似“¥123456¥”的文本。
31 if (RegExp(r'[\uffe5]+.+[\uffe5]').hasMatch(_name)) {
32 // 处理淘口令的业务逻辑。
33 showDialog<Null>(
34 context: context,
35 barrierDismissible: true,
36 builder: (BuildContext context) {
37 return CupertinoAlertDialog(
38 title: Text('淘口令'),
39 content: Text(_name),
40 );
41 },
42 );
43 }
44 }
经过测试分析,受context影响,因为当你切换到当前页的时候,系统并不知道你的context是哪一页,也就是说,系统不知道你当前哪一页想要弹出这个弹窗
正确代码:
1 @override
2 void initState() {
3 // 在当前页面放一个观察者。
4 WidgetsBinding.instance.addObserver(this);
5 super.initState();
8 @override
9 void dispose() {
10 // 移除当前页面的观察者。
11 WidgetsBinding.instance.removeObserver(this);
12 super.dispose();
13 }
15 @override
16 void didChangeAppLifecycleState(AppLifecycleState state) {
17 // 当App生命周期状态为恢复时。
18 if (state == AppLifecycleState.resumed) {
19 getClipboardContents(GetIt.asNewInstance()<NavigateService>().ctx);
20 }
21 }
23 /// 使用异步调用获取系统剪贴板的返回值。
24 getClipboardContents(BuildContext context) async {
25 // 访问剪贴板的内容。
26 ClipboardData clipboardData = await Clipboard.getData(Clipboard.kTextPlain);
27 // 剪贴板不为空时。
28 if (clipboardData != null && clipboardData.text.trim() != '') {
29 String _name = clipboardData.text.trim();
30 // 淘口令的正则表达式,能判断类似“¥123456¥”的文本。
31 if (RegExp(r'[\uffe5]+.+[\uffe5]').hasMatch(_name)) {
32 // 处理淘口令的业务逻辑。
33 showDialog<Null>(
34 context: context,
35 barrierDismissible: true,
36 builder: (BuildContext context) {
37 return CupertinoAlertDialog(
38 title: Text('淘口令'),
39 content: Text(_name),
40 );
41 },
42 );
43 }
44 }
关键代码:Flutter SDK:get_it: ^5.0.1
GetIt.asNewInstance()<NavigateService>().ctx
推荐参考链接:https://blog.csdn.net/hekaiyou/article/details/93177051