访问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