Что именно означает снимок в Futurebuilder во Flutter?

Я не уверен, правильно ли я понял моментальный снимок во Flutter. Поэтому я хотел бы спросить вас, ребята, согласны ли вы с моим мнением о моментальном снимке или нет.

Скажем, у меня есть FutureBuilder ниже:

 FutureBuilder(
     future: someFutureFunction(),
     builder: (context, snapshot) {
     if (snapshot.connectionState == ConnectionState.waiting)
         return Center(child: CircularProgressIndicator());
     else
         return Text(counter.toString());
}),

Например, someFutureFunction() возвращает Future<String>... Требуется ли snapshot внутри обратного вызова в FutureBuilder(builder: (context, snapshot){} для доступа к возвращаемому значению (Future<String>) someFutureFunction() ??

Я просто хочу убедиться, что я правильно понял, прежде чем сохранять неверную информацию в своем уме :)

Спасибо


person Ayrix    schedule 11.05.2021    source источник


Ответы (3)


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

person Ardeshir ojan    schedule 11.05.2021
comment
Спасибо за ваш ответ. Значит, мое предположение о моментальном снимке (описанное выше) верно? - person Ayrix; 11.05.2021
comment
Да, это правильно - person Ardeshir ojan; 11.05.2021

Снимок — это оболочка для ваших данных с некоторыми полезными свойствами. Он предоставляет состояние вашего соединения, так что вы можете определить и обновить свое представление в соответствии с изменениями состояния. Вы можете понять это лучше, если будете использовать его для любого сетевого вызова. ConnectionStates может быть любым из перечисленных ниже.

активно

Connected to an active asynchronous computation.
For example, a Stream that has returned at least one value, but is not yet done.

готово

Connected to a terminated asynchronous computation.

нет

Not currently connected to any asynchronous computation.
For example, a FutureBuilder whose FutureBuilder.future is null.

ожидание

Connected to an asynchronous computation and awaiting interaction.

Кроме того, вы можете получить любую ошибку, которая может возникнуть при получении данных.

Вот лучший пример FutureBuilder, который обрабатывает некоторые другие случаи...

FutureBuilder<String>(
     future: someFutureFunction(),
     builder: (BuildContext context, AsyncSnapshot<String> snapshot) {
     if (snapshot.connectionState == ConnectionState.waiting)
         return Center(child: CircularProgressIndicator());
     else if (snapshot.hasData)
         return Text(snapshot.data);
     else if (snapshot.hasError)
         return Text('Error occured!');

})

вы можете найти больше о моментальных снимках здесь https://api.flutter.dev/flutter/widgets/AsyncSnapshot-class.html

person towhid    schedule 11.05.2021
comment
Я действительно знал пункты, которые вы перечислили выше. Но вы не ответили на мой вопрос. Но все равно спасибо. Мой вопрос был больше о моментальном снимке параметра - person Ayrix; 11.05.2021
comment
Я считаю это ответом на ваш вопрос. на самом деле исчерпывающий. В следующий раз будьте лаконичнее. В вашем случае вы можете написать то, что знаете, а потом в чем именно в параметре проблема. Я все еще хочу знать, что неясно в параметре. - person Abdifatah Mohamed; 09.07.2021

моментальный снимок внутренне работает как AsyncSnapshot, который изменяется с указанным [connectionState] и, необязательно, либо [данные], либо [ошибка] с необязательным [stackTrace] (но не одновременно данные и ошибка).

См. ниже код для более подробной информации:

  /// Creates an [AsyncSnapshot] in [ConnectionState.none] with null data and error.
  const AsyncSnapshot.nothing() : this._(ConnectionState.none, null, null, null);

  /// Creates an [AsyncSnapshot] in [ConnectionState.waiting] with null data and error.
  const AsyncSnapshot.waiting() : this._(ConnectionState.waiting, null, null, null);

  /// Creates an [AsyncSnapshot] in the specified [state] and with the specified [data].
  const AsyncSnapshot.withData(ConnectionState state, T data): this._(state, data, null, null);

  /// Creates an [AsyncSnapshot] in the specified [state] with the specified [error]
  /// and a [stackTrace].
  ///
  /// If no [stackTrace] is explicitly specified, [StackTrace.empty] will be used instead.
  const AsyncSnapshot.withError(
    ConnectionState state,
    Object error, [
    StackTrace stackTrace = StackTrace.empty,
  ]) : this._(state, null, error, stackTrace);

Если последние данные, полученные асинхронным вычислением, не равны нулю, тогда [hasData] будет истинным. Если асинхронное вычисление никогда не возвращало значение, оно может быть установлено равным начальному значению данных, указанному соответствующим виджетом.

наконец, мы можем сказать, что моментальный снимок работает как асинхронное вычисление, которое меняет свои состояния.

person Jitesh Mohite    schedule 11.05.2021
comment
Спасибо за подробный ответ, но на самом деле это не точный ответ на мой вопрос. Мой вопрос был больше о моментальном снимке параметра. Но все равно спасибо - person Ayrix; 11.05.2021
comment
snapshot — это просто имя, вместо него можно использовать что угодно. Мой ответ точно объясняет, как работает моментальный снимок, и это одинаково везде, где используется концепция моментального снимка. - person Jitesh Mohite; 11.05.2021
comment
@Ayrix: не могли бы вы принять ответ, если он имеет смысл? - person Jitesh Mohite; 11.05.2021