#flutter #dart
#flutter #dart
Вопрос:
Я получаю приведенную ниже ошибку при инициализации часового пояса в основном методе flutter_native_timezone
.
Ошибка:
Unhandled Exception: Null check operator used on a null value
MethodChannel.binaryMessenger (package:flutter/src/services/platform_channel.dart:121:86)
MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:146:36)
MethodChannel.invokeMethod (package:flutter/src/services/platform_channel.dart:329:12)
FlutterNativeTimezone.getLocalTimezone
(package:flutter_native_timezone/flutter_native_timezone.dart:17:24)
configureLocalTimeZone (package:myapp/main.dart:48:60)
main (package:myapp/main.dart:16:9)
runMainZoned.<anonymous closure>.<anonymous closure> (dart:ui/hooks.dart:145:25)
rootRun (dart:async/zone.dart:1428:13)`enter code here`
CustomZone.run (dart:async/zone.dart:1328:19)
runZoned (dart:async/zone.dart:1863:10)
С помощью приведенных ниже плагинов:
package:timezone/data/latest_10y.dart as tz
package:timezone/timezone.dart as tz
Фрагмент кода:
Future<void> configureLocalTimeZone() async {
if (kIsWeb || Platform.isLinux) {
return;
}
tz.initializeTimeZones();
final String? timeZoneName = await FlutterNativeTimezone.getLocalTimezone();
tz.setLocalLocation(tz.getLocation(timeZoneName!));
}
Комментарии:
1.
// @dart=2.9
Вставьте этот код в файл main.dart в первой строке над файлом импорта
Ответ №1:
Ну, я думаю, вы не читали свой собственный код или просто не поняли, что такое безопасность dart null. Я настоятельно рекомендую вам прочитать и понять Dart nullsafety, эта функция здесь, чтобы остаться, и вы не сможете правильно писать код, если вы его не понимаете. Безопасность Dart null заключается не в случайном наложении ?
и !
на материал, пока он не скомпилируется.
В этой строке явно указано, что переменная timeZoneName
может быть нулевой:
final String? timeZoneName = await FlutterNativeTimezone.getLocalTimezone();
… и затем в следующей строке вы сообщаете компилятору, pinky promise, я клянусь, что эта переменная никогда не будет нулевой.
tz.setLocalLocation(tz.getLocation(timeZoneName!));
Ну, угадайте, что произошло? Это было null. Вы солгали своему компилятору, и компилятор поймал вас.
Что вы можете сделать? Вместо того, чтобы лгать вашему компилятору, чтобы заставить его скомпилироваться, вы могли бы понять, что вам нужно сделать, чтобы написать правильную программу. В этом случае вам нужно вставить if
и вызвать только вторую строку, если у вас есть timeZoneName
. Что делать, если вы этого не сделаете? Я не знаю, это ваша задача решать. Может быть, записать сообщение об ошибке? Но не говорите своему компилятору, что это неправильно. Это приведет только к ошибкам, подобным той, которую вы получили.