【发布时间】:2022-01-20 16:01:54
【问题描述】:
我有一个管理员登录页面,管理员可以在其中添加 ID 和密码以访问管理区域。 Firebase 数据库中有一个管理员集合,用于存储 ID 和密码。管理员集合与用户登录页面分开,并且与在允许访问之前使用 Firebase 身份验证的用户集合分开。用户访问继续正常工作。当我填写管理员登录屏幕上的两个输入框并单击按钮以获取访问权限时,我的错误对话框消息出现,表明即使有数据,两个输入字段中也没有任何数据。如果我对代码什么都不做,然后热重载并再次单击该按钮,我可以访问管理员,但我在控制台中收到以下错误消息。
在构建 ShoppingAdminSignInPage(脏,依赖项:[_LocalizationsScope-[GlobalKey#2c797]],状态:_ShoppingAdminSignInPageState#e3b3d)时引发了以下 _TypeError: 'Null' 类型不是 '() => void' 类型的子类型
我显然在我的代码中写错了一些或几件事。似乎错误出现在 ShoppingAdminSignInButton 中。提前感谢您的帮助。
class ShoppingAdminSignInPage extends StatefulWidget {
const ShoppingAdminSignInPage({Key? key}) : super(key: key);
@override
State<ShoppingAdminSignInPage> createState() =>
_ShoppingAdminSignInPageState();
}
class _ShoppingAdminSignInPageState extends State<ShoppingAdminSignInPage> {
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final TextEditingController _adminIDController = TextEditingController();
final TextEditingController _passwordController = TextEditingController();
@override
Widget build(BuildContext context) {
return AdaptiveLayoutScaffold(
appBar: const ShoppingAdminSignInPageAppBar(),
landscapeBodyWidget: Container(),
portraitBodyWidget: SingleChildScrollView(
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 16.0),
child: Column(
mainAxisSize: MainAxisSize.max,
children: [
const ShoppingAdminSignInHeader(),
Form(
key: _formKey,
child: Column(
children: [
const SizedBox(
height: 50.0,
),
AdminSignInTextField(
controller: _adminIDController,
labelText: TextFieldLabel.adminID,
prefixIcon: Icons.person,
textInputAction: TextInputAction.next,
),
AdminSignInTextField(
controller: _passwordController,
labelText: TextFieldLabel.password,
prefixIcon: Icons.password,
textInputAction: TextInputAction.done,
),
ShoppingAdminSignInButton(
onPressed: _adminIDController.text.isNotEmpty &&
_passwordController.text.isNotEmpty
? logInAdmin()
: () => showDialog(
context: context,
builder: (ctx) {
return const ErrorAlertDialog(
message: DialogString.addAdminIDAndPassword,
);
}),
),
const NotAnAdminButton(),
],
),
),
],
),
),
),
);
}
logInAdmin() {
FirebaseFirestore.instance.collection('admins').get().then((snapshot) {
snapshot.docs.forEach((result) {
if (result.data()['id'] != _adminIDController.text.trim()) {
SnackBarUtil.showSnackBar(
context,
SnackBarString.idNotCorrect,
);
} else if (result.data()['password'] !=
_passwordController.text.trim()) {
SnackBarUtil.showSnackBar(
context,
SnackBarString.passwordNotCorrect,
);
} else {
SnackBarUtil.showSnackBar(
context,
'Welcome ${result.data()['name']}',
);
setState(() {
_adminIDController.text = '';
_passwordController.text = '';
});
Navigator.pushReplacement(
context,
MaterialPageRoute(
builder: (context) => const UploadItemsPage(),
),
);
}
});
});
}
}
【问题讨论】:
标签: firebase flutter dart google-cloud-firestore flutter-layout