'package:flutter/src/widgets/will_pop_scope.dart':断言失败:第135行,第12个位置:'_route == ModalRoute.of(context)' 不为真

3

我正在使用Getx状态管理。我有一个LOGINSCREEN和它的GetxController。在该GetxController中,我定义了一个类似于这样的FormKey:final formKey = GlobalKey<FormState>();

当我从任何其他屏幕直接导航回到LOGINSCREEN(用于注销)时,我遇到了此问题:Get.offAllNamed(Routes.loginScreen);

我尝试过flutter clean,但它不起作用。我似乎找不到解决方法。

如果有人能找到解决方案,那将是非常有帮助的。

he following assertion was thrown building Form-[LabeledGlobalKey<FormState>#f1349](state: FormState#45516):
'package:flutter/src/widgets/will_pop_scope.dart': Failed assertion: line 135 pos 12: '_route == ModalRoute.of(context)': is not true.
2

Either the assertion indicates an error in the framework itself, or we should provide substantially more information in this error message to help you determine and fix the underlying cause.
In either case, please report this assertion by filing a bug on GitHub:
  https://github.com/flutter/flutter/issues/new?template=2_bug.md

The relevant error-causing widget was
Form-[LabeledGlobalKey<FormState>#f1349]
lib\…\login_screen\login_screen.dart:40
When the exception was thrown, this was the stack
#2      _WillPopScopeState.didUpdateWidget
package:flutter/…/widgets/will_pop_scope.dart:135
#3      StatefulElement.update
package:flutter/…/widgets/framework.dart:4682
#4      Element.updateChild
package:flutter/…/widgets/framework.dart:3293
#5      ComponentElement.performRebuild
package:flutter/…/widgets/framework.dart:4520
#6      StatefulElement.performRebuild
package:flutter/…/widgets/framework.dart:4667

登录界面

class LoginScreen extends StatelessWidget {
  final controller = Get.find<AuthController>();
  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
Form(
                    key: controller.formKey,
                    child: Column(
                      children: [
                        TextFormField(
                          controller: controller.phoneController,
                          keyboardType: TextInputType.phone,
                          style: TextStyles.black14,
                          decoration: InputDecoration(
                              hintText: 'Phone Number',
                              hintStyle: TextStyles.hintStyle14,),
                          validator: (value) {
                            print(value);
                            if (value.length != 10) {
                              return 'Invalid phone number';
                            }
                            return null;
                          },
                        ),
TextButton(
          onPressed: () {
            controller.login();
          },
          child: Text('Login'))
],
    );
  }
}

控制器

import 'package:app/routing/routes.dart';
import 'package:app/utilities/shared_prefs.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';

class AuthController extends GetxController {
  //Handling loading state
  bool loading = false;

  final formKey = GlobalKey<FormState>();

  login() async {
    if (!formKey.currentState.validate()) return;
    loading = true;
    update();

    //API CALL
  }

  //Sign out user
  signOut() async {
    SharedPrefs().clear();
    Get.offAllNamed(Routes.loginScreen);
  }
}

以下是流程: 登录界面 --> 主页面 --> 其他界面

从其他界面调用controller.signOut()会导致此错误。


请分享您的代码。 - Rakesh Lanjewar
已添加,请确认是否需要帮助。 - JC18
1
你好,您可以通过将表单密钥移动到登录页面来解决此问题。 - Rakesh Lanjewar
没错,我把formKey移到了登录页面并将其转换为StatefulWidget。现在它可以正常工作了。谢谢! - JC18
我猜你不需要一个有状态的小部件。请将我的答案标记为已接受。 - Rakesh Lanjewar
1个回答

4

如果尝试重置全局键,则会发生这种情况。

为解决此问题,您可以将GlobalKey和TextEditingController移到页面本身,而不是在控制器中声明它们。

class LoginScreen extends StatelessWidget {
  
   final formKey = GlobalKey<FormState>();

   TextEditingController phoneController = TextEditingController();


  final controller = Get.find<AuthController>();
  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
Form(
                    key:formKey,
                    child: Column(
                      children: [
                        TextFormField(
                          controller:phoneController,
                          keyboardType: TextInputType.phone,
                          style: TextStyles.black14,
                          decoration: InputDecoration(
                              hintText: 'Phone Number',
                              hintStyle: TextStyles.hintStyle14,),
                          validator: (value) {
                            print(value);
                            if (value.length != 10) {
                              return 'Invalid phone number';
                            }
                            return null;
                          },
                        ),
TextButton(
          onPressed: () {
           //Validate here
           if (!formKey.currentState!.validate()) return;
            controller.login();
          },
          child: Text('Login'))
],
    );
  }
}

有没有办法在控制器内保留formKey?我在那里有很多逻辑。 - djalmafreestyler
非常感谢,它起作用了。我只是在视图上实例化,所以我通过函数参数将其发送到控制器进行验证。 - Thierry P. Oliveira

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接