【问题标题】:'package:flutter/src/widgets/will_pop_scope.dart': Failed assertion: line 61 pos 12: '_route == ModalRoute.of(context)': is not true'package:flutter/src/widgets/will_pop_scope.dart':断言失败:第 61 行 pos 12:'_route == ModalRoute.of(context)':不正确
【发布时间】:2021-07-24 08:43:57
【问题描述】:

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

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

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

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

我已将全局键初始化为:

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

也尝试过制作 final 但没有成功。我正在使用 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);
    }
  }
}

}

【问题讨论】:

  • 你能包含一些代码吗,我遇到了类似的问题,通过热重启解决了
  • 热重启只能工作一段时间,但同样的问题再次出现

标签: flutter dart flutter-getx


【解决方案1】:

我也遇到了这个问题,并设法通过将 formKey 从 Controller 移动到 Widget 本身来解决这个问题。 我还将 Widget 从 Stateless 转换为 Stateful。

现在可以了。

希望这对你也有用。

【讨论】:

    猜你喜欢
    • 2021-08-07
    • 1970-01-01
    • 2021-02-23
    • 2020-03-01
    • 1970-01-01
    • 2022-06-27
    • 2021-04-12
    • 2021-02-05
    • 2021-01-16
    相关资源
    最近更新 更多