Flutter GetX 计时器错误。首页未刷新
Flutter GetX Timer Error. HomePage is not refreshed
我正在尝试每 30 秒获取一次数据,但我不知道该怎么做。我创建的getx控制器文件没有问题。我能够提取数据,但它没有刷新。
这是我的控制器:
class AllCoinController extends GetxController {
var coinList = [].obs;
var coinCounter = 0.obs;
Future callAllCoins() async {
try {
final response = await http.get(url);
if (response.statusCode == 200) {
List<dynamic> values = [];
values = allCoinsFromJson(response.body);
coinCounter.value = values.length;
if (values.length > 0) {
for (int i = 0; i < values.length; i++) {
if (values[i] != null) {
coinList.add(values[i]);
}
}
}
return coinList;
} else {
print(response.statusCode);
}
} catch (e) {
print(e.toString());
}
}
@override
void onInit() {
callAllCoins();
Timer.periodic(Duration(seconds: 30), (timer) => callAllCoins());
super.onInit();
}
}
我的主页:
class HomePage extends StatelessWidget {
final AllCoinController allCoinController = Get.put(AllCoinController());
@override
Widget build(BuildContext context) {
return Scaffold(
body: Obx(
() => ListView.builder(
scrollDirection: Axis.vertical,
itemCount: allCoinController.coinCounter.value,
itemBuilder: (context, index) {
return Container(
width: 150,
child: Row(
children: [
SizedBox(
width: 50,
height: 50,
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Image.network(
allCoinController.coinList[index].image),
),
),
Padding(
padding: const EdgeInsets.all(8.0),
child: Text(allCoinController.coinList[index].name),
),
Padding(
padding: const EdgeInsets.all(8.0),
child: Text(allCoinController.coinList[index].symbol),
),
Padding(
padding: const EdgeInsets.all(8.0),
child: Obx(
() => Text(allCoinController.coinList[index].currentPrice
.toString()),
),
),
],
),
);
},
),
),
);
}
}
代码没有问题,唯一的问题是定时器不工作。
您发布的代码每 30 秒将新值添加到列表中,但计数没有增加。为了显示这些新值,您 必须增加 nem 项目的数量 或 替换列表中的现有值(在添加之前将其清空)
另外,请注意以下代码在初始化时调用了两次 callAllCoins()。
@override
void onInit() {
callAllCoins(); // This should be removed
Timer.periodic(Duration(seconds: 30), (timer) => callAllCoins()); // This is called right in this line, then every 30 sec.
super.onInit();
}
我在下面为您提供了一个关于我的想法的基本示例。
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
final controller = Get.put(MyAppController());
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Container(
child: Obx(() {
print(controller.counter);
return ListView.builder(
itemBuilder: (context, index) => Text(controller.list[index]),
itemCount: controller.counter.value,
);
}),
),
);
}
}
class MyAppController extends GetxController {
var list = [].obs;
var counter = 0.obs;
callIncrement() {
list.add('->');
counter.value += 1;
}
@override
void onInit() {
Timer.periodic(Duration(seconds: 1), (_) => callIncrement());
super.onInit();
}
}
我认为你的控制器有问题。例如,您通过循环在列表中手动添加值。您可以在 REST 调用后简单地使用 coinList.assignAll(values)
而无需编写所有手动代码。 assignAll()
方法的好处之一是它会通知更改。
所以你不需要 coinCounter
变量,你可以简单地做:
...
values = allCoinsFromJson(response.body);
coinList.assignAll(values);
...
并在 ListView.builder
上使用 itemCount: allCoinController.coinList.length
我正在尝试每 30 秒获取一次数据,但我不知道该怎么做。我创建的getx控制器文件没有问题。我能够提取数据,但它没有刷新。
这是我的控制器:
class AllCoinController extends GetxController {
var coinList = [].obs;
var coinCounter = 0.obs;
Future callAllCoins() async {
try {
final response = await http.get(url);
if (response.statusCode == 200) {
List<dynamic> values = [];
values = allCoinsFromJson(response.body);
coinCounter.value = values.length;
if (values.length > 0) {
for (int i = 0; i < values.length; i++) {
if (values[i] != null) {
coinList.add(values[i]);
}
}
}
return coinList;
} else {
print(response.statusCode);
}
} catch (e) {
print(e.toString());
}
}
@override
void onInit() {
callAllCoins();
Timer.periodic(Duration(seconds: 30), (timer) => callAllCoins());
super.onInit();
}
}
我的主页:
class HomePage extends StatelessWidget {
final AllCoinController allCoinController = Get.put(AllCoinController());
@override
Widget build(BuildContext context) {
return Scaffold(
body: Obx(
() => ListView.builder(
scrollDirection: Axis.vertical,
itemCount: allCoinController.coinCounter.value,
itemBuilder: (context, index) {
return Container(
width: 150,
child: Row(
children: [
SizedBox(
width: 50,
height: 50,
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Image.network(
allCoinController.coinList[index].image),
),
),
Padding(
padding: const EdgeInsets.all(8.0),
child: Text(allCoinController.coinList[index].name),
),
Padding(
padding: const EdgeInsets.all(8.0),
child: Text(allCoinController.coinList[index].symbol),
),
Padding(
padding: const EdgeInsets.all(8.0),
child: Obx(
() => Text(allCoinController.coinList[index].currentPrice
.toString()),
),
),
],
),
);
},
),
),
);
}
}
代码没有问题,唯一的问题是定时器不工作。
您发布的代码每 30 秒将新值添加到列表中,但计数没有增加。为了显示这些新值,您 必须增加 nem 项目的数量 或 替换列表中的现有值(在添加之前将其清空)
另外,请注意以下代码在初始化时调用了两次 callAllCoins()。
@override
void onInit() {
callAllCoins(); // This should be removed
Timer.periodic(Duration(seconds: 30), (timer) => callAllCoins()); // This is called right in this line, then every 30 sec.
super.onInit();
}
我在下面为您提供了一个关于我的想法的基本示例。
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
final controller = Get.put(MyAppController());
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Container(
child: Obx(() {
print(controller.counter);
return ListView.builder(
itemBuilder: (context, index) => Text(controller.list[index]),
itemCount: controller.counter.value,
);
}),
),
);
}
}
class MyAppController extends GetxController {
var list = [].obs;
var counter = 0.obs;
callIncrement() {
list.add('->');
counter.value += 1;
}
@override
void onInit() {
Timer.periodic(Duration(seconds: 1), (_) => callIncrement());
super.onInit();
}
}
我认为你的控制器有问题。例如,您通过循环在列表中手动添加值。您可以在 REST 调用后简单地使用 coinList.assignAll(values)
而无需编写所有手动代码。 assignAll()
方法的好处之一是它会通知更改。
所以你不需要 coinCounter
变量,你可以简单地做:
...
values = allCoinsFromJson(response.body);
coinList.assignAll(values);
...
并在 ListView.builder
上使用 itemCount: allCoinController.coinList.length