flutter - Flutter 每分钟自动刷新 JSON
问题描述
我已经在网上搜索了自动刷新小部件并为 Flutter 自动刷新未来的 JSON,但结果似乎都是下拉刷新。
我需要的是一个我可以调用的函数,并且该函数每分钟重复一次。
我知道我必须整合类似的东西:
var future = new Future.delayed(const Duration(milliseconds: 10), TracksWidget());
但是我不确定我需要把它放在哪里。
import 'dart:async';
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import '../model/track.dart';
class TracksWidget extends StatefulWidget {
@override
_TracksWidgetState createState() => _TracksWidgetState();
}
class _TracksWidgetState extends State<TracksWidget> {
Future<Track> track;
@override
Widget build(BuildContext context) {
double c_width = MediaQuery.of(context).size.width;
return new FutureBuilder<Track>(
future: track,
builder: (context, snapshot) {
if (snapshot.hasData) {
Track track = snapshot.data;
return new Container(
padding: const EdgeInsets.all(16.0),
width: c_width,
child: new Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Image.network(track.imageurl, width:200.0, height: 200.0,fit: BoxFit.cover),
Text(track.title),
Text(track.artist),
]),
);
} else if (snapshot.hasError) {
return Text("${snapshot.error}");
}
//By default, show a loading spinner.
return CircularProgressIndicator();
},
);
}
@override
void initState() {
super.initState();
track = fetchTrack();
}
Future<Track> fetchTrack() async {
final response =
await http.get('http://139.59.108.222:2199/rpc/drn1/streaminfo.get');
if (response.statusCode == 200) {
// If the call to the server was successful, parse the JSON.
var responseJson = json.decode(response.body);
// assume there is only one track to display
// SO question mentioned 'display current track'
var track = responseJson['data']
.map((musicFileJson) => Track.fromJson(musicFileJson['track']))
.first;
return track;
} else {
// If that call was not successful, throw an error.
throw Exception('Failed to load post');
}
}
}
解决方案
我发现最简单的方法是使用该Timer
函数。
如果您将计时器放入initState
其中,它将在应用程序启动时启动。在下面的代码中,计时器将addValue()
每 5 秒调用一次该方法,每次将值增加一。请记住在完成计时器后将其丢弃。
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
Timer timer;
int counter = 0;
@override
void initState() {
super.initState();
timer = Timer.periodic(Duration(seconds: 5), (Timer t) => addValue());
}
void addValue() {
setState(() {
counter++;
});
}
@override
void dispose() {
timer?.cancel();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(counter.toString())
],
),
),
);
}
}
推荐阅读
- c# - 未处理的异常 Json 在 Blazor 上显示数据
- apache - Apache 不发送 Web 套接字的主体
- unreal-engine4 - 从数组节点获取随机项,当尝试设置它时会给出一个随机索引
- r - 使用 dplyr 重命名变量
- cmd - nvm 使用给出 Execution of the Windows Script Host Failed 错误
- python - Sympy:集合的概率度量
- node.js - keycloak-connect : type=PERMISSION_TOKEN_ERROR, userId=null, ipAddress=, error=invalid_client_credentials
- cucumber-java - 黄瓜bdd如何输入随机数据
- excel - 带有 if、xor 语句的 Excel 求解器
- javascript - 删除灯塔建议的未使用 JavaScript 的最佳方法。setTimeout 是个好主意吗?