средство получения флаттера, вызываемое в null async memoizer

#flutter #asynchronous

#прерывание #асинхронный

Вопрос:

Я пытаюсь использовать async memoizer для выполнения вызова URL-адреса серверной части и возврата значения на мой экран. Вот мой код:

Мое хранилище данных

  import 'package:new_app/data/trainer_repository.dart';
 import 'package:new_app/models/trainer.dart';
 import 'package:rxdart/rxdart.dart';
 import 'dart:async';
 import 'package:async/async.dart';

 class TrainerBLoc {
    final trainerSource = BehaviorSubject<Trainer>();
    final AsyncMemoizer _memoizer = AsyncMemoizer();
    Stream<Trainer> get trainerStream => trainerSource.stream;

    Future<Trainer> fetchTrainer() async {
      return _memoizer.runOnce(() async {
      final trainer = await trainerRepository.getTrainer();
      return trainer;
    });
 }

 void dispose() {
 trainerSource?.close();
 }
}

final TrainerBLoc trainerBLoc = TrainerBLoc();
  

Модель тренажера

 import 'package:equatable/equatable.dart';
import 'package:meta/meta.dart';

class Trainer extends Equatable {
   final String name;
   final String phoneNumber;
   final String email;
   final String image;
   final String state;
   final String lg;

  Trainer({
    @required this.name,
    @required this.phoneNumber,
    @required this.email,
    @required this.image,
    @required this.state,
    @required this.lg,
});


  @override
  List<Object> get props => [phoneNumber, name, email, image];
}  
  

Мой основной виджет

 class _TrainerScreenState extends State<TrainerScreen> {
  Future<Trainer> _trainer;

  @override
  void initState() {
    _trainer = trainerBLoc.fetchTrainer();
    super.initState();
 }
 .....
  

Но я получаю сообщение об ошибке ‘name’, вызываемое при null. Без memoizer код выполняется нормально. Любая помощь будет оценена

Ответ №1:

Добавьте await в _memoizer.RunOnce(), поскольку это асинхронная функция.

 Future<Trainer> fetchTrainer() async {
      return await _memoizer.runOnce(() async {
      final trainer = await trainerRepository.getTrainer();
      return trainer;
    });
  

trainerBLoc.fetchTrainer() также является асинхронной функцией, вам нужно дождаться результата, прежде чем устанавливать его в переменную.

  @override
  void initState() {
    trainerBLoc.fetchTrainer().then((value){_trainer=value});
    super.initState();
 }
  

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

1. добавление await в _memoizer сделало это за меня. Спасибо