firebase - 不能在导航器中使用脚手架全局键的上下文
问题描述
我创建了一个简单的应用程序,它通过 firebase 进行身份验证。在登录屏幕中,如果username
并且password
正确,它将显示主屏幕。我Navigator.of(context)
用来导航到主页。在这里,context
我使用了Scaffold's
key context
。在登录页面中,我创建了两个按钮。一个用于登录,另一个用于导航到RegisterPage。对于两者,我都使用Scaffold's
key context
inNavigator
进行导航。但是从登录页面导航到注册页面工作正常,但从登录页面导航到主页不工作。它说Scaffold 键上下文为 null。如果我更改 Navigator.of(_scaffoldKeylogin.currentContext)
为Navigator.of(context)
导航器中的登录按钮,它将正常工作。为什么它不起作用Scaffold key
?
_scaffoldKeylogin
是我的脚手架钥匙。
[ERROR:flutter/lib/ui/ui_dart_state.cc(199)] Unhandled Exception: NoSuchMethodError: The method 'findAncestorStateOfType' was called on null. E/flutter ( 6114): Receiver: null E/flutter ( 6114): Tried calling: findAncestorStateOfType<NavigatorState>() E/flutter ( 6114): #0 Object.noSuchMethod (dart:core-patch/object_patch.dart:54:5) E/flutter ( 6114): #1 Navigator.of (package:flutter/src/widgets/navigator.dart:2727:40) E/flutter ( 6114): #2 _LoginState.build.<anonymous closure> (package:e_wallet/Interfaces/login.dart:135:51)
代码
import 'package:e_wallet/Interfaces/home.dart';
import 'package:e_wallet/Interfaces/register.dart';
import 'package:e_wallet/Services/services.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'loading.dart';
class Login extends StatefulWidget {
final Function toggleView;
Login({this.toggleView});
@override
_LoginState createState() => _LoginState();
}
class _LoginState extends State<Login> {
final FirebaseAuth _auth = FirebaseAuth.instance;
final _loginformkey = GlobalKey<FormState>();
final GlobalKey<ScaffoldState> _scaffoldKeylogin = GlobalKey<ScaffoldState>();
final _emailcontroller = TextEditingController();
final _passwordcontroller = TextEditingController();
bool _obscuretext = true;
bool _loading=false;
String _email;
String _password;
String _error = "";
void _togglePass() {
setState(() {
_obscuretext = !_obscuretext;
});
}
@override
Widget build(BuildContext context) {
return _loading?Loading():Scaffold(
key: _scaffoldKeylogin,
body: Center(
child: SingleChildScrollView(
child: Container(
margin: EdgeInsets.all(10),
padding: EdgeInsets.all(10.0),
child: Form(
key: _loginformkey,
child: Column(
children: [
Text(
"Login",
style: TextStyle(fontSize: 20),
),
TextFormField(
controller: _emailcontroller,
validator: (value) {
if (value.isEmpty) {
return "Email cannot be empty";
} else {
return null;
}
},
onSaved: (value) => _email = value,
decoration: InputDecoration(
labelText: "Email",
suffixIcon: Icon(Icons.email_outlined)),
),
TextFormField(
controller: _passwordcontroller,
validator: (value) {
if (value.isEmpty) {
return "Password cannot be empty";
} else {
return null;
}
},
onSaved: (value) => _password = value,
obscureText: _obscuretext,
decoration: InputDecoration(
labelText: "Password",
suffixIcon: IconButton(
icon: _obscuretext
? Icon(Icons.visibility_off)
: Icon(Icons.visibility),
onPressed: _togglePass,
color: Colors.black54,
),
),
),
Container(
padding: EdgeInsets.symmetric(horizontal: 40),
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
mainAxisSize: MainAxisSize.min,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
_error,
style: TextStyle(fontSize: 20, color: Colors.red),
),
],
),
Row(
children: [
Expanded(
child: TextButton(
onPressed: () {
_loginformkey.currentState.save();
if (_loginformkey.currentState
.validate()) {}
},
child: Text("Forgot Password")),
),
Expanded(
child: TextButton(
onPressed: () async {
_loginformkey.currentState.save();
if (_loginformkey.currentState.validate()) {
print("logging in");
try {
setState(() {
_loading=true;
});
print("login auth: : ${_auth}");
UserCredential result = await _auth
.signInWithEmailAndPassword(
email: _email,
password: _password);
print(
"loged in sucessfully, user : ${result.user.uid}");
Navigator.of(_scaffoldKeylogin.currentContext).pushReplacement(MaterialPageRoute(builder: (context)=>Home()));
} on FirebaseAuthException catch (e) {
if (e.code == 'user-not-found') {
print("user-not-found");
setState(() {
_error = 'user not found';
_loading=false;
});
} else if (e.code == 'wrong-password') {
print("wrong-password");
setState(() {
_error = 'wrong password';
_loading=false;
});
}else if(e.code == 'network-request-failed'){
print("error no internet");
print("${e.code}");
setState(() {
_error = 'error: no internet';
_loading=false;
});
}
}
}
},
child: Text("LogIn")),
),
],
),
Row(
children: [
Text("Haven't created an account yet?"),
Expanded(
child: TextButton(
onPressed: () {
// widget.toggleView();
//Navigator.of(context).pushNamed(AppRoutes.);
Navigator.of(_scaffoldKeylogin.currentContext).pushReplacement(MaterialPageRoute(builder: (context)=>Register()));
},
child: Text("Register")),
),
],
),
],
),
),
],
),
),
),
),
),
);
}
}