f_k_chart 1.6.0 f_k_chart: ^1.6.0 copied to clipboard
equity market chart.
import 'dart:convert';
import 'dart:math';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:f_k_chart/f_k_chart.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.green,
),
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> {
List<KLineEntity> datas = [];
bool showLoading = true;
MainState _mainState = MainState.BOLL;
bool _volHidden = false;
SecondaryState _secondaryState = SecondaryState.MACD;
bool isLine = true;
bool isChinese = true;
bool _hideGrid = false;
bool _showNowPrice = true;
bool isChangeUI = false;
String uniqueMark;
@override
void initState() {
super.initState();
getData('1day');
}
@override
Widget build(BuildContext context) {
return ListView(
shrinkWrap: true,
children: <Widget>[
Stack(children: <Widget>[
Container(
height: 450,
width: double.infinity,
child: KlineScrollWidget(
datas,
isLine: isLine,
pointWidth: isLine ? 1.3 : ChartStyle.pointWidth,
canScale: isLine ? false : true,
maxRectWidth: isLine ? null : 15.0,
minRectWidth: isLine ? null : 4.0,
mainState: _mainState,
secondaryState: _secondaryState,
edge: EdgeInsets.only(right: 0.0),
userFriendlyMinPointWidth: 2,
uniqueMark: uniqueMark,
),
),
if (showLoading)
Container(
width: double.infinity,
height: 450,
alignment: Alignment.center,
child: const CircularProgressIndicator()),
]),
buildButtons(),
],
);
}
Widget buildButtons() {
return Wrap(
alignment: WrapAlignment.spaceEvenly,
children: <Widget>[
button("Time Mode", onPressed: () {
isLine = true;
uniqueMark = Random().nextDouble().toString();
}),
button("K Line Mode", onPressed: () {
isLine = false;
uniqueMark = Random().nextDouble().toString();
}),
button("Line:MA", onPressed: () => _mainState = MainState.MA),
button("Line:BOLL", onPressed: () => _mainState = MainState.BOLL),
button("Hide Line", onPressed: () => _mainState = MainState.NONE),
button("Secondary Chart:MACD", onPressed: () => _secondaryState = SecondaryState.MACD),
button("Secondary Chart:KDJ", onPressed: () => _secondaryState = SecondaryState.KDJ),
button("Secondary Chart:RSI", onPressed: () => _secondaryState = SecondaryState.RSI),
button("Secondary Chart:WR", onPressed: () => _secondaryState = SecondaryState.WR),
button("Secondary Chart:Hide", onPressed: () => _secondaryState = SecondaryState.NONE),
button(_volHidden ? "Show Vol" : "Hide Vol", onPressed: () => _volHidden = !_volHidden),
button("Change Language", onPressed: () => isChinese = !isChinese),
button(_hideGrid ? "Show Grid" : "Hide Grid", onPressed: () => _hideGrid = !_hideGrid),
button(_showNowPrice ? "Hide Now Price" : "Show Now Price", onPressed: () => _showNowPrice = !_showNowPrice),
button("Customize UI", onPressed: () {
getData('1day');
}),
button("getData", onPressed: () {
getData2('1day');
}),
],
);
}
Widget button(String text, {VoidCallback onPressed}) {
return TextButton(
onPressed: () {
if (onPressed != null) {
onPressed();
setState(() {});
}
},
child: Text(text),
style: TextButton.styleFrom(
primary: Colors.white,
minimumSize: const Size(88, 44),
padding: const EdgeInsets.symmetric(horizontal: 16.0),
shape: const RoundedRectangleBorder(
borderRadius: BorderRadius.all(Radius.circular(2.0)),
),
backgroundColor: Colors.blue,
),
);
}
void getData(String period) {
uniqueMark = Random().nextDouble().toString();
var parseJson = {"ch": "market.btcusdt.kline.1day", "status": "ok", "ts": 1633682856059, "data": []};
final list = parseJson['data'] as List<dynamic>;
datas = list
.map((item) {
KLineEntity k = KLineEntity.fromJson(item as Map<String, dynamic>);
k.time = item['id'];
return k;
})
.toList()
.reversed
.toList()
.cast<KLineEntity>();
DataUtil.calculate(datas);
showLoading = false;
Future.delayed(Duration(seconds: 3), () {
setState(() {
//print('${datas}');
});
});
// final Future<String> future = getIPAddress(period);
// future.then((String result) {
// final Map parseJson = json.decode(result) as Map<dynamic, dynamic>;
// final list = parseJson['data'] as List<dynamic>;
// datas = list
// .map((item) => KLineEntity.fromJson(item as Map<String, dynamic>))
// .toList()
// .reversed
// .toList()
// .cast<KLineEntity>();
// DataUtil.calculate(datas!);
// showLoading = false;
// setState(() {});
// }).catchError((_) {
// showLoading = false;
// setState(() {});
// print('### datas error $_');
// });
}
void getData2(String period) {
uniqueMark = Random().nextDouble().toString();
List data = getData3();
var parseJson = {
"ch": "market.btcusdt.kline.1day",
"status": "ok",
"ts": 1633682856059,
"data":data
};
final list = parseJson['data'] as List<dynamic>;
datas = list
.map((item) {
KLineEntity k = KLineEntity.fromJson(item as Map<String, dynamic>);
// k.time = item['time'];
k.vol = double.parse(item['time'].toString());
return k;
})
.toList()
.reversed
.toList()
.cast<KLineEntity>();
DataUtil.calculate(datas);
showLoading = false;
Future.delayed(Duration(seconds: 3), () {
setState(() {
//print('${datas}');
});
});
// final Future<String> future = getIPAddress(period);
// future.then((String result) {
// final Map parseJson = json.decode(result) as Map<dynamic, dynamic>;
// final list = parseJson['data'] as List<dynamic>;
// datas = list
// .map((item) => KLineEntity.fromJson(item as Map<String, dynamic>))
// .toList()
// .reversed
// .toList()
// .cast<KLineEntity>();
// DataUtil.calculate(datas!);
// showLoading = false;
// setState(() {});
// }).catchError((_) {
// showLoading = false;
// setState(() {});
// print('### datas error $_');
// });
}
List getData3() {
return [];
}
// //获取火币数据,需要翻墙
// Future<String> getIPAddress(String? period) async {
// var url =
// 'https://api.huobi.br.com/market/history/kline?period=${period ?? '1day'}&size=300&symbol=btcusdt';
// late String result;
// final response = await http.get(Uri.parse(url));
// if (response.statusCode == 200) {
// result = response.body;
// } else {
// print('Failed getting IP address');
// }
// return result;
// }
}