You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Flutter包flutter_charts实现实时图表的最优实现方式是什么

解决方案

状态逻辑不需要放在数据集处理的静态方法中,直接抽离到GetxController中即可,无需修改现有DummyTracker组件的代码,具体实现如下:

1. 编写GetX控制器,封装数据逻辑

把数据初始化、生成图表Series、更新数据的逻辑都放在控制器中,将图表数据设置为可观察类型:

import 'package:get/get.dart';
import 'package:charts_flutter/flutter.dart' as charts;

// 替换为你自己定义的颜色常量
const Color Green = Color(0xFF2ECC71);
const Color Red = Color(0xFFE74C3C);
const Color Blue = Color(0xFF3498DB);

class DummyChartController extends GetxController {
  // 可观察的图表系列数据,修改后会自动通知UI更新
  final RxList<charts.Series<Dummy, DateTime>> chartSeries = <charts.Series<Dummy, DateTime>>[].obs;

  @override
  void onInit() {
    super.onInit();
    // 页面初始化时加载默认模拟数据
    loadMockData();
  }

  /// 加载模拟数据,对应你原来的sampleDummyData逻辑
  void loadMockData() {
    final dummy1 = [
      Dummy(DateTime(2017, 9, 19), 5),
      Dummy(DateTime(2017, 9, 26), 10),
      Dummy(DateTime(2017, 10, 3), 30),
      Dummy(DateTime(2017, 10, 10), 45),
    ];
    final dummy2 = [
      Dummy(DateTime(2017, 9, 19), 30),
      Dummy(DateTime(2017, 9, 26), 25),
      Dummy(DateTime(2017, 10, 3), 20),
      Dummy(DateTime(2017, 10, 10), 25),
    ];
    final dummy3 = [
      Dummy(DateTime(2017, 9, 19), 30),
      Dummy(DateTime(2017, 9, 26), 40),
      Dummy(DateTime(2017, 10, 3), 30),
      Dummy(DateTime(2017, 10, 10), 20),
    ];
    _buildSeries([dummy1, dummy2, dummy3]);
  }

  /// 通用生成Series的方法,新旧数据都复用该逻辑
  void _buildSeries(List<List<Dummy>> data) {
    final List<String> names = ["Type1", "Type2", "Type3"];
    final List<Color> lineColors = [Green, Red, Blue];
    final List<charts.Series<Dummy, DateTime>> returnList = [];
    for (var i = 0; i < data.length; i++) {
      returnList.add(charts.Series<Dummy, DateTime>(
        id: names[i],
        domainFn: (Dummy dummy, _) => dummy.time,
        measureFn: (Dummy dummy, _) => dummy.numDummies,
        data: data[i],
        seriesColor: charts.ColorUtil.fromDartColor(lineColors[i]),
        labelAccessorFn: (_, __) => names[i],
      ));
    }
    // 更新可观察数据
    chartSeries.value = returnList;
  }

  /// 对外暴露的更新数据方法,传入新数据集即可触发UI刷新
  void updateChartData(List<List<Dummy>> newData) {
    _buildSeries(newData);
  }
}

// 你的原有数据类
class Dummy {
  final DateTime time;
  final int numDummies;
  Dummy(this.time, this.numDummies);
}

2. 注册控制器

在使用图表的页面初始化前注册控制器,可直接在main.dart中注册,也可在页面的初始化方法中注册:

// 全局注册控制器,整个应用范围内都可以获取
Get.put(DummyChartController());

3. 改造页面组件调用逻辑

用GetX的Obx组件包裹DummyTracker,监听可观察数据的变化,自动更新UI:

// 先获取控制器实例
final DummyChartController controller = Get.find<DummyChartController>();

// 原有实例化部分改造为:
Expanded(
  child: Container(
    child: Obx(() => DummyTracker(
      seriesList: controller.chartSeries.value,
      animate: true,
    )),
  )
)

后续使用说明

需要更新图表数据时,直接调用controller.updateChartData(你的新数据集)即可,GetX会自动触发图表刷新,不需要手动调用任何状态更新方法,原有DummyTracker组件保持无状态即可正常工作。


内容的提问来源于stack exchange,提问作者RockishWood

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 07:42:03