长按TextField出现 表现:长按TextField提示cutButtonlabel called on null。
原因:复制粘贴按钮未进行本地化。
解决:
pubspec.yaml 中,在dependencies 的flutter:sdk:flutter下增加flutter_localizations
1 2 3 4 5 dependencies: flutter: sdk: flutter flutter_localizations: sdk: flutter
main.dart的MaterialApp中增加
1 2 3 4 5 6 7 8 9 10 11 12 return MaterialApp( localizationsDelegates: [ ChineseCupertinoLocalizations.delegate, GlobalMaterialLocalizations.delegate, GlobalWidgetsLocalizations.delegate, GlobalCupertinoLocalizations.delegate, ], supportedLocales: [ const Locale('en' , 'US' ), const Locale('zh' , 'CH' ), ], );
由于之前的版本Cupertino还没有中文化支持,所以可能需要自定义一个CupertinoLocalizations。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 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 ; } }