Будущие переменные и безопасность null: необходимо инициализировать поле экземпляра «уведомления», не допускающее значения null.

#dart #future

Вопрос:

Я недавно обновил Dart (используя версию v2.12.4) и пытаюсь перенести созданное мной приложение.

Теперь я застрял на проблеме, которую, похоже, не могу решить.

Рассмотрим следующий псевдокод:

 class Notifications {
    Future<List<NotificationItem>> notificationItems;

    fillNotificationList() async {
        notificationItems = await httpService.getFromEndpoint();
    }
}
 

В notificationItems настоящее Non-nullable instance field 'notifications' must be initialized. время ошибки с.

Я пробовал разные решения; добавление late ключевого слова заставляет приложение выдавать LateInitializationError исключение, а добавление = [] выдает ошибку типа.

Как я могу успешно создать будущую переменную с функциями безопасности null в последних версиях Dart?

Комментарии:

1. Почему вы просто не возвращаете будущее непосредственно из класса и не позволяете вызывающему объекту хранить его в переменной, не имеющей значения null? Тогда также не нужно ждать или асинхронно, хотя вам нужно будет объявить функцию, чтобы вернуть будущее.

Ответ №1:

Похоже, что это переменная, обнуляемая. Это означает, что в вашей программе есть момент времени, когда это очевидно null . Так что объявите это таковым:

 Future<List<NotificationItem>>? notificationItems;
 

Остальная часть вашего кода кажется мне немного странной. Вы назвали будущее так, как я назвал бы фактический результат. У вас есть асинхронный метод, который не выполняет никакой асинхронной работы. Может быть, это просто потому, что приведенный здесь пример упрощен.

Или, может быть, вы действительно действительно хотите настаивать на том, что это никогда не бывает нулевым. Вы можете инициализировать его завершенным будущим с пустым списком:

 Future<List<NotificationItem>>? notificationItems = Future.value(<NotificationItem>[]);
 

Комментарии:

1. Здравствуйте и спасибо вам за ваш ответ. Пример кода упрощен, но он представляет некоторую логику, которую я на самом деле использую. Он fillNotificationList() извлекает результаты по страницам (для ленивой загрузки) и настроен на заполнение notificationItems списка. Я ясно вижу, что забыл await в своей асинхронной функции (отредактировано).