#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 сделало это за меня. Спасибо