【问题标题】:flutter getter called on null async memoizer在 null 异步记忆器上调用颤振 getter
【发布时间】:2020-12-09 03:26:24
【问题描述】:

我正在尝试使用 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();
 }
 .....

但我得到错误 getter 'name' 调用为 null。没有记忆器,代码运行良好。任何帮助将不胜感激

【问题讨论】:

    标签: flutter asynchronous


    【解决方案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();
     }
    

    【讨论】:

    • 将 await 添加到 _memoizer 为我做了这件事。谢谢
    猜你喜欢
    • 2021-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-04
    • 2021-06-03
    • 1970-01-01
    相关资源
    最近更新 更多