cutButtonlabel called on null

Posted by アライさん on 2020年07月24日

长按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, // 自定义的delegate
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
],
supportedLocales: [
const Locale('en', 'US'), // English
const Locale('zh', 'CH'), // China
],
);

由于之前的版本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;
}
}