Получение данных без использования FutureBuilder

Я хочу получить свои данные без использования метода FutureBuilder

Это мой метод:

Future<bool> fetchJointures(http.Client client) async {
  final response = ('{"isInteresses": false}');

  return compute(parseJointures, response.body);
}

bool parseJointures(String responseBody) {
     final jsonParsed = json.decode(responseBody);
  return jsonParsed['isInteresses'];
}

и как этот пример: https://flutter.io/docs/cookbook/networking/background-parsing отображать данные:

 FutureBuilder<bool>(
       future: fetchJointures(http.Client()),
       builder: (context, snapshot) {
         if (snapshot.hasError) print(snapshot.error);

      return A_Widget(data : snapshot.data);
    },
  );

я хочу получить и сохранить свои данные в var следующим образом:

bool data = snapshot.data;

Наконец, я ищу, как я могу получить свои данные и сохранить их в переменной, а не в параметре виджета.

Итак, что вы хотите использовать вместо FutureBuilder?

diegoveloper 22.01.2019 16:50

Я хочу хранить свои данные в var. Не хранить его как параметр в виджете

Pierre Le Brun 22.01.2019 16:56

почему вы не хотите использовать FutureBuilder? это необходимо, потому что ваш метод асинхронный и возвращает Future

diegoveloper 22.01.2019 17:01

Мне нужно использовать логическое значение в качестве параметра, и я не могу использовать FutureBuilder, потому что, когда я пытаюсь его вызвать, он говорит: «Булевой параметр не является подтипом FutureBuilder<bool>».

Pierre Le Brun 22.01.2019 17:13

вы делаете что-то не так, внутри вашего FutureBuilder ваш snapshot.data должен быть логическим

diegoveloper 22.01.2019 17:16
1
5
1 864
2

Ответы 2

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

Что вы хотите сделать, так это иметь возможность запрашивать данные независимо от их привязки к FutureBuilder (я недавно сделал то же самое). Сначала вам нужно отделить всю логику ваших операций от вашего пользовательского интерфейса, поэтому для этого вам нужна какая-то архитектура. Их много, но наиболее полезными я считаю два:

  1. Модель с прицелом. Для достойного учебника по модели с прицелом посмотрите это

  2. Redux (излишний в вашей текущей ситуации)

Например, это функция в моем файле notes_model.

Future fetchNotices() async {
 if (_notices == null || _notices.length == 0) {
  _notices = await _mobileApi.getNotices();
  notifyListeners();
 }
}

_notices, которые вы видите, есть локальная переменная типа List, которую я выставляю через свойство. Короче говоря.

  1. Настройте архитектуру, которая отделяет логику вашего представления от вашей операционной/бизнес-логики.

  2. Привяжите свойства к своей логике представления и просто выполняйте свои операции в обычном режиме.

Также взгляните на FlutterSamples для архитектуры и примеров на их github.

Да, моя настройка архитектуры на самом деле нулевая xD, я посмотрю на Redux (я использую его с React), спасибо

Pierre Le Brun 22.01.2019 17:37

@PierreLeBrun, если вы делаете небольшое приложение, я бы порекомендовал ScopedModel. Он также управляется одним состоянием, но вы можете разделить свои модели для разных функций. Просто поместите свою функцию Future в модель и вызовите ее, не нужно ждать, просто правильно обработайте все внутри и сохраните свои результаты в локальной модели.

Filled Stacks 22.01.2019 17:51

Хорошо, я сделаю это, у меня не так много функций будущего (4), и хорошо знать, как работать более эффективно.

Pierre Le Brun 23.01.2019 09:35

Вы можете нормально хранить данные, даже если используете FutureBuilder. Вам также не нужно указывать, какой тип переменной вы хотите вернуть. Попробуй это:

var data;
var initialFutureData;

new FutureBuilder(
    future: fetchJointures(http.Client()), // a Future<String> or null
    initialData: initialFutureData,
    builder: (BuildContext context, AsyncSnapshot snapshot) {
    switch (snapshot.connectionState) {
        case ConnectionState.none:
        return Center(child: new Text('No connection...')); // error output
        case ConnectionState.waiting:
        return Center(
            child: Padding(
            padding: const EdgeInsets.all(8.0),
            child: new CircularProgressIndicator(), // waiting indicator
        ));
        default:
        if (snapshot.hasError) return Center(child: new Text('Error: ${snapshot.error}'));

        initialFutureData = snapshot.data; // store data in var for fast reloading
        data = snapshot.data; // store data

        return A_Widget(data: snapshot.data); // return final widget when successfull
        }
    }),
);

Спасибо, я протестирую это

Pierre Le Brun 23.01.2019 09:35

Другие вопросы по теме