Flutter AuthForm组件位置参数过多报错如何修复
错误原因
你遇到的位置参数过多报错,和参数类型是否显式声明无关,核心问题是代码括号嵌套错误:
TextFormField组件的构造函数没有定义位置参数,所有配置项都需要传入命名参数- 编写代码时,你将邮箱输入框、密码输入框两个组件,错误写在了用户名输入框
TextFormField的构造参数列表内部,相当于给组件传了不被接受的位置参数,因此触发报错。你看到两次相同报错,就是因为邮箱、密码两个输入框都被错误识别为上一级组件的非法位置参数,修正嵌套关系后报错会直接消失。
修复步骤
- 调整括号闭合位置,让用户名、邮箱、密码三个
TextFormField成为Column的children列表下的平级组件,不存在互相嵌套的关系 - 保留原有逻辑:注册模式(
isLoginPage = false)时显示用户名输入框,登录模式时隐藏用户名输入框,邮箱、密码输入框始终展示。
修复后完整代码
import 'package:flutter/material.dart'; import 'package:google_fonts/google_fonts.dart'; class AuthForm extends StatefulWidget { const AuthForm({Key? key}) : super(key: key); @override State<AuthForm> createState() => _AuthFormState(); } class _AuthFormState extends State<AuthForm> { final _formkey = GlobalKey<FormState>(); var _email = ''; var _password = ''; var _username = ''; bool isLoginPage = false; @override Widget build(BuildContext context) { return Container( height: MediaQuery.of(context).size.height, width: MediaQuery.of(context).size.width, child: ListView( children: [ Container( padding: const EdgeInsets.only(left: 10, right: 10, top: 10), child: Form( key: _formkey, child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ if (!isLoginPage) TextFormField( keyboardType: TextInputType.text, key: const ValueKey('username'), validator: (value) { if (value!.isEmpty) { return 'Incorrect Username'; } return null; }, onSaved: (value) { _username = value.toString(); }, decoration: InputDecoration( border: OutlineInputBorder( borderRadius: BorderRadius.circular(8.0), borderSide: const BorderSide()), labelText: "Enter Username", labelStyle: GoogleFonts.roboto()), ), TextFormField( keyboardType: TextInputType.emailAddress, key: const ValueKey('email'), validator: (value) { if (value!.isEmpty || !value.contains('@')) { return 'Incorrect Email'; } return null; }, onSaved: (value) { _email = value.toString(); }, decoration: InputDecoration( border: OutlineInputBorder( borderRadius: BorderRadius.circular(8.0), borderSide: const BorderSide()), labelText: "Enter Email", labelStyle: GoogleFonts.roboto()), ), TextFormField( obscureText: true, keyboardType: TextInputType.visiblePassword, key: const ValueKey('password'), validator: (value) { if (value!.isEmpty) { return 'Incorrect Password'; } return null; }, onSaved: (value) { _password = value.toString(); }, decoration: InputDecoration( border: OutlineInputBorder( borderRadius: BorderRadius.circular(8.0), borderSide: const BorderSide()), labelText: "Enter Password", labelStyle: GoogleFonts.roboto()), ), ], ), )) ], )); } }
额外优化:修正了原代码中用户名输入框、密码输入框的keyboardType配置错误,用户名不需要用邮箱键盘,密码不需要用邮箱键盘,对应调整为更合理的输入类型。
内容的提问来源于stack exchange,提问作者Tarushi
相关产品推荐
相关产品推荐

