FLUTTER FIRESTORE - запросить поле и получить идентификатор документа и проверить другое поле - PullRequest
0 голосов
/ 27 февраля 2020

пытаюсь получить искомое значение (идентификатор пользователя), которое находится в поле документа в firestore. Я хочу проверить другие поля (статус) документа. Я пробовал этот метод, но не смог

handlesubmit(BuildContext context)async{

final QuerySnapshot searcheduserid=
               await Firestore.instance.collection('users')
            .where('userid',isEqualTo: userid).limit(1).getDocuments();

final userdocid=searcheduserid.documents.map((doc)=>doc.documentID);

final DocumentSnapshot getuserdoc= await Firestore.instance.collection('users')
                      .document(userdocid).get();

final userstatus = getuserdoc.data['status'];
//  I GET AN ERROR HERE ERROR SAYS

// METHOD [](status) was called on null

    if(userstatus==null){
        return showdialog( context,'the entered user id status does not exist');
    }
}

1 Ответ

0 голосов
/ 27 февраля 2020

Вы, вероятно, скопировали более старую версию своего кода, потому что маловероятно, что ваш код компилирует следующую строку вашей программы:

final DocumentSnapshot getuserdoc= await Firestore
    .instance
    .collection('users')
    .document(userdocid).get();

Сообщение об ошибке в моей системе:

Тип аргумента 'Iterable<String>' нельзя назначить типу параметра 'String'.

Это означает, что userdocid является Iterable типа String (Iterable<String>), но ожидается параметр типа String.

У вас есть несколько вариантов решения проблемы, но я предлагаю следующее: Поскольку вы ожидаете только один документ из вашего QuerySnapshot, достаточно просто посмотреть на первый документ.

final QuerySnapshot searchedUserId = await Firestore.instance
    .collection('users')
    .where('userid', isEqualTo: userid)
    .limit(1)
    .getDocuments();
// if it is possible that searchedUserId returns no document make sure to 
// check whether searchedUserId.documents.length > 0, 
// otherwise searchedUserId.documents.first will throw an error
DocumentSnapshot document = searchedUserId.documents.first;
final userDocId = document.documentID;
final DocumentSnapshot getuserdoc =
    await Firestore.instance.collection('users').document(userDocId).get();

Улучшенное решение:

Однако я считаю, что ваш код в любом случае немного избыточен, потому что вы ищете поле документа с таким же значением в качестве идентификатора документа. Вы можете сократить весь код до

final DocumentSnapshot getuserdoc =
        await Firestore.instance.collection('users').document(userid).get();

Ошибка вызова getuserdoc.data['status']

Если вы получите сообщение об ошибке, похожее на

[](status) был вызван на ноль

Тогда это означает, что getuserdoc не имеет значения. Вероятно, это связано с тем, что в базе данных нет такой записи с данным идентификатором. Проверьте, есть ли идентификатор в вашей базе данных, в противном случае прокомментируйте ниже дополнительную информацию, потому что предоставленный код имел ошибки компиляции и не запускается вообще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...