从Firestore获取数据并放入列表(颤振)

时间:2019-10-22 09:37:01

标签: flutter google-cloud-firestore

我已从Firestore数据库检索数据并将其放入列表,但发生错误。此外,异常块上的对话框根本不会触发。

class mDetail extends State<homeDetail>{
bool uniFlag = false;
var resultUni;
  @override
  void initState() {
    super.initState();
    try {
      UniQuery().getUniBasedLocProg(selectedState,selectedProg).then((QuerySnapshot qsUni) {
        uniFlag = true;
        for (int i = 0; i < qsUni.documents.length; i++) {
          resultUni.add(qsUni.documents[i]['name']);
        }
      });
    }
    catch(e){
      print(e.message);
      showDialog(
          context: context,
          builder: (BuildContext context) {
            return AlertDialog(
              title: Text('Ops something gone wrong'),
              content: Text('Your email or password is wrong'),
            );
          });
    }
  }

  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: AppBar(
        title: Text('EduGradHomePage'),),
      body: Form(
          child: Column(
            children: <Widget>[

              RaisedButton(
                onPressed: back,
                child: Icon(
                  Icons.backspace
                ),
              ),

              Text(resultUni[0])
            ],
          )
    )
    );
  }
}

此代码在其他软件包中具有独特性

class UniQuery {
  getUniBasedLocProg(String uniLoc, String uniProg){
    return dbReference.collection('University')
        .where('State', isEqualTo: uniLoc)
        .where('Programme', isEqualTo: uniProg)
        .getDocuments();
  }
}

它说错误NoSuchMethodError 方法'[]'被调用为null 好像值未添加到列表中

这是我在Firestore中的数据库

list Programme data

list University data

list State data

Error log

2 个答案:

答案 0 :(得分:1)

更改为以下代码后。我设法获得价值 idState idProg 是基于我的Firestore中收集文档的ID

 class UniQuery {
      getUniBasedLocProg(String uniLoc, String uniProg){
        return dbReference.collection('University')
            .where('State', isEqualTo: dbReference.collection('State')
            .document(idState);)
            .where('Programme', isEqualTo: dbReference.collection('Programme')
            .document(idProg);)
            .getDocuments();
      }
    }

答案 1 :(得分:0)

.getUniBasedLocProg(selectedState,selectedProg)是将来的回调,因此它返回数据    花费一些时间之后。在构建期间还会构建您的代码。    null,这就是为什么您会收到错误消息“方法'[]'在null上被调用”的原因。

因此在使用该变量之前,请先检查是否为空。

       resultUni[0] ?? "" // if not null then return value otherwise return "" //

完整代码->

   class mDetail extends State<homeDetail>{
   bool uniFlag = false;
   var resultUni;
    @override
    void initState() {
    super.initState();
try {
  UniQuery().getUniBasedLocProg(selectedState,selectedProg).then((QuerySnapshot qsUni) 
    {
    uniFlag = true;
    if(qsUni !=null&&qsUni.documents !=null ){
     for (int i = 0; i < qsUni.documents.length; i++) {

      if(qsUni.documents[i] !=null ){
      resultUni.add(qsUni.documents[i]['name']);
      }
    }
  }
  });
}
catch(e){
  print(e.message);
  showDialog(
      context: context,
      builder: (BuildContext context) {
        return AlertDialog(
          title: Text('Ops something gone wrong'),
          content: Text('Your email or password is wrong'),
        );
      });
   }
 }

Widget build(BuildContext context) {
  return new Scaffold(
   appBar: AppBar(
    title: Text('EduGradHomePage'),),
  body: Form(
      child: Column(
        children: <Widget>[

          RaisedButton(
            onPressed: back,
            child: Icon(
              Icons.backspace
            ),
          ),

          Text(resultUni[0] ?? ""),
        ],
      )
  )
 );
 }
 }