Я выполняю процесс входа в систему с ID и PW, используя Firebase с Flutter. Поэтому, хотя вход в систему работает нормально, меня раздражает тот факт, что я не могу войти в систему, а затем вернуться на страницу входа в систему, прежде чем я смогу войти снова. (Короче говоря, после выхода из системы невозможно снова войти в систему ...) В частности, даже если вы введете информацию для аутентификации и нажмете кнопку входа в систему, экран не будет go к homepage.dart.
Ошибка ниже.
I/flutter (10611): Error: NoSuchMethodError: The method 'signIn' was called on null.
I/flutter (10611): Receiver: null
I/flutter (10611): Tried calling: signIn("IDが表示されている", "<PWが表示されている>")
E/flutter (10611): [ERROR:flutter/lib/ui/ui_dart_state.cc(157)] Unhandled Exception: NoSuchMethodError: Class 'NoSuchMethodError' has no instance getter 'message'.
E/flutter (10611): Receiver: Instance of 'NoSuchMethodError'
E/flutter (10611): Tried calling: message
E/flutter (10611): #0 Object.noSuchMethod (dart:core-patch/object_patch.dart:53:5)
E/flutter (10611): #1 _LoginSignupPageState.validateAndSubmit.<anonymous closure> (package:flutter_app/login_signup_page.dart:78:29)
E/flutter (10611): #2 State.setState (package:flutter/src/widgets/framework.dart:1148:30)
E/flutter (10611): #3 _LoginSignupPageState.validateAndSubmit (package:flutter_app/login_signup_page.dart:76:9)
E/flutter (10611): #4 _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:706:14)
E/flutter (10611): #5 _InkResponseState.build.<anonymous closure> (package:flutter/src/material/ink_well.dart:789:36)
E/flutter (10611): #6 GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:182:24)
E/flutter (10611): #7 TapGestureRecognizer.handleTapUp (package:flutter/src/gestures/tap.dart:486:11)
E/flutter (10611): #8 BaseTapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:264:5)
E/flutter (10611): #9 BaseTapGestureRecognizer.acceptGesture (package:flutter/src/gestures/tap.dart:236:7)
E/flutter (10611): #10 GestureArenaManager.sweep (package:flutter/src/gestures/arena.dart:156:27)
E/flutter (10611): #11 GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:222:20)
E/flutter (10611): #12 GestureBinding.dispatchEvent (package:flutter/src/gestures/binding.dart:198:22)
E/flutter (10611): #13 GestureBinding._handlePointerEvent (package:flutter/src/gestures/binding.dart:156:7)
E/flutter (10611): #14 GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:102:7)
E/flutter (10611): #15 GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:86:7)
E/flutter (10611): #16 _rootRunUnary (dart:async/zone.dart:1138:13)
E/flutter (10611): #17 _CustomZone.runUnary (dart:async/zone.dart:1031:19)
E/flutter (10611): #18 _CustomZone.runUnaryGuarded (dart:async/zone.dart:933:7)
E/flutter (10611): #19 _invoke1 (dart:ui/hooks.dart:273:10)
E/flutter (10611): #20 _dispatchPointerDataPacket (dart:ui/hooks.dart:182:5)
Код ниже. В результате отладки, часть, помеченная знаком ★, оказалась подозрительной. Пожалуйста, научите меня, если вы обнаружите какие-либо ошибки и подозрительные коды. Особая благодарность!
void main() {
// 省略
}
class MyApp extends StatelessWidget {
Widget build(BuildContext context) {
return MaterialApp(
// 省略,
home: RootPage(auth: Auth()));
}
}
class RootPage extends StatefulWidget {
RootPage({this.auth});
//The auth instance unique?
final BaseAuth auth;
State<StatefulWidget> createState() => _RootPageState();
}
class _RootPageState extends State<RootPage> {
AuthStatus authStatus = AuthStatus.NOT_DETERMINED;
String _userId = "";
void initState() {
super.initState();
widget.auth.getCurrentUser().then((user) {
setState(() {
if (user != null) {
_userId = user?.uid;
}
authStatus =
user?.uid == null ? AuthStatus.NOT_LOGGED_IN : AuthStatus.LOGGED_IN;
});
});
}
void loginCallback() {
// 省略
}
//★Is this process properly called?
void logoutCallback() {
setState(() {
authStatus = AuthStatus.NOT_LOGGED_IN;
_userId = "";
});
}
Widget buildWaitingScreen() {
return Scaffold(
// 省略
);
}
Widget build(BuildContext context) {
switch (authStatus) {
case AuthStatus.NOT_DETERMINED:
return buildWaitingScreen();
break;
case AuthStatus.NOT_LOGGED_IN:
return LoginSignupPage(
auth: widget.auth,
loginCallback: loginCallback,
);
break;
case AuthStatus.LOGGED_IN:
if (_userId.length > 0 && _userId != null) {
return HomePage(
userId: _userId,
auth: widget.auth,
logoutCallback: logoutCallback,
);
} else
return buildWaitingScreen();
break;
default:
return buildWaitingScreen();
}
}
}
class LoginSignupPage extends StatefulWidget {
LoginSignupPage({this.auth, this.loginCallback});
final BaseAuth auth;
final VoidCallback loginCallback;
State<StatefulWidget> createState() => _LoginSignupPageState();
}
class _LoginSignupPageState extends State<LoginSignupPage> {
final _formKey = GlobalKey<FormState>();
String _groupId;
String _displayName;
String _email;
String _password;
String _errorMessage;
bool _isLoginForm;
bool _isLoading;
bool validateAndSave() {
final form = _formKey.currentState;
if (form.validate()) {
form.save();
return true;
}
return false;
}
void validateAndSubmit() async {
setState(() {
_errorMessage = "";
_isLoading = true;
});
if (validateAndSave()) {
String userId = "";
try {
if (_isLoginForm) {
//★It looks this try statement is causing an error
userId = await widget.auth.signIn(_email, _password);
} else {
userId = await widget.auth.signUp(_email, _password);
Firestore.instance.collection('users').document(userId).setData({
// 省略
});
widget.auth.sendEmailVerification();
_showVerifyEmailSentDialog();
}
setState(() {
_isLoading = false;
});
if (userId.length > 0 && userId != null && _isLoginForm) {
widget.loginCallback();
}
} catch (e) {
//★Is it because e is null here?
setState(() {
_isLoading = false;
_errorMessage = e.message;
_formKey.currentState.reset();
});
}
}
}
@override
void initState() {
_errorMessage = "";
_isLoading = false;
_isLoginForm = true;
super.initState();
}
void resetForm() {
// 省略
}
void toggleFormMode() {
// 省略
}
Widget build(BuildContext context) {
return Scaffold(
// 省略
);
}
// 省略
}
class HomePage extends StatelessWidget {
HomePage(
{Key key, this.auth, this.onSignedOut, this.userId, this.logoutCallback})
: super(key: key);
final BaseAuth auth;
final VoidCallback onSignedOut;
final VoidCallback logoutCallback;
final String userId;
Widget build(BuildContext context) {
return MaterialApp(
home: MyHomePage(
title: 'title',
auth: this.auth,
onSignedOut: this.onSignedOut,
logoutCallback: this.logoutCallback,
userId: this.userId),
routes: <String, WidgetBuilder>{
'/login_signup': (BuildContext context) => LoginSignupPage(),
});
}
}
class MyHomePage extends StatefulWidget {
MyHomePage(
{Key key,
this.title,
this.auth,
this.onSignedOut,
this.logoutCallback,
this.userId})
: super(key: key);
final String title;
final BaseAuth auth;
final VoidCallback logoutCallback;
final String userId;
final VoidCallback onSignedOut;
_MyHomePageState createState() => _MyHomePageState(
auth: this.auth, onSignedOut: this.onSignedOut, userId: this.userId);
}
class _MyHomePageState extends State<MyHomePage> {
FirebaseUser user;
final BaseAuth auth;
final logoutCallback;
final VoidCallback onSignedOut;
_MyHomePageState(
{this.auth, this.onSignedOut, this.logoutCallback, this.userId});
void initState() {
super.initState();
initUser() async {
setState(() {});
}
final String userId;
String displayName = '名無し';
Widget build(BuildContext context) {
Firestore.instance
.collection('users')
.document(userId)
.get()
.then((onValue) {
displayName = onValue.data['displayName'].toString();
});
return Scaffold(
appBar: Header(),
body: Column(
children: <Widget>[
Expanded(
flex: 0,
child: Row(
children: <Widget>[
// 省略
Expanded(
flex: 1,
child: FlatButton(
// 省略
onPressed: () async {
try {
//★Can't call logoutCallback?
await widget.auth.signOut();
widget.logoutCallback;
} catch (e) {
}
//★Suspicious
Navigator.of(context)
.pushReplacementNamed('/login_signup');
},
),
)
],
),
),
// 省略
],
),
);
}
}