'package:flutter/src/widgets/will_pop_scope.dart':断言失败:第 61 行 pos 12:'_route == ModalRoute.of(context)':不是真的

时间:2021-05-01 06:29:54

标签: flutter dart getx

返回上一屏幕时出错.. 我也收到了

在小部件树中检测到重复的 GlobalKey。

屏幕 A -> 屏幕 B -> 屏幕 c 工作正常

但是当从屏幕 C ->屏幕 A 返回时,我遇到了这样的问题

我已将全局密钥初始化为:

GlobalKey loginformKey = new GlobalKey(debugLabel: '_loginformKey');

也尝试过制作最终版,但没有成功。我使用 Getx 进行状态管理。这是我的登录控制器。

class LoginController extends BaseController {
  final LoginRespostory repository;
  final LoginInterface loginInterface;
  GlobalKey<FormState> loginformKey;

  LoginController({@required this.repository, this.loginInterface})
      : assert(repository != null);
  TextEditingController emailController,
      passwordcontroller,
      phonenumberController;

  @override
  void onReady() {
    // TODO: implement onReady
    super.onReady();
    emailController = TextEditingController();
    passwordcontroller = TextEditingController();
    phonenumberController = TextEditingController();
  }

  @override
  void dispose() {
    // TODO: implement dispose
    super.dispose();
    loginformKey = null;
    emailController.dispose();
    passwordcontroller.dispose();
    phonenumberController.dispose();
  }

  @override
  void onConnected() {
    // TODO: implement onConnected
    super.onConnected();
  }

  @override
  void onDisconnect() {
    // TODO: implement onDisconnect
    super.onDisconnect();
  }

  @override
  void onInit() {
    // TODO: implement onInit
    super.onInit();

    loginformKey = new GlobalKey<FormState>(debugLabel: '_loginformKey');
  }

  validateAndProceed() {
    if (formKey.currentState.validate()) {
      userlogin();
    } else {
      Utils.showErrorSnackBar(title: "Success", message: "validation error");
     }
  }

  Future<void> userlogin() async {
    Utils.showloading();
    return await loginInterface
        .getlogin(emailController.text, passwordcontroller.text)
        .then((value) => onSuccess(value))
        .catchError((error) => onError(error));
  }

  onSuccess(SocialLoginResponse loginresponse) {
    if (loginresponse.ok) {
      AppPrefernces.putString(
          AppPrefernces.LOGINRESPONSE, loginresponse.toString());
      AppPrefernces.putString(AppPrefernces.TOKEN, loginresponse.accessToken);

      if (!loginresponse.user.phoneVerified) {
      } else {
        Utils.dismissloading();
        Get.toNamed(Routes.DASHBOARD);
      }
    } else {
      Utils.dismissloading();
      Utils.showErrorSnackBar(
          title: loginresponse.ok.toString(), message: loginresponse.message);
    }
  }

  onError(error) {
    Utils.dismissloading();
    Utils.showErrorSnackBar(title: AppString.ERROR, message: AppString.ERROR);
  }

  onDetailSuccess(SocialLoginResponse response) {
    if (response.ok) {
      Utils.showSuccessSnackBar(
          title: response.ok.toString(), message: AppString.SUCCESS);
      AppPrefernces.putString(AppPrefernces.LOGINRESPONSE, response.toString());
      AppPrefernces.putString(AppPrefernces.TOKEN, response.accessToken);

      emailController.clear();
      passwordcontroller.clear();
      Future.delayed(
          Duration(seconds: 1), () => Get.offNamed(Routes.DASHBOARD));
    } else {
      Utils.showErrorSnackBar(
          title: response.ok.toString(), message: response.accessToken);
    }
  }
}

}

1 个答案:

答案 0 :(得分:0)

我也遇到了这个问题,并设法通过将 formKey 从控制器移动到小部件本身来解决这个问题。 此外,我将 Widget 从无状态转换为有状态。

现在可以使用了。

希望这也适用于您。