StateError(错误状态:在小部件被处置后无法使用“ref”。)

问题描述 投票:0回答:1

未处理的异常:错误状态:在小部件被处置后无法使用“ref”:flutter Riverpod

your text

你好,我调用了一个方法,该方法在 initstate 中有一些方法。我单击搜索按钮,出现 StateError (错误状态:在小部件被处置后无法使用“ref”。)错误。 我不知道如何解决,实际上我不明白这个错误。但我的项目工作正常,我在 vscode 中进行测试,但出现所有异常,然后出现错误。我把我的代码粘贴在这里。请帮我.. 我的搜索按钮有下面的方法..


 void loadEksperList(String merkez) async {
    _eksperOzetListFuture = ref.read(mainEkspertizOzetProvider.notifier).getMainEkspertizOzetList(merkez);
  }


  @override
  void initState() {
    _eksperOzetListFuture = loadData();
    super.initState();
  }

  Future<void> loadData() async {
    await ref.read(userProvider.notifier).loadUser();
    await ref.read(memberShipProvider.notifier).getMembershipInfo();
    await ref.read(cityProvider.notifier).getCityList();
    await ref.read(merkezEkspertizProvider.notifier).getMerkezEkspertizList();
    _eksperOzetListFuture = ref.read(mainEkspertizOzetProvider.notifier).getMainEkspertizOzetList(""); // You can pass appropriate parameters here
  }
Future<void> getCityList() async {
    final db = await GoEksperDb().getDatabase();
    var data = await db.query('user_info');
    if (data.isNotEmpty) {
      var userData = data.first;
      if (userData.isNotEmpty) {
        try {
          var response = await Api().getFromApiWithoutResult(
            'Liste/IlGetir',
            userData['mobileId'] as String,
            null,
            userData['token'] as String,
          );
           if (response.success) {
            setStateData(response.data as Map<String, dynamic>);
          }
          else {
            setStateData({});
          }
        } catch (error) {
          setStateData({});
        }
      }
    }
  }

void setStateData(Map<String, Object?> cityData) {
    if (cityData.isNotEmpty) {
      List<CityResult> liste = [const CityResult(0, "İl")];
      for (var item in cityData.entries.toList()) {
        if (item.key.contains("values")) {
          for (var element in item.value as List) {
            liste.add(CityResult.fromJson(element));
          }
        }
      }
      state = liste;
    } else {
      state = [const CityResult(0, "İl")];
    }
  }
}
flutter riverpod
1个回答
0
投票

当您尝试访问提供程序或在使用它的小部件已被处理或不再位于小部件树中之后从中读取数据时,会标记该错误

更新您的代码以检查它是否未被处置

class YourWidget extends StatefulWidget {
  @override
  _YourWidgetState createState() => _YourWidgetState();
}

class _YourWidgetState extends State<YourWidget> {
  late Future _eksperOzetListFuture;
  bool _mounted = false;

  @override
  void initState() {
    super.initState();
   // Set mounted to true
    _mounted = true;  
    _eksperOzetListFuture = loadData();
  }

  Future<void> loadData() async {
    // Wrap each provider call with a check for _mounted
    if (_mounted) {
      await ref.read(userProvider.notifier).loadUser();
      await ref.read(memberShipProvider.notifier).getMembershipInfo();
      await ref.read(cityProvider.notifier).getCityList();
      await ref.read(merkezEkspertizProvider.notifier).getMerkezEkspertizList();
      _eksperOzetListFuture = ref.read(mainEkspertizOzetProvider.notifier).getMainEkspertizOzetList("");
    }
  }

  @override
  void dispose() {
    _mounted = false;  // Set mounted to false to indicate the widget is disposed
    super.dispose();
  }

  void loadEksperList(String merkez) async {
    if (_mounted) { // Check if the widget is still mounted
      _eksperOzetListFuture = ref.read(mainEkspertizOzetProvider.notifier).getMainEkspertizOzetList(merkez);
    }
  }

  @override
  Widget build(BuildContext context) {
    return Container(); // Your actual widget tree
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.