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