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

如何用Syncfusion在Flutter中实现标签视图?组件名称与代码修复

Flutter + Syncfusion 实现双标签电压/电流图表视图

核心组件说明

  • Flutter 端用 TabBar + TabBarView 实现标签切换布局,配合 TabController 管理标签状态
  • Syncfusion 端用 SfCartesianChart 作为图表容器,搭配 LineSeries(或ColumnSeries等其他系列组件)绘制电压、电流数据

完整可运行代码示例

首先在pubspec.yaml中添加依赖:

dependencies:
  flutter:
    sdk: flutter
  syncfusion_flutter_charts: ^25.1.35 # 建议使用最新版本

执行flutter pub get后,使用以下代码:

import 'package:flutter/material.dart';
import 'package:syncfusion_flutter_charts/charts.dart';

void main() => runApp(const ChartTabView());

class ChartTabView extends StatelessWidget {
  const ChartTabView({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: const ChartTabPage(),
      theme: ThemeData(primarySwatch: Colors.blue),
    );
  }
}

class ChartTabPage extends StatefulWidget {
  const ChartTabPage({super.key});

  @override
  State<ChartTabPage> createState() => _ChartTabPageState();
}

class _ChartTabPageState extends State<ChartTabPage> with SingleTickerProviderStateMixin {
  late TabController _tabController;
  final List<ChartData> _voltageData = [
    ChartData(0, 3.2),
    ChartData(1, 3.5),
    ChartData(2, 3.1),
    ChartData(3, 3.6),
    ChartData(4, 3.3),
  ];
  final List<ChartData> _currentData = [
    ChartData(0, 0.8),
    ChartData(1, 0.9),
    ChartData(2, 0.7),
    ChartData(3, 1.0),
    ChartData(4, 0.85),
  ];

  @override
  void initState() {
    super.initState();
    _tabController = TabController(length: 2, vsync: this);
  }

  @override
  void dispose() {
    _tabController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        bottom: TabBar(
          controller: _tabController,
          tabs: const [
            Tab(text: '电压图表'),
            Tab(text: '电流图表'),
          ],
        ),
        title: const Text('电量监测'),
      ),
      body: TabBarView(
        controller: _tabController,
        children: [
          _buildVoltageChart(),
          _buildCurrentChart(),
        ],
      ),
    );
  }

  Widget _buildVoltageChart() {
    return SfCartesianChart(
      title: ChartTitle(text: '实时电压'),
      primaryXAxis: NumericAxis(title: AxisTitle(text: '时间点')),
      primaryYAxis: NumericAxis(title: AxisTitle(text: '电压(V)')),
      series: <LineSeries<ChartData, num>>[
        LineSeries<ChartData, num>(
          dataSource: _voltageData,
          xValueMapper: (ChartData data, _) => data.x,
          yValueMapper: (ChartData data, _) => data.y,
          name: '电压',
          markerSettings: const MarkerSettings(isVisible: true),
        )
      ],
      legend: const Legend(isVisible: true),
    );
  }

  Widget _buildCurrentChart() {
    return SfCartesianChart(
      title: ChartTitle(text: '实时电流'),
      primaryXAxis: NumericAxis(title: AxisTitle(text: '时间点')),
      primaryYAxis: NumericAxis(title: AxisTitle(text: '电流(A)')),
      series: <LineSeries<ChartData, num>>[
        LineSeries<ChartData, num>(
          dataSource: _currentData,
          xValueMapper: (ChartData data, _) => data.x,
          yValueMapper: (ChartData data, _) => data.y,
          name: '电流',
          markerSettings: const MarkerSettings(isVisible: true),
          color: Colors.orange,
        )
      ],
      legend: const Legend(isVisible: true),
    );
  }
}

class ChartData {
  ChartData(this.x, this.y);
  final num x;
  final double y;
}

代码无法运行的常见排查点

  • 未添加Syncfusion依赖:检查pubspec.yaml配置,执行flutter pub get确保依赖下载完成
  • TabController未正确管理:必须在initState初始化,dispose中销毁,且混入SingleTickerProviderStateMixin
  • 图表尺寸异常:若图表显示不全或报错,可将SfCartesianChart用Expanded包裹(比如放在Column布局中时)
  • 数据源格式错误:确保数据源的x、y值类型与图表轴类型匹配(比如NumericAxis对应数值类型数据)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 12:15:40