解决Flutter3.10+版本web端输入emoji表情显示为黑白的问题

解决Flutter3.10+版本web端输入emoji表情显示为黑白的问题

问题可能在项目flutter项目升级flutter到3.1版本之后出现
原因在github中有提到
Some apps don’t want to use color emojis due to its size (~24MB). This PR makes color emojis opt-in.
就是说为了减少体积,就把彩色emoji弄成黑白了。

<project-dir>/web/index.html
<!DOCTYPE html>
<html>
  <head>
  </head>
  <body>
    <!-- This script installs service_worker.js to provide PWA functionality to
       application. For more information, see:
       https://developers.google.com/web/fundamentals/primers/service-workers -->
    <div id="loader">
      <h1>
        loading
      </h1>
    </div>

    <script>
      var serviceWorkerVersion = null;
      var scriptLoaded = false;
      function loadMainDartJs() {
     
        if (scriptLoaded) {
     
          return;
        }
        scriptLoaded = true;
        var scriptTag = document.createElement("script");
        scriptTag.src = "main.dart.js";
        scriptTag.type = "application/javascript";
        document.body.append(scriptTag);
      
### 实现 Flutter 中限制用户输入 Emoji 表情Flutter 应用程序中,可以通过 `TextField` 或 `TextFormField` 的控制器 (` TextEditingController`) 来监听用户的输入并实时验证其合法性。为了限制用户输入 Emoji 表情,可以利用正则表达式匹配非标准字符范围。 以下是具体的实现方式: #### 使用正则表达式过滤 Emoji 输入 根据提供的参考资料[^1],可以构建一个用于检测和移除 Emoji 字符的正则表达式 `[^\u0000-\uFFFF]`。此正则表达式的含义是匹配任何不在基本多语言平面 (BMP) 范围内的 Unicode 字符,这些字符通常包括大多数 Emoji 表情。 以下是一个完整的代码示例,展示如何在 Flutter 中实现这一功能: ```dart import &#39;package:flutter/material.dart&#39;; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( home: NoEmojiInputScreen(), ); } } class NoEmojiInputScreen extends StatefulWidget { @override _NoEmojiInputScreenState createState() => _NoEmojiInputScreenState(); } class _NoEmojiInputScreenState extends State<NoEmojiInputScreen> { final TextEditingController _controller = TextEditingController(); void _filterEmoji(String value) { String filteredValue = value.replaceAll(RegExp(r&#39;[^\u0000-\uFFFF]&#39;), &#39;&#39;); // 移除所有 Emoji [^1] setState(() { if (_controller.text != filteredValue) { // 防止无限循环调用 onChanged _controller.value = TextEditingValue( text: filteredValue, selection: TextSelection.collapsed(offset: filteredValue.length), ); } }); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: Text(&#39;禁止输入 Emoji&#39;)), body: Padding( padding: const EdgeInsets.all(16.0), child: Column( children: [ TextField( controller: _controller, onChanged: _filterEmoji, // 实时过滤 Emoji 输入 decoration: InputDecoration( labelText: &#39;请输入文本&#39;, border: OutlineInputBorder(), ), ), SizedBox(height: 20), ElevatedButton( onPressed: () { print(_controller.text); // 打印最终结果 }, child: Text(&#39;提交&#39;), ) ], ), ), ); } @override void dispose() { _controller.dispose(); // 清理资源 super.dispose(); } } ``` #### 关键点解析 1. **正则表达式的作用** 正则表达式 `r&#39;[^\u0000-\uFFFF]&#39;` 是用来识别超出 BMP 平面的字符,即大部分 Emoji 和特殊符号。通过将其替换为空字符串即可达到去除的目的。 2. **动态更新输入框内容** 利用 `_controller.value` 更新 `TextField` 的显示内容,并同步调整光标位置以提供更好的用户体验。 3. **防止死循环触发** 在设置新的 `TextEditingController` 值之前,先比较当前值与目标值是否相同,从而避免因重复调用 `onChanged` 导致的性能问题。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值