Flutter交易图表展示插件trade_chart的使用

Flutter交易图表展示插件trade_chart的使用

Trade Chart 是由 PT. Mirae Asset Sekuritas Indonesia 特别使用的插件。

修改者

Ade Putra Prima Suhendri

以下是完整的示例代码,用于展示如何在 Flutter 应用程序中使用 trade_chart 插件。

import 'dart:convert';
import 'dart:io';

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:http/io_client.dart';
import 'package:trade_chart/chart_style.dart';
import 'package:trade_chart/chart_translations.dart';
import 'package:trade_chart/flutter_k_chart.dart';
import 'package:trade_chart/k_chart_widget.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.green,
      ),
      darkTheme: ThemeData(
        brightness: Brightness.dark,
      ),
      themeMode: ThemeMode.system,
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key? key, this.title}) : super(key: key);

  final String? title;

  [@override](/user/override)
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  List<KLineEntity>? datas;
  bool showLoading = true;
  List<DepthEntity>? _bids, _asks;
  bool isChangeUI = false;

  ChartStyle chartStyle = ChartStyle();
  ChartColors chartColors = ChartColors();

  IOClient _certification() {
    final ioc = HttpClient();
    ioc.badCertificateCallback =
        (X509Certificate cert, String host, int port) => true;
    return IOClient(ioc);
  }

  [@override](/user/override)
  void initState() {
    chartColors.minColor = Colors.grey;
    chartColors.maxColor = Colors.grey;
    chartColors.nowPriceUpColor = Colors.yellow;
    chartColors.nowPriceDnColor = Colors.yellow;
    chartColors.nowPriceTextColor = Colors.black;
    chartColors.gridColor = Colors.black54;
    chartColors.dnColor = Colors.red;
    chartColors.upColor = Colors.green;
    chartColors.defaultTextColor = Colors.white;
    chartColors.selectFillColor = Colors.grey.withOpacity(1);
    chartColors.crossTextColor = Colors.black;
    chartColors.hCrossColor = Colors.grey;
    chartColors.vCrossColor = Colors.grey;
    chartColors.selectBorderColor = Colors.black;
    chartColors.infoWindowNormalColor = Colors.black;
    chartColors.infoWindowTitleColor = Colors.black;
    chartStyle.candleLineWidth = 2;
    chartStyle.nowPriceLineWidth = 1;
    chartStyle.volWidth = 6;
    chartColors.defaultTextColor = Colors.black;

    super.initState();
    getData('1day');
    rootBundle.loadString('assets/depth.json').then((result) {
      final parseJson = json.decode(result);
      final tick = parseJson['tick'] as Map<String, dynamic>;
      final List<DepthEntity> bids = (tick['bids'] as List<dynamic>)
          .map<DepthEntity>(
              (item) => DepthEntity(item[0] as double, item[1] as double))
          .toList();
      final List<DepthEntity> asks = (tick['asks'] as List<dynamic>)
          .map<DepthEntity>(
              (item) => DepthEntity(item[0] as double, item[1] as double))
          .toList();
      initDepth(bids, asks);
    });
  }

  void initDepth(List<DepthEntity>? bids, List<DepthEntity>? asks) {
    if (bids == null || asks == null || bids.isEmpty || asks.isEmpty) return;
    _bids = [];
    _asks = [];
    double amount = 0.0;
    bids.sort((left, right) => left.price.compareTo(right.price));
    bids.reversed.forEach((item) {
      amount += item.vol;
      item.vol = amount;
      _bids!.insert(0, item);
    });

    amount = 0.0;
    asks.sort((left, right) => left.price.compareTo(right.price));
    asks.forEach((item) {
      amount += item.vol;
      item.vol = amount;
      _asks!.add(item);
    });
    setState(() {});
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: SafeArea(
        child: Container(
          height: double.infinity,
          width: double.infinity,
          child: KChartWidget(
            datas,
            chartStyle,
            chartColors,
            isLine: false,
            mainState: MainState.BOLL,
            volHidden: false,
            secondaryState: SecondaryState.NONE,
            fixedLength: 2,
            timeFormat: TimeFormat.YEAR_MONTH_DAY,
            translations: kChartTranslations,
            isChinese: false,
            hideGrid: false,
            bgColor: [Colors.transparent, Colors.transparent],
          ),
        ),
      ),
    );
  }

  void getData(String period) {
    final Future<String> future = getIPAddress(period);
    future.then((String result) {
      final Map parseJson = jsonDecode(result) as Map<dynamic, dynamic>;

      final list = parseJson['data'] as List<dynamic>;
      datas = list
          .map((item) => KLineEntity.fromJson(item as Map<String, dynamic>))
          .toList()
          .cast<KLineEntity>();
      DataUtil.calculate(datas!);
      showLoading = false;
      setState(() {});
    }).catchError((_) {
      showLoading = false;
      setState(() {});
      print('### datas error $_');
    });
  }

  Future<String> getIPAddress(String? period) async {
    var url =
        'https://api.huobi.br.com/market/history/kline?period=1day&size=300&symbol=btcusdt';
    late String result;
    final _http = _certification();
    final response = await _http.get(Uri.parse(url));
    if (response.statusCode == 200) {
      result = response.body;
    } else {
      print('Failed getting IP address');
    }
    return result;
  }
}

更多关于Flutter交易图表展示插件trade_chart的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter交易图表展示插件trade_chart的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


trade_chart 是一个用于在 Flutter 应用程序中展示交易图表的插件。它可以帮助开发者轻松地创建和自定义交易图表,如蜡烛图、折线图等。以下是如何使用 trade_chart 插件的基本步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 trade_chart 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  trade_chart: ^1.0.0  # 请使用最新版本

然后运行 flutter pub get 来安装依赖。

2. 导入包

在你的 Dart 文件中导入 trade_chart 包:

import 'package:trade_chart/trade_chart.dart';

3. 创建交易数据

你需要准备一些交易数据来展示在图表中。通常,这些数据是一个包含时间、开盘价、最高价、最低价和收盘价的列表。

List<CandleData> candleData = [
  CandleData(
    time: DateTime(2023, 10, 1),
    open: 100.0,
    high: 110.0,
    low: 95.0,
    close: 105.0,
  ),
  CandleData(
    time: DateTime(2023, 10, 2),
    open: 105.0,
    high: 115.0,
    low: 100.0,
    close: 110.0,
  ),
  // 添加更多数据...
];

4. 使用 TradeChart 组件

现在你可以使用 TradeChart 组件来展示交易图表:

class TradeChartExample extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Trade Chart Example'),
      ),
      body: TradeChart(
        candleData: candleData,
        volumeData: [], // 如果需要展示成交量数据
        // 其他自定义选项
      ),
    );
  }
}

5. 自定义图表

TradeChart 组件提供了多种自定义选项,例如:

  • candleWidth: 蜡烛图的宽度
  • candleColors: 蜡烛图的颜色
  • volumeHeight: 成交量图的高度
  • onScale: 缩放回调
  • onPan: 平移回调
TradeChart(
  candleData: candleData,
  volumeData: [], // 如果需要展示成交量数据
  candleWidth: 8.0,
  candleColors: CandleColors(
    upColor: Colors.green,
    downColor: Colors.red,
  ),
  volumeHeight: 100.0,
  onScale: (scale) {
    // 处理缩放事件
  },
  onPan: (pan) {
    // 处理平移事件
  },
);

6. 运行应用

最后,运行你的 Flutter 应用程序,你应该能够看到一个展示交易图表的界面。

void main() {
  runApp(MaterialApp(
    home: TradeChartExample(),
  ));
}
回到顶部