訪問currentUser數據在我的應用程序,我有一個UserAccountsDrawerHeader,我通過簡單地從獲得x屬性FirebaseAuth.instance.currentUser.x在firebase_auth插件版本0.2.0
養活它的屬性抽屜在最新的firebase_auth 0.2.0版本中,其中currentUser()是異步的。
我一直在嘗試幾個小時來存儲當前登錄的用戶的信息,還沒有達到正確的方式來做到這一點。
我明白,我可以像下面這樣訪問他們:
Future<String> _getCurrentUserName() async {
FirebaseUser user = await FirebaseAuth.instance.currentUser();
return user.displayName;
}
...
new UserAccountsDrawerHeader(accountName: new Text(_getCurrentUserName()))
我明白這些代碼片段會給類型不匹配,但我只是想來說明我正在嘗試做什麼。
我究竟錯過了什麼,阻止了我達成解決方案?
更新
class _MyTabsState extends State<MyTabs> with TickerProviderStateMixin {
TabController controller;
Pages _page;
String _currentUserName;
String _currentUserEmail;
String _currentUserPhoto;
@override
void initState() {
super.initState();
_states();
controller = new TabController(length: 5, vsync: this);
controller.addListener(_select);
_page = pages[0];
}
我的方法
我只是加上我先前實施的TabBar狀態AUTH狀態
_states() async{
var user = await FirebaseAuth.instance.currentUser();
var name = user.displayName;
var email = user.email;
var photoUrl = user.photoUrl;
setState(() {
this._currentUserName=name;
this._currentUserEmail=email;
this._currentUserPhoto=photoUrl;
_page = pages[controller.index];
});
}
我的抽屜裏
drawer: new Drawer(
child: new ListView(
children: <Widget>[
new UserAccountsDrawerHeader(accountName: new Text(_currentUserName) ,
accountEmail: new Text (_currentUserEmail),
currentAccountPicture: new CircleAvatar(
backgroundImage: new NetworkImage(_currentUserPhoto),
),
這裏是例外我從調試控制檯
I/flutter (14926): ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
I/flutter (14926): The following assertion was thrown building MyTabs(dirty, state: _MyTabsState#f49aa(tickers:
I/flutter (14926): tracking 1 ticker)):
I/flutter (14926): 'package:flutter/src/widgets/text.dart': Failed assertion: line 207 pos 15: 'data != null': is not
I/flutter (14926): true.
I/flutter (14926): Either the assertion indicates an error in the framework itself, or we should provide substantially
更新得到2:
我這是怎麼修改的谷歌標誌的功能從火力點的例子:
Future <FirebaseUser> _testSignInWithGoogle() async {
final GoogleSignInAccount googleUser = await _googleSignIn.signIn();
final GoogleSignInAuthentication googleAuth =
await googleUser.authentication;
//checking if there is a current user
var check = await FirebaseAuth.instance.currentUser();
if (check!=null){
final FirebaseUser user = check;
return user;
}
else{
final FirebaseUser user = await _auth.signInWithGoogle(
accessToken: googleAuth.accessToken,
idToken: googleAuth.idToken,
);
assert(user.email != null);
assert(user.displayName != null);
assert(!user.isAnonymous);
assert(await user.getToken() != null);
return user;
}
}
更新3:
我的主要功能
void main() {
runApp(
new MaterialApp(
home: new SignIn(),
routes: <String, WidgetBuilder>{
"/SignUp":(BuildContext context)=> new SignUp(),
"/Login": (BuildContext context)=> new SignIn(),
"/MyTabs": (BuildContext context)=> new MyTabs()},
));
}
然後我簽到包含一個谷歌按鈕按下時:
onPressed:() { _testSignInWithGoogle(). //async returns FirebaseUser
whenComplete(()=>Navigator.of(context).pushNamed("/MyTabs")
);
}
和更新1的抽屜包括MyTabs內建立。
我已經使用statefulwidget與狀態,是正確的在同一個類來創建用於多種方法多種狀態?或者我應該只更新現有的狀態?我也嘗試在一個單獨的課堂上構建我的抽屜。這三個選項實際上工作正常,但在調試控制檯上有一些錯誤,但首先我想了解如果您有多個狀態,哪個是正確的方法? – aziza
顫振是關於構圖。如果你有一些與認證相同的東西,你可以考慮將該部分拆分成有狀態的小部件。 類似於:Root> ...> MyAuth> ...> SomethingThatNeedAuth。 然後實現一個靜態方法MyAuth.of(BuildContext)=> _MyAuthState。你應該很好。 – Darky
我不確定我是否理解創建靜態方法的部分。 – aziza