Flutter——类似淘口令复制弹窗(避免踩坑)

在这之前,相信很多同学肯定也是遇到了同一个问题:就是按照其他博主给的代码也执行了,粘贴板里也能打印出内容,可就是弹窗死活不弹出,那么为什么呢?

需要在flutter项目工程的main.dart中执行:

核心代码:

 1 @override
 2   void initState() {
 3     // 在当前页面放一个观察者。
 4     WidgetsBinding.instance.addObserver(this);
 5     super.initState();
 6   }
 7 
 8   @override
 9   void dispose() {
10     // 移除当前页面的观察者。
11     WidgetsBinding.instance.removeObserver(this);
12     super.dispose();
13   }
14 
15   @override
16   void didChangeAppLifecycleState(AppLifecycleState state) {
17     // 当App生命周期状态为恢复时。
18     if (state == AppLifecycleState.resumed) {
19       getClipboardContents();
20     }
21   }
22 
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     }
45   }

 经过测试分析,受context影响,因为当你切换到当前页的时候,系统并不知道你的context是哪一页,也就是说,系统不知道你当前哪一页想要弹出这个弹窗

正确代码:

 1 @override
 2   void initState() {
 3     // 在当前页面放一个观察者。
 4     WidgetsBinding.instance.addObserver(this);
 5     super.initState();
 6   }
 7 
 8   @override
 9   void dispose() {
10     // 移除当前页面的观察者。
11     WidgetsBinding.instance.removeObserver(this);
12     super.dispose();
13   }
14 
15   @override
16   void didChangeAppLifecycleState(AppLifecycleState state) {
17     // 当App生命周期状态为恢复时。
18     if (state == AppLifecycleState.resumed) {
19       getClipboardContents(GetIt.asNewInstance()<NavigateService>().ctx);
20     }
21   }
22 
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     }
45   }

关键代码:Flutter SDK:get_it: ^5.0.1

GetIt.asNewInstance()<NavigateService>().ctx

  推荐参考链接:https://blog.csdn.net/hekaiyou/article/details/93177051

原文地址:https://www.cnblogs.com/liuzhi20101016/p/14239810.html