Я хочу получить свои данные без использования метода 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;
Наконец, я ищу, как я могу получить свои данные и сохранить их в переменной, а не в параметре виджета.
Я хочу хранить свои данные в var. Не хранить его как параметр в виджете
почему вы не хотите использовать FutureBuilder? это необходимо, потому что ваш метод асинхронный и возвращает Future
Мне нужно использовать логическое значение в качестве параметра, и я не могу использовать FutureBuilder, потому что, когда я пытаюсь его вызвать, он говорит: «Булевой параметр не является подтипом FutureBuilder<bool>».
вы делаете что-то не так, внутри вашего FutureBuilder ваш snapshot.data должен быть логическим
Проблема, с которой вы столкнулись, вызвана тем, что у вас, вероятно, нет настройки архитектуры для вашего приложения, поэтому ваше состояние, бизнес-логика и код пользовательского интерфейса смешиваются в одном месте.
Что вы хотите сделать, так это иметь возможность запрашивать данные независимо от их привязки к FutureBuilder (я недавно сделал то же самое). Сначала вам нужно отделить всю логику ваших операций от вашего пользовательского интерфейса, поэтому для этого вам нужна какая-то архитектура. Их много, но наиболее полезными я считаю два:
Модель с прицелом. Для достойного учебника по модели с прицелом посмотрите это
Redux (излишний в вашей текущей ситуации)
Например, это функция в моем файле notes_model.
Future fetchNotices() async {
if (_notices == null || _notices.length == 0) {
_notices = await _mobileApi.getNotices();
notifyListeners();
}
}
_notices, которые вы видите, есть локальная переменная типа List, которую я выставляю через свойство. Короче говоря.
Настройте архитектуру, которая отделяет логику вашего представления от вашей операционной/бизнес-логики.
Привяжите свойства к своей логике представления и просто выполняйте свои операции в обычном режиме.
Также взгляните на FlutterSamples для архитектуры и примеров на их github.
Да, моя настройка архитектуры на самом деле нулевая xD, я посмотрю на Redux (я использую его с React), спасибо
@PierreLeBrun, если вы делаете небольшое приложение, я бы порекомендовал ScopedModel. Он также управляется одним состоянием, но вы можете разделить свои модели для разных функций. Просто поместите свою функцию Future в модель и вызовите ее, не нужно ждать, просто правильно обработайте все внутри и сохраните свои результаты в локальной модели.
Хорошо, я сделаю это, у меня не так много функций будущего (4), и хорошо знать, как работать более эффективно.
Вы можете нормально хранить данные, даже если используете 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
}
}),
);
Спасибо, я протестирую это
Итак, что вы хотите использовать вместо FutureBuilder?