zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    SQL JOB
    Log4net配置
    教你怎么使用Windows7系统自带的备份与还原的方法
    在LINQ TO SQL 中使用MVC3中的DataAnnotations 【MetadataType】
    图片下载
    DOS的一些常用命令
    自动合并多个文件如js css等 可以增加效率
    利用$.getJSON() 跨域请求操作
    在razor中使用递归,巧用递归
    Use ASP.NET and DotNetZip to Create and Extract ZIP Files
  • 原文地址:https://www.cnblogs.com/liuzhi20101016/p/14239810.html
Copyright © 2011-2022 走看看