#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;
});
}