Flutter K线图绘制插件flutter_kline的使用

发布于 1周前 作者 vueper 来自 Flutter

Flutter K线图绘制插件flutter_kline的使用

效果图

K线图效果

使用说明

Getting Started

flutter_kline 是一个用于在 Flutter 中绘制 K 线图的插件。它可以帮助开发者快速实现股票、数字货币等数据的可视化。

原作者地址

原项目地址:https://github.com/zhaojijin/flutter_kline

在此代码基础上增加了空安全支持,并将其封装为 Pub 库。

完整示例代码

以下是一个完整的示例代码,展示如何使用 flutter_kline 插件来绘制 K 线图。

/*
 * @Description: 使用 flutter_kline 插件绘制 K 线图的示例代码
 * @Author: zhaojijin
 * @LastEditors: zhaojijin
 * @Date: 2019-04-16 10:21:10
 * @LastEditTime: 2020-05-11 16:48:45
 */

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_kline/packages/bloc/klineBloc.dart'; // 引入 K 线图的核心 Bloc
import 'package:flutter_kline/packages/klinePage.dart'; // 引入 K 线图页面
import 'package:flutter/services.dart' show rootBundle; // 用于加载本地 JSON 文件
import 'package:flutter_kline/packages/model/klineConstrants.dart'; // 引入常量定义
import 'dart:async'; // 异步操作
import 'dart:convert'; // JSON 解析
import 'dart:io'; // HTTP 请求
import 'package:flutter_kline/packages/model/klineModel.dart'; // 模型类
import 'package:flutter_kline/packages/model/kline_data_model.dart'; // 数据模型
import 'package:http/http.dart' as http; // HTTP 请求库

void main() => runApp(MyApp()); // 启动应用

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return CupertinoApp(
      title: 'Kline Demo', // 应用标题
      home: MyHomePage(title: 'Kline Home Page'), // 主页
      debugShowCheckedModeBanner: false, // 隐藏调试标志
    );
  }
}

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

  final String? title;

  @override
  _MyHomePageState createState() => _MyHomePageState(); // 创建状态
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    KlinePageBloc bloc = KlinePageBloc(); // 初始化 K 线图 Bloc
    return Scaffold(
      appBar: CupertinoNavigationBar(
        middle: Text(widget.title ?? ''), // 设置导航栏标题
      ),
      body: Center(
        child: FloatingActionButton(
          child: Icon(Icons.input), // 设置按钮图标
          onPressed: () {
            Navigator.push(
              context,
              CupertinoPageRoute(builder: (context) {
                return Scaffold(
                  appBar: CupertinoNavigationBar(
                    padding: EdgeInsetsDirectional.only(start: 0), // 设置导航栏内边距
                    leading: CupertinoButton(
                      padding: EdgeInsets.all(0), // 设置按钮内边距
                      child: Icon(Icons.arrow_back, color: Colors.white,), // 返回按钮图标
                      onPressed: () {
                        if (Navigator.canPop(context)) {
                          Navigator.pop(context); // 返回上一页
                        }
                      },
                    ),
                    middle: Text('BTC-USDT', style: TextStyle(color: Colors.white),), // 设置中间标题
                    backgroundColor: kBackgroundColor, // 设置背景颜色
                  ),
                  body: Container(
                    color: kBackgroundColor, // 设置页面背景颜色
                    child: ListView(
                      children: [
                        KlinePageWidget(bloc), // 绘制 K 线图
                        Center(
                          child: Container(
                            margin: EdgeInsets.only(top: 20), // 设置上下间距
                            child: Text(
                              '财富自由', // 提示文字
                              style: TextStyle(fontSize: 12, color: Colors.blueGrey),
                            ),
                          ),
                        ),
                      ],
                    ),
                  ),
                );
              }),
            );
          },
        ),
      ),
    );
  }
}

// 加载本地 JSON 文件
Future<String> loadAsset() async {
  return await rootBundle.loadString('json/btcusdt.json'); // 加载本地 JSON 文件
}

// 获取远程数据
Future<String?> getIPAddress(String period) async {
  if (period == null) {
    period = '1day'; // 默认周期
  }
  var url =
      'https://api.huobi.pro/market/history/kline?period=$period&size=449&symbol=btcusdt'; // Huobi API 地址
  String? result;

  var response = await http.get(Uri.parse(url)); // 发送 HTTP 请求
  if (response.statusCode == HttpStatus.ok) {
    result = response.body; // 获取响应数据
  } else {
    print('Failed getting IP address'); // 打印错误信息
  }
  return result;
}

// 自定义 K 线图 Bloc
class KlinePageBloc extends KlineBloc {
  @override
  void periodSwitch(String period) {
    _getData(period); // 切换周期时获取数据
    super.periodSwitch(period); // 调用父类方法
  }

  @override
  void initData() {
    _getData('1day'); // 初始化数据
    super.initData();
  }

  // 获取数据逻辑
  _getData(String period) {
    this.showLoadingSinkAdd(true); // 显示加载动画
    Future<String?> future = getIPAddress('$period'); // 异步获取数据
    future.then((result) {
      final parseJson = json.decode(result ?? ''); // 解析 JSON 数据
      MarketData marketData = MarketData.fromJson(parseJson); // 将 JSON 数据映射到模型
      List<Market> list = [];
      for (var item in marketData.data ?? []) { // 遍历数据并生成 Market 对象
        Market market = Market(
          item.open, item.high, item.low, item.close, item.vol, item.id); // 构造 Market 对象
        list.add(market); // 添加到列表
      }
      this.showLoadingSinkAdd(false); // 隐藏加载动画
      this.updateDataList(list); // 更新数据列表
    });
  }
}

说明

  1. 依赖配置
    pubspec.yaml 文件中添加以下依赖:
    dependencies:
      flutter_kline: ^版本号

更多关于Flutter K线图绘制插件flutter_kline的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter K线图绘制插件flutter_kline的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


flutter_kline 是一个用于在 Flutter 应用中绘制 K 线图(也称为蜡烛图)的插件。它可以帮助你展示股票、加密货币等金融产品的价格走势。以下是使用 flutter_kline 插件的基本步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  flutter_kline: ^latest_version

然后运行 flutter pub get 来获取依赖。

2. 导入插件

在你的 Dart 文件中导入 flutter_kline 插件:

import 'package:flutter_kline/flutter_kline.dart';

3. 使用 K 线图组件

flutter_kline 提供了 KLineChart 组件,你可以直接在应用中使用它来展示 K 线图。

class KLineChartExample extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('K线图示例'),
      ),
      body: Center(
        child: KLineChart(
          // 传入 K 线数据
          data: _generateKLineData(),
          // 配置参数(可选)
          config: KLineConfig(
            // 设置 K 线图的主题颜色
            theme: KLineTheme.light(),
            // 设置 K 线图的时间周期
            period: KLinePeriod.day,
          ),
        ),
      ),
    );
  }

  // 生成示例 K 线数据
  List<KLineEntity> _generateKLineData() {
    // 这里可以根据需要生成或从API获取K线数据
    return [
      KLineEntity(
        open: 100.0,
        close: 105.0,
        high: 110.0,
        low: 95.0,
        volume: 1000,
        timestamp: DateTime.now().millisecondsSinceEpoch,
      ),
      KLineEntity(
        open: 105.0,
        close: 102.0,
        high: 108.0,
        low: 100.0,
        volume: 1200,
        timestamp: DateTime.now().add(Duration(days: 1)).millisecondsSinceEpoch,
      ),
      // 添加更多 K 线数据...
    ];
  }
}

4. 配置 K 线图

KLineChart 组件提供了多种配置选项,你可以根据需要自定义 K 线图的外观和行为。以下是一些常见的配置选项:

  • theme: 设置 K 线图的主题颜色(KLineTheme.light()KLineTheme.dark())。
  • period: 设置 K 线图的时间周期(如 KLinePeriod.dayKLinePeriod.week 等)。
  • indicators: 添加技术指标(如 MACDKDJ 等)。
  • onLoadMore: 加载更多数据的回调函数。

5. 处理用户交互

flutter_kline 支持用户交互,例如缩放、滑动等。你可以通过监听 KLineChart 的事件来处理用户的交互操作。

KLineChart(
  data: _generateKLineData(),
  config: KLineConfig(
    theme: KLineTheme.light(),
    period: KLinePeriod.day,
  ),
  onLoadMore: (period) async {
    // 当用户滑动到图表底部时,加载更多数据
    List<KLineEntity> moreData = await _fetchMoreData(period);
    return moreData;
  },
);

6. 处理数据源

通常,K 线图的数据是从后端 API 获取的。你可以通过异步请求获取数据,并将数据传递给 KLineChart 组件。

Future<List<KLineEntity>> _fetchKLineData(KLinePeriod period) async {
  // 从API获取K线数据
  // 这里可以根据period参数获取不同时间周期的数据
  // 例如:day, week, month等
  // 返回的数据需要转换为List<KLineEntity>
  return [];
}
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!