как обновить (вместо добавления) данные в контейнере при запросе GET? в трепете

#flutter #dart

Вопрос:

У меня есть функционал. В котором я делаю запрос на получение. Затем я анализирую ответ из этого запроса (json), и эти данные отображаются в моем виджете. Все это работает. Но если я снова нажму на кнопку. Данные не будут обновляться. И обновленные данные, которые я получу, будут добавлены к тем, которые уже есть в списке виджетов. Я хотел бы, чтобы на кнопке данные обновлялись (то есть чтобы данные записывались только те, которые я забрал с просьбой ПОЛУЧИТЬ в прошлый раз, а старые данные были удалены). Моя просьба:

 List<eventHistory> _userDetails = [];
 
  Future<Null> getEventsTTNDetails(int? ttn) async {
    HttpClient client = new HttpClient();
    client.badCertificateCallback =
    ((X509Certificate cert, String host, int port) => true);
    final String urlEvents = global.urlVar   "/ttn_events";

    final request = await client
        .getUrl(Uri.parse(urlEvents))
        .timeout(Duration(seconds: 5));

    HttpClientResponse response = await request.close();


    var responseBody = await response.transform(utf8.decoder).join();


    final responseJson = json.decode(responseBody);

    setState(() {
      for (Map<String, dynamic> user in responseJson) {
        _userDetails.add(eventHistory.fromJson(user));
      }
    });
  } 

мой класс, где я разбираю ответ:

 class eventHistory {

  final String date, event,device;



  eventHistory({required this.date, required this.event, required this.device});

  factory eventHistory.fromJson(Map<String, dynamic> json) {
    return new eventHistory(
      date: json['date'],
      event: json['event'],
      device: json['device'],
    );
  }
} 

Виджет, в котором я отображаю эти данные:

                         child: Column(
                          mainAxisSize: MainAxisSize.min,
                          children: [
                            Container(
                                height: 45,
                                child: Text("history", style: TextStyle(
                                    fontSize: 25.0, color: Colors.blueGrey)),
                                padding: EdgeInsets.all(2.0)),
                            Expanded(
                                child: Scrollbar(
                                    child: new ListView(
                                      shrinkWrap: true,
                                      children: [
                                        new Container(
                                            alignment: Alignment.bottomLeft,
                                            child: FixedTimeline.tileBuilder(
                                              theme: TimelineThemeData(
                                                nodePosition: 0.23,
                                                color: Colors.blueGrey,
                                                indicatorTheme: IndicatorThemeData(
                                                  position: 2,
                                                  size: 20.0,
                                                ),
                                                connectorTheme: ConnectorThemeData(
                                                  thickness: 2.5,
                                                ),
                                              ),
                                              builder: TimelineTileBuilder
                                                  .connectedFromStyle(
                                                contentsAlign: ContentsAlign
                                                    .basic,
                                                oppositeContentsBuilder: (
                                                    context, index) =>
                                                    Padding(
                                                      padding: const EdgeInsets
                                                          .all(8.0),
                                                      child: Text(
                                                          _userDetails[index]
                                                              .date),
                                                    ),
                                                contentsBuilder: (context,
                                                    index) =>
                                                    Card(
                                                      child: Padding(
                                                        padding: const EdgeInsets
                                                            .all(8.0),
                                                        child: Text(
                                                            _userDetails[index]
                                                                .event),
                                                      ),
                                                    ),
                                                connectorStyleBuilder: (context,
                                                    index) =>
                                                ConnectorStyle.solidLine,
                                                indicatorStyleBuilder: (context,
                                                    index) =>
                                                IndicatorStyle.dot,
                                                itemCount: _userDetails.length,
                                              ),
                                            )
                                        ),

                                      ],
                                    ))),
                          ],
                        ) 

Ответ №1:

Вы непосредственно добавляете новые данные в _userDetails. Вы можете использовать другой список, чтобы изменить JSON на историю событий, а затем установить в списке _userDetails

 List<eventHistory> _userDetails = [];
 
  Future<Null> getEventsTTNDetails(int? ttn) async {
    HttpClient client = new HttpClient();
    client.badCertificateCallback =
    ((X509Certificate cert, String host, int port) => true);
    final String urlEvents = global.urlVar   "/ttn_events";

final request = await client
    .getUrl(Uri.parse(urlEvents))
    .timeout(Duration(seconds: 5));

HttpClientResponse response = await request.close();


var responseBody = await response.transform(utf8.decoder).join();


final responseJson = json.decode(responseBody);
List<eventHistory> _temp=[];
  for (Map<String, dynamic> user in responseJson) {
    _temp.add(eventHistory.fromJson(user));
  }
     setState(() {
   _userDetails=_temp;
});
}