【问题标题】:Flutter Charts with Y axis displaying minutes:seconds:centsY 轴显示分:秒:分的颤振图表
【发布时间】:2020-11-25 19:17:27
【问题描述】:

我正在使用 Flutter 开发一个应用程序,该应用程序必须显示游泳比赛的计时比赛结果。我无法在 Y 轴 min:sec:mills 上表示。似乎 Charts 接受的唯一值是 int。有什么办法解决吗?

【问题讨论】:

  • 您能否分享一个屏幕截图或一些详细描述问题的代码?

标签: flutter charts duration


【解决方案1】:

在下面调用此函数,它将格式为 min:sec:mils 的 String 转换为 int 类型的毫秒。使用它来表示图表中的 Y 轴。在 Y 轴的标签中使用 String in min:sec:mils 格式本身。

注意1:需要将min:sec:mils格式的String值传递给函数。 示例: "24:36:10".

注意 2: 函数返回一个 int 值。

int convertToMilliseconds(String time) {
  var arr = time.split(':');
  String min = arr[0];
  String sec = arr[1];
  String mils = arr[2];
  int a = int.parse(min);
  int b = int.parse(sec);
  int c = int.parse(mils);
  int intTimeInMilliseconds = Duration(minutes: a).inMilliseconds + Duration(seconds: b).inMilliseconds + c ;
return intTimeInMilliseconds;
}

完整示例:

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

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
       primarySwatch: Colors.blue,
       visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);
  final String title;
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  /*This is a 800 meters running race data
  * David RUDISHA = 1:40:91
  * Wilson KIPKETER = 1:41:11
  * Sebastian COE = 1:41:73
  * Nijel AMOS = 1:41:73
  * Joaquim CRUZ = 1:41:77 */

  static const String Racer1Name = 'David RUDISHA';
  static const String Racer2Name = 'Wilson KIPKETER';
  static const String Racer3Name = 'Sebastian COE';
  static const String Racer4Name = 'Nijel AMOS';
  static const String Racer5Name = 'Joaquim CRUZ';

  static const String Racer1Time = '1:40:91';
  static const String Racer2Time = '1:41:11';
  static const String Racer3Time = '1:41:73';
  static const String Racer4Time = '1:41:73';
  static const String Racer5Time = '1:41:77';

  int Racer1TimeMilliSeconds = convertToMilliseconds(Racer1Time);
  int Racer2TimeMilliSeconds = convertToMilliseconds(Racer2Time);
  int Racer3TimeMilliSeconds = convertToMilliseconds(Racer3Time);
  int Racer4TimeMilliSeconds = convertToMilliseconds(Racer4Time);
  int Racer5TimeMilliSeconds = convertToMilliseconds(Racer5Time);

  @override
  Widget build(BuildContext context) {
    String Racer1TimeStringMilliSeconds = Racer1TimeMilliSeconds.toString();
    String Racer2TimeStringMilliSeconds = Racer2TimeMilliSeconds.toString();
    String Racer3TimeStringMilliSeconds = Racer3TimeMilliSeconds.toString();
    String Racer4TimeStringMilliSeconds = Racer4TimeMilliSeconds.toString();
    String Racer5TimeStringMilliSeconds = Racer5TimeMilliSeconds.toString();

    final List<RaceData> chartData = [
      RaceData(
          Racer1TimeMilliSeconds,
          '${Racer1Name}' +
              '\nminutes:seconds:milliseconds ${Racer1Time}' +
              '\n${Racer1TimeStringMilliSeconds} milliseconds'),
      RaceData(
          Racer2TimeMilliSeconds,
          '${Racer2Name}' +
              '\nminutes:seconds:milliseconds ${Racer2Time}' +
              '\n${Racer2TimeStringMilliSeconds} milliseconds'),
      RaceData(
          Racer3TimeMilliSeconds,
          '${Racer3Name}' +
              '\nminutes:seconds:milliseconds ${Racer3Time}' +
              '\n${Racer3TimeStringMilliSeconds} milliseconds'),
      RaceData(
          Racer4TimeMilliSeconds,
          '${Racer4Name}' +
              '\nminutes:seconds:milliseconds ${Racer4Time}' +
              '\n${Racer4TimeStringMilliSeconds} milliseconds'),
      RaceData(
          Racer5TimeMilliSeconds,
          '${Racer5Name}' +
              '\nminutes:seconds:milliseconds ${Racer5Time}' +
              '\n${Racer5TimeStringMilliSeconds} milliseconds'),
    ];

    return Scaffold(
      body: Container(
        child: SfCartesianChart(
            primaryXAxis: CategoryAxis(
              // Axis labels will be rotated to 90 degree
                labelRotation: 0,
                labelIntersectAction: AxisLabelIntersectAction.multipleRows,
            ),
          title: ChartTitle(
              text: 'Race Data',
              backgroundColor: Colors.white,
              borderColor: Colors.black,
              borderWidth: 1,
              // Aligns the chart title to left
              alignment: ChartAlignment.center,
              textStyle: TextStyle(
                color: Colors.black,
                fontFamily: 'Roboto',
                fontStyle: FontStyle.italic,
                fontSize: 20,
              )),

          series: <ChartSeries>[
            // Renders line chart

            ColumnSeries<RaceData, String>(
              dataSource: chartData,
              xValueMapper: (RaceData race, _) => race.name,
              yValueMapper: (RaceData race, _) => race.time,
              enableTooltip: true,

              dataLabelSettings: DataLabelSettings(
                // Renders the data label
                isVisible: true,
                angle: 0,
              ),
            ),
          ],
        ),
      ),
    );
  }
}

class RaceData {
  RaceData(this.time, this.name);

  final String name;
  final int time;
}

int convertToMilliseconds(String time) {
  var arr = time.split(':');
  print(arr);
  String min = arr[0];
  String sec = arr[1];
  String mils = arr[2];
  int a = int.parse(min);
  int b = int.parse(sec);
  int c = int.parse(mils);
  int intTimeInMilliseconds = Duration(minutes: a).inMilliseconds +
      Duration(seconds: b).inMilliseconds +
      c;
  return intTimeInMilliseconds;
}

平板电脑视图:

移动端视图:

【讨论】:

  • 感谢您的回答,但在颤动中,Y 轴只接受数字。这是我得到的消息:返回类型 'String' 不是 'num',正如闭包上下文所要求的那样。
  • 是的,在通过 String 之前需要将其转换为 int。上述函数将String 转换为int。在将其传递给程序的 Y 轴组件之前,您需要调用此函数并传递 String。作为回报,您将获得一个 int 值。该值必须传递给代码的 Y 轴组件。
  • 我正在使用颤振和同步融合图表,并且使用 SfCartesianChart 无法在 Y 轴上使用字符串标签。我能够绘制图表,但在 Y 轴上我看到毫秒,这是不可接受的。我必须显示类似 min:sec:millisec 的内容。
  • 请检查..我已经对答案进行了编辑。这完全取决于如何将数据呈现给用户。使用上图中的一切都是可以理解的。还要看代码。如果您喜欢它,请选择并投票给答案。我会为此获得一些声望点...
  • 谢谢,我真的很感激,但我需要在 Y 轴上或至少在条形顶部的标签上以 min:sec:mill 计时。无论如何,你一直在重播,我选择了你的回复。顺便说一句,如果您了解如何更改 Y 轴,请添加另一条评论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-29
  • 1970-01-01
  • 2021-09-17
  • 2021-01-26
  • 1970-01-01
  • 2020-11-15
相关资源
最近更新 更多