【发布时间】:2019-02-23 20:13:50
【问题描述】:
我几乎迷路了我已经为此工作了好几天,我有一个 Text() 小部件并在其中传递了一个变量,该变量包含来自 Firebase auth 的用户名。问题是我想检查用户是否登录。如果用户登录,我可以从 Firebase 完成用户名,但在未登录时它会崩溃我已经尝试使用共享首选项和 Firebase 当前用户,但它仍然无法正常工作。 我尝试过的:
class _HomePageState extends State<HomePage> {
String username = 'user name';
String userEmail = 'email address';
@override
void initState() {
super.initState();
getCurrentUserName().then((value) {
username = value;
});
getLanguage();
}
String language;
var refreshKey = GlobalKey<RefreshIndicatorState>();
Map data;
String news;
String signIn;
List<Tab> tabs;
ListView sideBarTabs;
Future<String> getCurrentUserName() {
return new Future<String>.delayed(new Duration(milliseconds: 10000),() async {
//Do a long running task. E.g. Network Call.
final FirebaseUser currentUser = await _auth.currentUser();
//assert(user.uid == currentUser.uid);
username = currentUser.displayName;
return username;
});
}
Future getLanguage() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
int lang = prefs.getInt('Language');
setState(() {
if (lang != 1) {
language = 'ku';
news = 'ههوا';
signIn = 'بچۆ ژوورهوه';
sideBarTabs = ListView(
children: <Widget>[
new UserAccountsDrawerHeader(
accountName: Text(username),
accountEmail: Text(userEmail),
currentAccountPicture: GestureDetector(
child: new CircleAvatar(
backgroundColor: Colors.black,
child: Icon(Icons.person),
),
),
decoration: new BoxDecoration(
color: Colors.pink,
),
),
InkWell(
onTap: () {
var route = new MaterialPageRoute(
builder: (BuildContext context) => new HomePage(),
);
Navigator.of(context).push(route);
},
child: ListTile(
title: Text(news),
leading: Icon(Icons.featured_play_list),
)),
InkWell(
onTap: () {
_SignInWithGoogle();
},
child: ListTile(
title: Text(signIn),
leading: Icon(Icons.person),
)),
],
);
} else{
language = 'ar';
news = 'أخبار';
signIn = 'تسجيل الدخول';
sideBarTabs = ListView(
children: <Widget>[
new UserAccountsDrawerHeader(
accountName: Text(username),
accountEmail: Text(userEmail),
currentAccountPicture: GestureDetector(
child: new CircleAvatar(
backgroundColor: Colors.black,
child: Icon(Icons.person),
),
),
decoration: new BoxDecoration(
color: Colors.pink,
),
),
InkWell(
onTap: () {
var route = new MaterialPageRoute(
builder: (BuildContext context) => new HomePage(),
);
Navigator.of(context).push(route);
},
child: ListTile(
title: Text(news),
leading: Icon(Icons.featured_play_list),
)),
InkWell(
onTap: () {
_SignInWithGoogle();
},
child: ListTile(
title: Text(signIn),
leading: Icon(Icons.person),
)),
],
);
}
});
}
Future<String> _SignInWithGoogle() async {
final GoogleSignInAccount googleUser = await _googleSignIn.signIn();
final GoogleSignInAuthentication googleAuth =
await googleUser.authentication;
final AuthCredential credential = GoogleAuthProvider.getCredential(
accessToken: googleAuth.accessToken,
idToken: googleAuth.idToken,
);
final FirebaseUser user = await _auth.signInWithCredential(credential);
assert(user.email != null);
assert(user.displayName != null);
assert(!user.isAnonymous);
assert(await user.getIdToken() != null);
final FirebaseUser currentUser = await _auth.currentUser();
assert(user.uid == currentUser.uid);
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setString('username', user.displayName);
prefs.setString('useremail', user.email);
//prefs.setString('IdToken', await user.getIdToken());
}
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: DefaultTabController(
length: 9,
child: Scaffold(
appBar: new AppBar(
bottom: TabBar(
labelColor: Colors.black,
isScrollable: true,
tabs: tabs,
),
iconTheme: new IconThemeData(color: Colors.black),
backgroundColor: Colors.white,
title: Text(
"App Name",
style: TextStyle(color: Colors.black),
),
),
drawer: new Drawer(
child: sideBarTabs,
),
并具有共享偏好:
class _HomePageState extends State<HomePage> {
String username = 'user name';
String userEmail = 'email address';
@override
void initState() {
super.initState();
getCurrentUserName().then((value) {
username = value;
});
getLanguage();
}
String language;
var refreshKey = GlobalKey<RefreshIndicatorState>();
Map data;
String news;
String signIn;
List<Tab> tabs;
ListView sideBarTabs;
Future<String> getCurrentUserName() {
return new Future<String>(() async{
//Do a long running task. E.g. Network Call.
SharedPreferences prefs = await SharedPreferences.getInstance();
username = prefs.getString('username');
return username;
});
}
Future getLanguage() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
int lang = prefs.getInt('Language');
setState(() {
if (lang != 1) {
language = 'ku';
news = 'ههوا';
signIn = 'بچۆ ژوورهوه';
sideBarTabs = ListView(
children: <Widget>[
new UserAccountsDrawerHeader(
accountName: Text(username),
accountEmail: Text(userEmail),
currentAccountPicture: GestureDetector(
child: new CircleAvatar(
backgroundColor: Colors.black,
child: Icon(Icons.person),
),
),
decoration: new BoxDecoration(
color: Colors.pink,
),
),
InkWell(
onTap: () {
var route = new MaterialPageRoute(
builder: (BuildContext context) => new HomePage(),
);
Navigator.of(context).push(route);
},
child: ListTile(
title: Text(news),
leading: Icon(Icons.featured_play_list),
)),
InkWell(
onTap: () {
_SignInWithGoogle();
},
child: ListTile(
title: Text(signIn),
leading: Icon(Icons.person),
)),
],
);
} else{
language = 'ar';
news = 'أخبار';
signIn = 'تسجيل الدخول';
sideBarTabs = ListView(
children: <Widget>[
new UserAccountsDrawerHeader(
accountName: Text(username),
accountEmail: Text(userEmail),
currentAccountPicture: GestureDetector(
child: new CircleAvatar(
backgroundColor: Colors.black,
child: Icon(Icons.person),
),
),
decoration: new BoxDecoration(
color: Colors.pink,
),
),
InkWell(
onTap: () {
var route = new MaterialPageRoute(
builder: (BuildContext context) => new HomePage(),
);
Navigator.of(context).push(route);
},
child: ListTile(
title: Text(news),
leading: Icon(Icons.featured_play_list),
)),
InkWell(
onTap: () {
_SignInWithGoogle();
},
child: ListTile(
title: Text(signIn),
leading: Icon(Icons.person),
)),
],
);
}
});
}
Future<String> _SignInWithGoogle() async {
final GoogleSignInAccount googleUser = await _googleSignIn.signIn();
final GoogleSignInAuthentication googleAuth =
await googleUser.authentication;
final AuthCredential credential = GoogleAuthProvider.getCredential(
accessToken: googleAuth.accessToken,
idToken: googleAuth.idToken,
);
final FirebaseUser user = await _auth.signInWithCredential(credential);
assert(user.email != null);
assert(user.displayName != null);
assert(!user.isAnonymous);
assert(await user.getIdToken() != null);
final FirebaseUser currentUser = await _auth.currentUser();
assert(user.uid == currentUser.uid);
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setString('username', user.displayName);
prefs.setString('useremail', user.email);
//prefs.setString('IdToken', await user.getIdToken());
}
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: DefaultTabController(
length: 9,
child: Scaffold(
appBar: new AppBar(
bottom: TabBar(
labelColor: Colors.black,
isScrollable: true,
tabs: tabs,
),
iconTheme: new IconThemeData(color: Colors.black),
backgroundColor: Colors.white,
title: Text(
"App Name",
style: TextStyle(color: Colors.black),
),
),
drawer: new Drawer(
child: sideBarTabs,
),
还有:
class _HomePageState extends State<HomePage> {
String username = 'user name';
String userEmail = 'email address';
@override
void initState() {
super.initState();
getCurrentUser();
getLanguage();
}
String language;
var refreshKey = GlobalKey<RefreshIndicatorState>();
Map data;
String news;
String signIn;
List<Tab> tabs;
ListView sideBarTabs;
Future<void> getCurrentUser() async{
SharedPreferences prefs = await SharedPreferences.getInstance();
setState(() {
if (_auth.currentUser() != null) {
username = prefs.getString('username');
userEmail = prefs.getString('useremail');
} else{
username = 'App name';
userEmail = 'test@app.com';
}
});
}
Future getLanguage() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
int lang = prefs.getInt('Language');
setState(() {
if (lang != 1) {
language = 'ku';
news = 'ههوا';
signIn = 'بچۆ ژوورهوه';
sideBarTabs = ListView(
children: <Widget>[
new UserAccountsDrawerHeader(
accountName: Text(username),
accountEmail: Text(userEmail),
currentAccountPicture: GestureDetector(
child: new CircleAvatar(
backgroundColor: Colors.black,
child: Icon(Icons.person),
),
),
decoration: new BoxDecoration(
color: Colors.pink,
),
),
InkWell(
onTap: () {
var route = new MaterialPageRoute(
builder: (BuildContext context) => new HomePage(),
);
Navigator.of(context).push(route);
},
child: ListTile(
title: Text(news),
leading: Icon(Icons.featured_play_list),
)),
InkWell(
onTap: () {
_SignInWithGoogle();
},
child: ListTile(
title: Text(signIn),
leading: Icon(Icons.person),
)),
],
);
} else{
language = 'ar';
news = 'أخبار';
signIn = 'تسجيل الدخول';
sideBarTabs = ListView(
children: <Widget>[
new UserAccountsDrawerHeader(
accountName: Text(username),
accountEmail: Text(userEmail),
currentAccountPicture: GestureDetector(
child: new CircleAvatar(
backgroundColor: Colors.black,
child: Icon(Icons.person),
),
),
decoration: new BoxDecoration(
color: Colors.pink,
),
),
InkWell(
onTap: () {
var route = new MaterialPageRoute(
builder: (BuildContext context) => new HomePage(),
);
Navigator.of(context).push(route);
},
child: ListTile(
title: Text(news),
leading: Icon(Icons.featured_play_list),
)),
InkWell(
onTap: () {
_SignInWithGoogle();
},
child: ListTile(
title: Text(signIn),
leading: Icon(Icons.person),
)),
],
);
}
});
}
Future<String> _SignInWithGoogle() async {
final GoogleSignInAccount googleUser = await _googleSignIn.signIn();
final GoogleSignInAuthentication googleAuth =
await googleUser.authentication;
final AuthCredential credential = GoogleAuthProvider.getCredential(
accessToken: googleAuth.accessToken,
idToken: googleAuth.idToken,
);
final FirebaseUser user = await _auth.signInWithCredential(credential);
assert(user.email != null);
assert(user.displayName != null);
assert(!user.isAnonymous);
assert(await user.getIdToken() != null);
final FirebaseUser currentUser = await _auth.currentUser();
assert(user.uid == currentUser.uid);
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setString('username', user.displayName);
prefs.setString('useremail', user.email);
//prefs.setString('IdToken', await user.getIdToken());
}
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: DefaultTabController(
length: 9,
child: Scaffold(
appBar: new AppBar(
bottom: TabBar(
labelColor: Colors.black,
isScrollable: true,
tabs: tabs,
),
iconTheme: new IconThemeData(color: Colors.black),
backgroundColor: Colors.white,
title: Text(
"App Name",
style: TextStyle(color: Colors.black),
),
),
drawer: new Drawer(
child: sideBarTabs,
),
我知道我的代码有点复杂,因为我的标签是动态的,这就是问题所在,但我需要它。问题是应用程序运行时的用户名变量,而应用程序名称即使用户登录与否,或者在我上面的一些代码中,当用户登录时显示名称或用户尚未登录,应用程序崩溃。
【问题讨论】:
标签: flutter firebase-authentication