Flutter K线图绘制插件flutter_kline的使用
Flutter K线图绘制插件flutter_kline的使用
效果图
使用说明
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); // 更新数据列表
});
}
}
说明
- 依赖配置
在pubspec.yaml
文件中添加以下依赖:dependencies: flutter_kline: ^版本号
更多关于Flutter K线图绘制插件flutter_kline的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于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.day
、KLinePeriod.week
等)。indicators
: 添加技术指标(如MACD
、KDJ
等)。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 [];
}