Передача текущего пользователя Firebase (как Future) в качестве параметра в запрос в потоке. Это возможно или есть другой способ? - PullRequest
1 голос
/ 16 января 2020

У меня есть поток, создающий список из коллекции 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);
      }

1 Ответ

1 голос
/ 16 января 2020

Да, вы можете использовать и ожидать фьючерсы только внутри функции asyn c. Поэтому сначала измените ваш получатель заказов следующим образом.

//get user specific booking stream
  Future<Stream<List<Booking>>> get bookings {
    final _myUserId = await inputData();  
    return bookingCollection
        .where("truckID", isEqualTo: _myUserId) //Instance of 'Future<String>'...needs to be the uid of the current user.
        .snapshots()
        .map(_bookingListFromSnapshot);
      }

Итак, если вы предоставляете этот поток, вам нужно предоставить Future, тогда только вы можете получить поток из Future.

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