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