Необработанное исключение: оператор проверки Null, используемый для нулевого значения: flutter_native_timezone

#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 . Что делать, если вы этого не сделаете? Я не знаю, это ваша задача решать. Может быть, записать сообщение об ошибке? Но не говорите своему компилятору, что это неправильно. Это приведет только к ошибкам, подобным той, которую вы получили.