#json #flutter #http
#json #flutter #http
Вопрос:
я хочу использовать flutter для оценки файла json. http-запрос также работает, и данные также загружаются в карту, как и ожидалось. однако приложение запускает запрос в непрерывном цикле, который может быть остановлен только выходом из программы. я просто не понимаю, почему он это делает.
Список jsonData также заполнен правильными и ожидаемыми данными, и в выходных данных программы данные, которые я ввел в строку, также отображаются правильно. Но как только это делается с выводом, он возвращается в функцию fetchPost и запускает все заново.
приветствую niesel
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:http/http.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
@override
_MyState createState() => _MyState();
}
class _MyState extends State<MyApp>{
final url2 = "https://example.com/gartentemp/api/get_temp_data.php?data_type=temps_today";
String basicAuth =
'Basic ' base64Encode(utf8.encode('user:password'));
var _postJson = [];
void fetchPost() async {
try {
//final response = await get(Uri.http("jsonplaceholder.typicode.com", "posts"));
final response = await get(Uri.parse(url2),headers: <String, String>{'authorization': basicAuth});
print(response.statusCode);
Map<String, dynamic> map = json.decode(response.body);
print("map");
print(map);
print("/map");
List<dynamic> jsonData = map["temperaturen"];
setState(() {
_postJson = jsonData;
});
}catch(err) {
print(err);
}
}
@override
void initState() {
super.initState();
//fetchPost();
}
@override
Widget build(BuildContext context) {
fetchPost();
// TODO: implement build
return MaterialApp(
home: Scaffold(
body: ListView.builder(
itemCount: _postJson.length,
itemBuilder: (context, i) {
final post = _postJson[i];
return Text("Title: ${post["datum"]}n ${post["temperatur1"]}nn");
}
),
)
);
}
}
Содержимое Json
{
"temperaturen": [
{
"datum": "2021-12-11 00:00:06",
"temperatur1": "-1.06",
"temperatur2": "3.56"
},
{
"datum": "2021-12-11 01:00:06",
"temperatur1": "-1.44",
"temperatur2": "3.19"
}
],
"Aggregat_data": [
{
"day_avg_temperatur1": "-2.4",
"day_avg_temperatur2": "2.11",
}
]
}
Ответ №1:
На самом деле вы не задавали вопрос, но проблема с вашим кодом заключается в том, что вы вызываете fetchPost
метод сборки, который затем вызывает setState
build
, что приводит к повторному выполнению метода.
Как вы можете видеть, явно существует цикл.
Что вы могли бы сделать вместо этого, так это превратить _postJson
в a late Future<Response>
, присвоить этой переменной future (без setState
, потому что процесс присвоения переменной является синхронным) и build
использовать a FutureBuilder
для отображения данных.
Я рекомендую вам посмотреть потрясающее видео с описанием того, как FutureBuilder
это работает: https://api.flutter.dev/flutter/widgets/FutureBuilder-class.html