Flutter TextField IOS 双击、长按 异常

2023-11-01

IOS端在长按Textfield唤起粘贴复制的时候会报错。

主要原因是Cupertino缺少了对应的非英文版本的支持。

import 'package:flutter/cupertino.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';

class ChineseCupertinoLocalizations implements CupertinoLocalizations {
  final materialDelegate = GlobalMaterialLocalizations.delegate;
  final widgetsDelegate = GlobalWidgetsLocalizations.delegate;
  final local = const Locale('zh');

  MaterialLocalizations ml;

  Future init() async {
    ml = await materialDelegate.load(local);
    print(ml.pasteButtonLabel);
  }

  @override
  String get alertDialogLabel => ml.alertDialogLabel;

  @override
  String get anteMeridiemAbbreviation => ml.anteMeridiemAbbreviation;

  @override
  String get copyButtonLabel => ml.copyButtonLabel;

  @override
  String get cutButtonLabel => ml.cutButtonLabel;

  @override
  DatePickerDateOrder get datePickerDateOrder => DatePickerDateOrder.mdy;

  @override
  DatePickerDateTimeOrder get datePickerDateTimeOrder =>
      DatePickerDateTimeOrder.date_time_dayPeriod;

  @override
  String datePickerDayOfMonth(int dayIndex) {
    return dayIndex.toString();
  }

  @override
  String datePickerHour(int hour) {
    return hour.toString().padLeft(2, "0");
  }

  @override
  String datePickerHourSemanticsLabel(int hour) {
    return "$hour" + "时";
  }

  @override
  String datePickerMediumDate(DateTime date) {
    return ml.formatMediumDate(date);
  }

  @override
  String datePickerMinute(int minute) {
    return minute.toString().padLeft(2, '0');
  }

  @override
  String datePickerMinuteSemanticsLabel(int minute) {
    return "$minute" + "分";
  }

  @override
  String datePickerMonth(int monthIndex) {
    return "$monthIndex";
  }

  @override
  String datePickerYear(int yearIndex) {
    return yearIndex.toString();
  }

  @override
  String get pasteButtonLabel => ml.pasteButtonLabel;

  @override
  String get postMeridiemAbbreviation => ml.postMeridiemAbbreviation;

  @override
  String get selectAllButtonLabel => ml.selectAllButtonLabel;

  @override
  String timerPickerHour(int hour) {
    return hour.toString().padLeft(2, "0");
  }

  @override
  String timerPickerHourLabel(int hour) {
    return "$hour".toString().padLeft(2, "0") + "时";
  }

  @override
  String timerPickerMinute(int minute) {
    return minute.toString().padLeft(2, "0");
  }

  @override
  String timerPickerMinuteLabel(int minute) {
    return minute.toString().padLeft(2, "0") + "分";
  }

  @override
  String timerPickerSecond(int second) {
    return second.toString().padLeft(2, "0");
  }

  @override
  String timerPickerSecondLabel(int second) {
    return second.toString().padLeft(2, "0") + "秒";
  }

  static const LocalizationsDelegate<CupertinoLocalizations> delegate =
  _ChineseDelegate();

  static Future<CupertinoLocalizations> load(Locale locale) async {
    var localizaltions = ChineseCupertinoLocalizations();
    await localizaltions.init();
    return SynchronousFuture<CupertinoLocalizations>(localizaltions);
  }

  @override
  // TODO: implement modalBarrierDismissLabel
  String get modalBarrierDismissLabel => throw UnimplementedError();

  @override
  // TODO: implement searchTextFieldPlaceholderLabel
  String get searchTextFieldPlaceholderLabel => throw UnimplementedError();

  @override
  String tabSemanticsLabel({int tabIndex, int tabCount}) {
    // TODO: implement tabSemanticsLabel
    throw UnimplementedError();
  }

  @override
  // TODO: implement timerPickerHourLabels
  List<String> get timerPickerHourLabels => throw UnimplementedError();

  @override
  // TODO: implement timerPickerMinuteLabels
  List<String> get timerPickerMinuteLabels => throw UnimplementedError();

  @override
  // TODO: implement timerPickerSecondLabels
  List<String> get timerPickerSecondLabels => throw UnimplementedError();

  @override
  // TODO: implement todayLabel
  String get todayLabel => throw UnimplementedError();
}

class _ChineseDelegate extends LocalizationsDelegate<CupertinoLocalizations> {
  const _ChineseDelegate();

  @override
  bool isSupported(Locale locale) {
    return locale.languageCode == 'zh';
  }

  @override
  Future<CupertinoLocalizations> load(Locale locale) {
    return ChineseCupertinoLocalizations.load(locale);
  }

  @override
  bool shouldReload(LocalizationsDelegate<CupertinoLocalizations> old) {
    return false;
  }
}
class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
      localizationsDelegates: <LocalizationsDelegate<dynamic>>[
        ChineseCupertinoLocalizations.delegate, // 自定义的delegate
 
        DefaultCupertinoLocalizations.delegate, // 目前只包含英文
 
        // 下面两个是Material widgets的delegate, 包含中文
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
      ],
      supportedLocales: [
        const Locale('en', 'US'), // English
        const Locale('zh', 'Hans'), // China
        const Locale('zh', ''), // China
        // ... other locales the app supports
      ],
    );
  }
}
 
复制代码


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Flutter TextField IOS 双击、长按 异常 的相关文章

随机推荐

  • 动态规划(js版)

    1 动态规划算法介绍 理解动态规划 知乎好文 LeetCode简单的动态规划题 斐波那契数 爬楼梯 使用最小花费爬楼梯 有点小坑 不同路径 不同路径 II 注意初始值的设置 最小路径和 LeetCode较难的动态规划题 343 整数拆分 9
  • 哈希(Hash)与算法的衡量

    对于map来说 背后就是平衡搜索二叉树 具体可见 https blog csdn net weixin 42513339 article details 88889306 空间复杂度为 O logN 对于unorder map来说 背后就是
  • ubuntu18.04安装xmind思维导图 + 创建软件的快捷方式

    ubuntu18 04安装xmind思维导图 sh文件运行小知识 创建快捷方式 1 下载linux版本的 zip压缩包 2 运行sudo setup sh 2 1 sh 文件相关知识 补充 3 启动xmind 3 1 启动失败 font f
  • ggplot2中的条形图 geom_bar()

    20150226 1 ggplot 能直接计算aes 中x变量各个分类的数目 所以可以直接用原始数据 而不用像plot 一样要table 数据 2 geom bar mapping NULL data NULL stat bin posit
  • 从零搭建 Spring Cloud 服务(超级详细)

    点击上方 Java后端 选择 设为星标 优质文章 及时送达 作者 Anakki 链接 blog csdn net qq 29519041 article details 85238270 这里会介绍很多基础知识 直接想开始搭建微服务的可以看
  • 小学思品课如何使用计算机教学设计,关于小学思品教学设计与反思

    关于小学思品教学设计与反思 小学思想品德节约用水教学设计与反思 节约用水 教学设计与反思 一 指导思想 品德与生活课 注重学生的实践与参与性 突出教学实效性 让学生通过丰富的教学活动去亲身体验 亲自感受水的重要与水资源的匮乏 从而形成自觉的
  • Win10 系统下VisualStudio2019 配置Open3D-0.15.2(C++)

    目录 一 下载Open3D 0 15 2 二 编译 font color dd00dd 1 新建文件 CmakeList txt TestVisualizer h TestVisualizer cpp font color dd00dd 2
  • 进程、线程与JVM、CLR

    进程和线程的关系 网上有一副很经典的图可以让我们来理解进程和线程的关系 下面这副图是一个双向多车道的道路图 假如我们把整条道路看成是一个 进程 的话 那么图中由白色虚线分隔开来的各个车道就是进程中的各个 线程 了 这副图出自 http ww
  • chroot命令的基本用法

    chroot 切换根目录 chroot PATH TO TEMPROOT COMMAND chroot test virrot bin bash 切换根目录 并明确指明运行那个目录下面的bash 例子 切换根目录 root gdy ftpf
  • 实战Elastic Stack分析K8S应用日志--部署logstash

    logstash从kafka取数据输出到es 部署logstash docker pull logstash 6 8 6 docker images grep logstash docker tag d0a2dac51fcb harbor
  • 【M malloc送书第二期】朋友圈大佬都去读研了,这份备考书单我码住了!

    文章目录 01 数据结构与算法分析 02 计算机网络 自顶向下方法 03 现代操作系统 04 深入理解计算机系统 01 概率论基础教程 原书第10版 03 线性代数及其应用 八九月的朋友圈刮起了一股晒通知书潮 频频有大佬晒出 研究生入学通知
  • JSONObject与JSONArray总结及部分使用

    例如 取出name4值过程步骤 1 将以上字符串转换为JSONArray对象 2 取出对象的第一项 JSONObject对象 3 取出name1的值JSONObject对象 4 取出name2的值JSONObject对象 5 取出name4
  • 【react】高阶函数_函数柯里化

    高阶函数 如果一个函数符合下面2个规范中的任何一个 那该函数就是高阶函数 1 若A函数 接受的参数是一个函数 那么A就可以称之为高阶函数 2 若A函数 调用的返回值依然是一个函数 那么A就可以称之为高阶函数 常见的高阶函数有 Promise
  • JetBrain系列软件使用

    一 PHPSTORM 非常好用的插件 支持对一些动态调用的函数快速跳到函数定义处 DynamicReturnTypePlugin FIle gt Settings gt Plugins gt Marketplace 输入 DynamicRe
  • 使用Python对一张图像进行高斯模糊

    import cv2 src cv2 imread test jpg numpy数组 第二个参数 高斯核的宽和高 建议是奇数 第三个参数 x和y轴的标准差 result cv GaussianBlur src 45 45 15 cv2 im
  • MybatisPlus配置双数据库驱动

    个人博客纯净版 MybatisPlus配置双数据库驱动 代码搬运工 最近项目中需要用到2种数据库驱动连接数据库 下面我们基于MybatisPlus实现一下 具体实现 1 在pom xml中添加如下依赖
  • 三星修复软件+连接三星认证服务器,三星云服务从2月6日起不再支持第三方应用程序数据备份...

    原标题 三星云服务从2月6日起不再支持第三方应用程序数据备份 1 月 23 日消息 三星近日向用户发送电子邮件称 三星云服务将在 2 月 6 日停止支持第三方应用数据备份 届时三星将清除已经从这些应用备份的数据 用户将无法从这些备份中进行恢
  • 时间序列分类总结(time-series classification)

    时间序列分类总结 time series classification 一 传统方法 需要手工设计 1 DTW dynamic time warping KNN 2 基于特征的方法 二 深度学习 1 MLP FCN ResNet 2 LST
  • TestNg框架源码解析

    TestNG是一个测试框架 其灵感来自JUnit和NUnit 但引入了一些新的功能 使其功能更强大 使用更方便 TestNG是一个开源自动化测试框架 TestNG表示下一代 Next Generation的首字母 TestNG类似于JUni
  • Flutter TextField IOS 双击、长按 异常

    IOS端在长按Textfield唤起粘贴复制的时候会报错 主要原因是Cupertino缺少了对应的非英文版本的支持 import package flutter cupertino dart import package flutter f