У меня есть поток, создающий список из коллекции Firebase QuerySnapShot. Запрос и построитель потока работают отлично, если я не передаю переменные данные в запрос (оператор 'where'). Тем не менее, я пытаюсь передать FirebaseAuth.currentUser в качестве фильтра в предложении where моего Stream.
Я уверен, что есть кое-что, чего я не понимаю в выполнении этих двух отдельных асин c вызовов.
По сути, мне нужно получить идентификатор пользователя, прошедшего проверку подлинности, и передать его в запрос в моем потоке.
Я совершенно новичок во Flutter и быстро иду, чтобы получить свой отбивные. Полностью погружен примерно на неделю.
class Booking {
final DateTime startTime;
final DateTime endTime;
final String name;
final String bookingId;
final String truckID;
Booking({ this.bookingId, this.truckID, this.startTime, this.endTime, this.name });
}
// build the booking list from the QuerySnapShot
List<Booking> _bookingListFromSnapshot(QuerySnapshot snapshot) {
return snapshot.documents.map((doc) {
return Booking(
bookingId: doc.documentID ?? '',
name: doc.data['name'] ?? '',
startTime: doc.data['startTime'].toDate() ?? '',
endTime: doc.data['endTime'].toDate() ?? '',
truckID: doc.data['truckID']
);
}).toList();
}
//asynchronously get the uid of the currentuser from FirebaseAuth
Future<String> inputData() async {
final FirebaseUser _aUser = await FirebaseAuth.instance.currentUser();
final String _uid = _aUser.uid.toString();
return _uid;
}
Здесь я пытаюсь передать текущего пользователя в поток
//get user specific booking stream
Stream<List<Booking>> get bookings {
final _myUserId = inputData();
return bookingCollection
.where("truckID", isEqualTo: _myUserId) //Instance of 'Future<String>'...needs to be the uid of the current user.
.snapshots()
.map(_bookingListFromSnapshot);
}
// the widget consuming the list
class _BookingListState extends State<BookingList> {
@override
Widget build(BuildContext context) {
final bookings = Provider.of<List<Booking>>(context) ?? [];
return ListView.builder(
itemCount: bookings.length,
itemBuilder: (context,index){
return BookingTile(booking: bookings[index]);
},
);
}
}
РЕДАКТИРОВАТЬ, чтобы включить использование потока для обратной связи (после переноса потока в будущее, как предложено)
В моем файле home.dart я слушаю Stream<List<Booking>>>
, чтобы я мог составить список бронирования, которые отображаются на этой странице. В этом следующем блоке я теперь получаю ошибку, что не могу присвоить тип параметра Stream<List<Booking>>
типу аргумента Future<Stream<List<Booking>>>
. Компилятор предлагает изменить тип параметра или привести аргумент к <Stream<list<Booking>>
Полное сообщение компиляции
lib/screens/home/home.dart:38:32: Error: The argument type 'Future<Stream<List<Booking>>>' can't be assigned to the parameter type 'Stream<List<Booking>>'.
- 'Future' is from 'dart:async'.
- 'Stream' is from 'dart:async'.
- 'List' is from 'dart:core'.
- 'Booking' is from 'package:models/booking.dart' ('lib/models/booking.dart').
Try changing the type of the parameter, or casting the argument to 'Stream<List<Booking>>'.
value: DatabaseService().bookings,
home.dart
return StreamProvider<List<Booking>>.value(
value: DatabaseService().bookings,
child: Scaffold( ... ) //Scaffold
); //StreamProvider.value
Я попытался изменить либо параметр value
, либо аргумент DatabaseService().value
на предложенные типы ... и мне не удалось:)
измененный получатель заказов после того, как я изменил его на основе обратной связи
//get user specific booking stream
Future<Stream<List<Booking>>> get bookings async {
final _myUserId = await inputData();
print(_myUserId);
return bookingCollection
.where("truckID", isEqualTo: _myUserId) //here is where I want to pass the currentUser
.snapshots()
.map(_bookingListFromSnapshot);
}