#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
тоже должны возвращать aStream
, а не aFuture
, или я что-то пропустил, и вы хотите сначала дать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; }