Flutter 使用Inkwell中的导航在生成期间调用setState()或markNeedsBuild()

Flutter 使用Inkwell中的导航在生成期间调用setState()或markNeedsBuild(),flutter,Flutter,我正在制作一个带有墨水池的登录页面,可以导航到忘记密码页面。 没有添加导航代码,它工作得很好。 一旦我输入了导航代码,就会出现一个错误“setState()或markNeedsBuild(),在生成过程中调用了它。”然后,下一页就会出现,但没有点击按钮 这是登录页面的开始: class LoginPage extends StatefulWidget { @override _LoginPageState createState() => _LoginPageState(); }

我正在制作一个带有墨水池的登录页面,可以导航到忘记密码页面。 没有添加导航代码,它工作得很好。 一旦我输入了导航代码,就会出现一个错误“setState()或markNeedsBuild(),在生成过程中调用了它。”然后,下一页就会出现,但没有点击按钮

这是登录页面的开始:

class LoginPage extends StatefulWidget {
 @override
 _LoginPageState createState() => _LoginPageState();
 }

class _LoginPageState extends State<LoginPage> {
 final GlobalKey<FormState> _formKey = GlobalKey<FormState>();

String email = "", password = "", passwordErrorText, emailErrorText;
 FocusNode emailFocus, passwordFocus;

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

emailFocus = FocusNode();
passwordFocus = FocusNode();
passwordErrorText = null;
emailErrorText = null;
emailFocus.addListener(() {
  if (!emailFocus.hasFocus) {
    if (!TextFieldValidator().emailValidator.isValid(email.toLowerCase())) {
      setState(() {
        emailErrorText = TextFieldValidator().emailValidator.errorText;
      });
    } else {
      setState(() {
        emailErrorText = null;
      });
    }
  }
   });
 }
这就是导航的功能

static goToForgetPassword(BuildContext context) {
Navigator.push(
    context,
    PageRouteBuilder(
      pageBuilder: (context, animation, secondaryAnimation) =>
          ForgetPasswordPage(),
      transitionsBuilder: (context, animation, secondaryAnimation, child) {
        return child;
      },
    ));

}问题很简单:您正在调用函数,您应该给出一个调用该函数的函数。所以这条线应该是:

              onTap: () => Router.goToForgetPassword(context),
早些时候,您调用了
gotofTargetPassword
,并向
onTap
提供它返回的任何内容(可能为空)。但是现在我们正在创建一个将来调用的函数,并将该函数赋给
onTap


如果您可以在函数中设置断点并进行调试,您自己也会看到这一点。

问题很简单:您正在调用函数,您应该给出一个调用该函数的函数。所以这条线应该是:

              onTap: () => Router.goToForgetPassword(context),
早些时候,您调用了
gotofTargetPassword
,并向
onTap
提供它返回的任何内容(可能为空)。但是现在我们正在创建一个将来调用的函数,并将该函数赋给
onTap

如果您可以在函数和调试中设置断点,您自己也会看到这一点。

替换

 Padding(
            padding: EdgeInsets.only(top: 20),
            child: InkWell(
              child: Text(
                forgetPassText,
                style: TextStyle(color: Colors.blue),
              ),
              onTap: Router.goToForgetPassword(context),
            ))
      ])),

在这种情况下,
InkWell
将等待单击,渲染时不会启动该功能。

替换

 Padding(
            padding: EdgeInsets.only(top: 20),
            child: InkWell(
              child: Text(
                forgetPassText,
                style: TextStyle(color: Colors.blue),
              ),
              onTap: Router.goToForgetPassword(context),
            ))
      ])),


在这种情况下,
InkWell
将等待单击,而不是在渲染时启动函数。

您没有关闭initState{}函数,您正在应用程序的初始化(构建)内部执行所有操作,这不是正确的方法:@override void initState(){super.initState();您没有关闭initState{}函数,而您正在应用程序的初始化(构建)内部执行所有操作,这不是正确的方法:@override void initState(){super.initState();