как я могу показать DeliveryBoys в определенном месте, в моей базе данных в реальном времени у меня есть значение, которое мне нужно для сравнения водителей, с которым является «Город». Я хотел бы иметь всех DeliveryBoys, которые находятся в определенном городе. Как мне это сделать? Использование флаттера
Я могу получить все драйверы только без условного оператора
** Это моя функция, которую я хочу изменить **
retrieveOnlineDriversInformation(List onlineNearestDriversList) async {
DatabaseReference ref =
FirebaseDatabase.instance.ref().child("DeliveryBoys");
for (int i = 0; i < onlineNearestDriversList.length; i++) {
await ref
.child(onlineNearestDriversList[i].driverId.toString())
.once()
.then((dataSnapshot) {
var driverKeyInfo = dataSnapshot.snapshot.value;
dList.add(driverKeyInfo);
});
}
}
@Manish Dayma Как я могу сделать это из предоставленного примера кода, который застрял?
Можете ли вы показать представление вашей структуры базы данных.
@GrahamD обновлен, пожалуйста, нажмите на структуру базы данных
@GrahamD я заменил DeliveryBoy на драйверы.
Пожалуйста, покажите, как вы заполняете список onlineNearestDriversList
и что он содержит.
Привет @GrahamD "onlineNearestDriversList" использовался в функции только для цикла for
Судя по вашим ответам и насколько я вижу, вам не нужна петля там, где она у вас есть. Поэтому я собираюсь проигнорировать его и просто показать вам код, который вернет список идентификаторов водителей всех drivers
для city
«Лусака».
Future<List<String>> retrieveOnlineDriversInformation() async {
final driverIds = <String>[];
DatabaseReference ref = FirebaseDatabase.instance.ref().child("drivers");
try {
await ref.orderByChild("city")
.equalTo("Lusaka")
.once()
.then(
(event) {
if (event.snapshot.value != null) {
final driverListData =
Map<String, dynamic>.from(event.snapshot.value! as Map);
driverListData.forEach((key, value) {
driverIds.add(key);
});
}
},
} on FirebaseException catch (error, stackTrace) {
// < Some code here to print database error details or otherwise deal with it >
} catch (error, stackTrace) {
// < Some code here to print other error details or otherwise deal with it >
}
return driverIds;
}
Вместо этого вы можете изменить это, чтобы просто вернуть карту 'driverListData', которая содержит идентификатор каждого водителя и связанные данные водителя.
Еще пара моментов:
Вы не придерживаетесь стандартного соглашения об именах для имен узлов и полей базы данных. Я предлагаю вам всегда использовать нижний CamelCase в качестве стандарта (например, изменить DriverLicense
на driverLicense
), поскольку он будет соответствовать тому, что вы обычно называете переменными в коде Flutter/Dart.
Вам не нужно держать драйвер id
в виде отдельного поля в узле driver
. Это дубликат (и, следовательно, занимает место в базе данных) ключа записи driver
, который уже доступен вам.
Как видите, вы всегда должны заключать логику вызова базы данных в предложения try/catch, чтобы обрабатывать любые ошибки, которые может вернуть вызов базы данных. Существуют определенные исключения, которые можно проверить с помощью предложения on
.
Большое спасибо за ваш совет, очень надеюсь, что никогда не думал, что в этих областях обязательно что-то изменится.
вы не можете запросить базу данных в реальном времени. вы должны фильтровать онлайн-пользователей по результату локально.