flutter 在小部件树仍在构建时更新通知程序

x7yiwoj4  于 2023-10-22  发布在  Flutter
关注(0)|答案(1)|浏览(134)

我试图更新initState函数中的通知程序,但出现错误:

FlutterError(试图在构件树构建时修改提供程序

然后它给出了这样做的建议:

延迟修改,例如将修改封装到Future(() {...})中。

我不知道该怎么做。我看了FutureProvider文档,但我不确定这是我想要的。
我有一个我正在使用的ConsumerStatefulWidget类。所有代码都在ConsumerState类中。下面是我使用的代码:

getCurrentCompanyProfile() async {
    if (ref.read(globalsNotifierProvider).companyId == null ||
        ref.read(globalsNotifierProvider).companyId == "") {
      ref.read(globalsNotifierProvider.notifier).updatenewCompany(true);  <<< ERROR HERE
      agencyNameController.text = "";
      address1Controller.text = "";
      address2Controller.text = "";
      cityController.text = "";
      stateController.text = "";
      zipController.text = "";
      cellPhoneController.text = "";
      officePhoneController.text = "";
      emailController.text = "";
      websiteController.text = "";
    } else {
      final DocumentSnapshot currentAgencyProfile = await companyRef
          .doc(ref.read(globalsNotifierProvider).companyId)
          .get();

      // existing record
      // Updates Controllers
      agencyNameController.text = currentAgencyProfile["name"] ?? "";
      address1Controller.text = currentAgencyProfile['address1'] ?? "";
      address2Controller.text = currentAgencyProfile['address2'] ?? "";
      cityController.text = currentAgencyProfile['city'] ?? "";
      stateController.text = currentAgencyProfile['state'] ?? "";
      _currentCompanyState = currentAgencyProfile['state'] ?? "";
      zipController.text = currentAgencyProfile['zipCode'].toString() ?? "";
      cellPhoneController.text = currentAgencyProfile['cellPhone'] ?? "";
      officePhoneController.text = currentAgencyProfile['officePhone'] ?? "";
      emailController.text = currentAgencyProfile['email'] ?? "";
      websiteController.text = currentAgencyProfile['website'] ?? "";

    }
  }

这是我调用getCurrentCompanyProfile的地方:

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

    _dropDownState = getDropDownState();
    _currentCompanyState = _dropDownState[0].value;
  }

我怎样才能在小部件树构建好之后更新通知程序呢?
谢谢

qyuhtwio

qyuhtwio1#

作为一个快速解决方案,你可以把你的修改放在这个回调里面:

@override
void initState() {
  // ...

  WidgetsBinding.instance.addPostFrameCallback((_) {
    getCurrentCompanyProfile();
  });
}

相关问题