flutter - Flutter:在身份验证错误时未显示 SnackBar
问题描述
当登录和注册 FirebaseAuth 期间发生错误时,我正在尝试显示一个snackBar。我的snackBar 没有显示。我只看到终端上打印的错误消息。请帮忙,我不确定我做错了什么。我好像错过了什么……
我已经尝试了一切,仍然没有运气
认证屏幕
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_svg/svg.dart';
import '../widgets/auth/auth_form.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
class AuthScreen extends StatefulWidget {
const AuthScreen({Key? key}) : super(key: key);
static const routeName = '/auth_screen';
@override
_AuthScreenState createState() => _AuthScreenState();
}
class _AuthScreenState extends State<AuthScreen> {
final _auth = FirebaseAuth.instance;
var _isLoading = false;
void _submitAuthForm(
String email,
String password,
String displayName,
String phoneNumber,
bool isLogin,
BuildContext ctx,
) async {
UserCredential authResult;
try {
setState(() {
_isLoading = true;
});
if (isLogin) {
authResult = await _auth.signInWithEmailAndPassword(
email: email,
password: password,
);
} else {
authResult = await _auth.createUserWithEmailAndPassword(
email: email, password: password);
await FirebaseFirestore.instance
.collection('userProfile')
.doc(authResult.user!.uid)
.set(
{
'displayName': displayName,
'email': email,
'phoneNumber': phoneNumber,
'uid': authResult.user!.uid,
},
);
}
} on PlatformException catch (err) {
var message = 'An error occured. Please check your credentials.';
if (err.message != null) {
message = err.message!;
}
ScaffoldMessenger.of(ctx).showSnackBar(
SnackBar(
content: Text(message),
backgroundColor: Theme.of(ctx).errorColor,
),
);
setState(() {
_isLoading = false;
});
} catch (err) {
print(err);
setState(() {
_isLoading = false;
});
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Container(
margin: const EdgeInsets.only(top: 25.0),
padding: const EdgeInsets.all(35.0),
child: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(
height: MediaQuery.of(context).size.height * 0.3,
child: SvgPicture.asset('images/login.svg'),
),
const SizedBox(
height: 20.0,
),
const SizedBox(
height: 10.0,
),
AuthForm(
_submitAuthForm,
_isLoading,
)
],
),
),
),
);
}
}
解决方案
您打印的错误不是PlatformException
.
} on PlatformException catch (err) {
var message = 'An error occured. Please check your credentials.';
if (err.message != null) {
message = err.message!;
}
ScaffoldMessenger.of(ctx).showSnackBar(
SnackBar(
content: Text(message),
backgroundColor: Theme.of(ctx).errorColor,
),
);
setState(() {
_isLoading = false;
});
} catch (err) {
print(err);
// Missing snackbar
ScaffoldMessenger.of(ctx).showSnackBar(
SnackBar(
content: Text('$err'), // Change to something to show a meaningful error message
backgroundColor: Theme.of(ctx).errorColor,
),
);
setState(() {
_isLoading = false;
});
}
推荐阅读
- image-processing - 用于快速/短事件运动检测的传感器解决方案
- javascript - 将按钮“选择文件”文本更改为文件名
- python - numpy数组的numpy缩放特定值
- java - 如何访问联系人
- slurm - 将 slurm 数组任务限制在单个节点中
- apache-spark - Spark JDBC 并行性
- xshell - 如何在 Xshell 中使用其他热键而不是 Ctrl+C?
- android - CNContactPickerViewController 和 Android Contact Picker - 切换到单个或多个联系人
- android - 从 Android 中的单独应用程序以编程方式将呼叫屏幕置于最前面
- c - 以非常低的优先级运行线程