美文网首页
Flutter Textfield长按报错修复:NosuchMe

Flutter Textfield长按报错修复:NosuchMe

作者: Pandakingli | 来源:发表于2019-06-18 14:41 被阅读0次

    1、问题现象

    iOS端在长按Textfield唤起粘贴复制的时候会报错。
    如图所示:


    33.jpg

    2、解决方案

    主要原因是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);
      }
    }
    
    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;
      }
    }
    
    
    

    在 Application 里配置一下

    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
          ],
        );
      }
    }
    
    

    相关文章

      网友评论

          本文标题:Flutter Textfield长按报错修复:NosuchMe

          本文链接:https://www.haomeiwen.com/subject/tmdfqctx.html