flutter отправляет http-запросы в бесконечном цикле

#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