Firebase 未处理的异常:NoSuchMethodError:getter';uid';被调用为空
当用户登录时,我正在appBar中从firebase检索用户名称。我成功地检索到它。但当用户未登录时。“uid”为空时出现错误。我相信 错误在我的initUser()中。但我似乎无法修复它 E/flatter(16741):[ERROR:flatter/lib/ui/ui\u dart\u state.cc(166)]未处理的异常:NoSuchMethodError:对null调用了getter“uid”。 E/颤振(16741):接收器:空 E/flatter(16741):尝试呼叫:uidFirebase 未处理的异常:NoSuchMethodError:getter';uid';被调用为空,firebase,flutter,firebase-authentication,Firebase,Flutter,Firebase Authentication,当用户登录时,我正在appBar中从firebase检索用户名称。我成功地检索到它。但当用户未登录时。“uid”为空时出现错误。我相信 错误在我的initUser()中。但我似乎无法修复它 E/flatter(16741):[ERROR:flatter/lib/ui/ui\u dart\u state.cc(166)]未处理的异常:NoSuchMethodError:对null调用了getter“uid”。 E/颤振(16741):接收器:空 E/flatter(16741):尝试呼叫:uid
class MainScreen extends StatefulWidget {
final bool isAdmin;
const MainScreen({Key key, this.isAdmin}) : super(key: key);
@override
_MainScreenState createState() => _MainScreenState(this.isAdmin);
}
class _MainScreenState extends State<MainScreen> {
bool isPressed = false;
bool userLoggedIn =false;
//var _userName;
// Future<FirebaseUser> getUser() {
// return _auth.currentUser();
// }
Future<String> currentUser() async {
user = await _auth.currentUser();
return user != null ? user.uid : null;
}
FirebaseUser user;
@override
void initState() {
super.initState();
initUser();
}
String userid;
initUser() async {
user = await _auth.currentUser();
userid = user.uid;
setState(() {});
}
bool isAdmin = true;
final FirebaseAuth _auth = FirebaseAuth.instance;
//final authData = snapshot.data;
_MainScreenState(this.isAdmin);
@override
Widget build(BuildContext context) {
SystemChrome.setPreferredOrientations([
DeviceOrientation.portraitUp,
]);
CurrentUser _currentUser = Provider.of<CurrentUser>(context, listen: false);
return Scaffold(
//backgroundColor: Colors.grey,
resizeToAvoidBottomPadding: false,
appBar: AppBar(
flexibleSpace: Container(
decoration: BoxDecoration(
gradient: LinearGradient(
colors: [Colors.cyan, Colors.yellow], stops: [0.5, 1.0],
),
),
),
//title: Text('Property Host'),
centerTitle: true,
actions: <Widget>[
Expanded(
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: <Widget>[
//Image.asset('assets/index.jpg', fit: BoxFit.cover,height:16,width:16),
Container(
margin: new EdgeInsets.only(left: 50),
child: Text('Property Host',style: TextStyle(fontWeight: FontWeight.bold,fontSize: 19),)),
user!=null ? StreamBuilder(stream: Firestore.instance.collection('users').where("uid", isEqualTo: userid).snapshots(),
// ignore: missing_return
builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
if (snapshot.data == null)
return CircularProgressIndicator();
//final userDocument = snapshot.data;
//final title= snapshot.data.userocument['displayName']);
//CircularProgressIndicator();
return Expanded(
child: ListView.builder(
itemCount: snapshot.data.documents.length,
// ignore: missing_return
itemBuilder: (BuildContext context, int index) {
print(user.uid);
return user != null
? Container(
margin: EdgeInsets.only(top: 17, left: 40),
child: Text(
snapshot.data.documents.elementAt(index)['displayName']),
)
: IconButton(
icon: Icon(Icons.person),
// ignore: missing_return
onPressed: () {
Navigator.pushNamed(context, '/LoginScreen');
},
);
}
),
);
}
class主屏幕扩展StatefulWidget{
最后的布尔伊萨明;
const MainScreen({Key,this.isAdmin}):super(Key:Key);
@凌驾
_MainScreenState createState()=>\u MainScreenState(this.isAdmin);
}
类_MainScreenState扩展状态{
bool isPressed=false;
bool userLoggedIn=false;
//var\u用户名;
//未来的getUser(){
//返回_auth.currentUser();
// }
Future currentUser()异步{
user=wait_auth.currentUser();
返回用户!=null?user.uid:null;
}
FirebaseUser用户;
@凌驾
void initState(){
super.initState();
initUser();
}
字符串用户标识;
initUser()异步{
user=wait_auth.currentUser();
userid=user.uid;
setState((){});
}
bool-isAdmin=true;
final FirebaseAuth _auth=FirebaseAuth.instance;
//最终authData=snapshot.data;
_MainScreenState(this.isAdmin);
@凌驾
小部件构建(构建上下文){
SystemChrome.setPreferredOrientations([
DeviceOrientation.Up,
]);
CurrentUser\u CurrentUser=Provider.of(上下文,侦听:false);
返回脚手架(
//背景颜色:颜色。灰色,
resizeToAvoidBottomPadding:false,
appBar:appBar(
flexibleSpace:容器(
装饰:盒子装饰(
梯度:线性梯度(
颜色:[colors.cyan,colors.yellow],停止:[0.5,1.0],
),
),
),
//标题:文本(“属性主机”),
标题:对,
行动:[
扩大(
孩子:排(
mainAxisAlignment:mainAxisAlignment.spaceAround,
儿童:[
//Image.asset('assets/index.jpg',fit:BoxFit.cover,高16,宽16),
容器(
页边距:仅限新边集(左:50),
子项:文本('Property Host',样式:TextStyle(fontWeight:fontWeight.bold,fontSize:19)),
user!=null?StreamBuilder(流:Firestore.instance.collection('users')。其中(“uid”,isEqualTo:userid)。快照(),
//忽略:缺少返回
生成器:(BuildContext上下文,异步快照){
如果(snapshot.data==null)
返回循环ProgressIndicator();
//最终用户文档=snapshot.data;
//最终标题=snapshot.data.userocument['displayName'];
//循环前进指示器();
扩大回报(
子项:ListView.builder(
itemCount:snapshot.data.documents.length,
//忽略:缺少返回
itemBuilder:(构建上下文,int索引){
打印(user.uid);
返回用户!=null
?容器(
页边距:仅限边集(顶部:17,左侧:40),
子:文本(
snapshot.data.documents.elementAt(索引)['displayName']),在,
)
:图标按钮(
图标:图标(Icons.person),
//忽略:缺少返回
已按下:(){
pushNamed(上下文“/LoginScreen”);
},
);
}
),
);
}
当用户未登录时,wait\u auth.currentUser()
将返回null
。这意味着在user
上调用uid
(为null)将导致错误
您可以在if语句中围绕空检查进行包装
initUser()异步{
user=wait_auth.currentUser();
如果(用户!=null){
userid=user.uid;
}否则{
//用户不可用。请执行其他操作
}
setState((){});
}
答案在您的问题中:“但当用户未登录时,我得到的错误是'uid'为空。”