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