Как мне вернуть одну строку из потока запросов в реальном времени для анализа?

#flutter #dart #parse-platform

Вопрос:

Я использую живой запрос Parse для получения объекта с сервера. Наконец я обнаружил, что объект подписки-это поток.

Я хотел бы, чтобы в будущем меня ждало какое-то поведение. Я хочу, чтобы моя функция выдавала результат живого запроса. Как я могу добиться такого поведения?

 Future<String> isolateLiveQuery(String none) async {

  final LiveQuery liveQuery = LiveQuery();
  QueryBuilder<ParseObject> query = QueryBuilder<ParseObject>(ParseObject('Color'));
  Subscription subscription = await liveQuery.client.subscribe(query);

   subscription.on(LiveQueryEvent.create, (value) {
    // I want to yield value 
  });
}
 

ИЗМЕНИТЬ Добавление попытки вычисления:

Это работает не так, как задумывалось, в основном нет ожидания.

 Future<dynamic> isolateLiveQuery(String none) async {
  final LiveQuery liveQuery = LiveQuery();
  QueryBuilder<ParseObject> query = QueryBuilder<ParseObject>(ParseObject('Color'));
  Subscription subscription = await liveQuery.client.subscribe(query);
  final c = Completer<String>();
  
  subscription.on(LiveQueryEvent.create, (value) {
    String color;
    color = value['String'];
    c.complete(color);
  });
  return await c.future;
}
 

ИЗМЕНИТЬ: Добавление точного желаемого результата с помощью демонстрационного кода:

До сих пор этого, по-видимому, невозможно достичь с помощью подписки на живые запросы. У кого-нибудь есть идеи о том, как достичь нижеприведенного с помощью подписки на живые запросы?

   Future<double> getRandomValue() async {
  var random = Random(2);
  await Future.delayed(Duration(seconds: 2));
  return random.nextDouble();
  }

  print('one');                   // print instantly
  print(await getRandomValue());  // awaits for result
  print('two');                   // prints after result of last line
 

Комментарии:

1. если это a Stream , это может вызвать несколько значений, поэтому вы isolateLiveQuery тоже должны возвращать a Stream , а не a Future , или я что-то пропустил, и вы хотите сначала дать value , например

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

3. поэтому используйте, например, свойство Completer (или свойство Stream.first )

4. Попробовал вычислить(), либо я делаю что-то не так, либо это не работает… Я добавил код в правку

5. void main() async { print('one'); print(await foo()); print('two'); } Future<String> foo () { print('foo one'); final c = Completer<String>(); Future.delayed(Duration(seconds: 3), () => c.complete('foobar')); print('foo two'); return c.future; }