Firebase 未处理的异常:NoSuchMethodError:getter';uid';被调用为空

Firebase 未处理的异常: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

当用户登录时,我正在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'为空。”