“未处理的异常:错误状态:在调用`dispose`后尝试使用EndUserViewModel。考虑检查`mounted`。”

问题描述 投票:0回答:4
EndUserViewModel? endUserViewModel;

  @override
  void initState() {
    super.initState();

    if(mounted){
      loadEndUser();
    }
  }

  loadEndUser() async {

    WidgetsBinding.instance.addPostFrameCallback((_) async {
      endUserViewModel = ref.read(endUserViewModelProvider.notifier);
      await endUserViewModel?.fetchEndUser("[email protected]");

      final endUser =  endUserViewModel?.endUserList;
      final endUserData = endUser?.first.name;
      print(" DATA $endUser");
      print("USER $endUserData");

    });

  }

我正在尝试使用

initState()
中的此函数从 API 获取数据, 但它显示错误-

E/flutter (14175): [错误:flutter/runtime/dart_vm_initializer.cc(41)] 未处理的异常:错误状态:在调用 `dispose` 后尝试使用 EndUserViewModel。
E/颤动(14175):
E/flutter (14175):考虑检查`mounted`。

我还在课堂上使用了

ConsumerStateful
并检查了安装,但它不起作用。

flutter riverpod
4个回答
1
投票
@override
  void initState() {
    WidgetsBinding.instance.addPostFrameCallback((_) {
      if (mounted) {
        loadEndUser();
        print("DATA ${endUserViewModel?.endUserList}");
        print("USER ${endUserViewModel?.endUserList?.first.name}");
      }
    });
    super.initState();
  }

  loadEndUser() async {

    if (mounted) {
      endUserViewModel = ref.read(endUserViewModelProvider.notifier);
      await endUserViewModel?.fetchEndUser("[email protected]");

    }
  }

0
投票
@override
void initState() {
  WidgetsBinding.instance?.addPostFrameCallback((_) {
    if (mounted) {
      loadEndUser();
    }
  });
  super.initState();
}

loadEndUser() async {
  endUserViewModel = ref.read(endUserViewModelProvider.notifier);
  await endUserViewModel?.fetchEndUser("[email protected]");

  final endUser = endUserViewModel?.endUserList;
  final endUserData = endUser?.first?.name;
  print("DATA $endUser");
  print("USER $endUserData");
}

您好,将 if (mounted) 检查移到 WidgetsBinding.instance.addPostFrameCallback() 回调中,这确保仅在小部件仍处于安装状态时才调用 loadEndUser() 方法。此检查是必要的,因为 addPostFrameCallback() 方法会安排在渲染帧后调用回调。如果在渲染框架之前卸载小部件,则不会执行回调。


0
投票
@override
void initState() {
  WidgetsBinding.instance?.addPostFrameCallback((_) {
    if (mounted) {
      loadEndUser();
    }
  });
  super.initState();
}

loadEndUser() async {
  endUserViewModel = ref.read(endUserViewModelProvider.notifier);
  await endUserViewModel?.fetchEndUser("[email protected]");
  
  if (mounted) {
    final endUser = endUserViewModel?.endUserList;
    final endUserData = endUser?.first?.name;
    print("DATA $endUser");
    print("USER $endUserData");
  }
}

dragonpicari 是正确的,但一定要始终检查小部件在异步方法之后是否仍然安装。 但在这种情况下,后帧回调不是必需的,您可以在 initState() 中加载它。


0
投票

您收到此错误是因为您从“endUserViewModel”中返回一些异步数据,并且您正在同步访问它(不等待数据返回)。你可以这样解决:::

loadEndUser() async {

WidgetsBinding.instance.addPostFrameCallback((_) async {
  endUserViewModel = ref.read(endUserViewModelProvider.notifier);
  
  // =========== CHANGES TO MADE ================

  endUserViewModel.when(
      error: (error, stackTrace) {
        throw Exception("Error loading user profile");
      },

      loading: () {
        print("Loading");
        return;
      },

      data: (userData) {
        print(useData);
      },
    );
  });
}

这绝对会在 Sha Allah 中发挥作用

© www.soinside.com 2019 - 2024. All rights reserved.