You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

219 lines
7.3 KiB

2 years ago
import 'dart:async';
2 years ago
import 'dart:math';
2 years ago
import 'package:fl_chart/fl_chart.dart';
2 years ago
import 'package:flutter/material.dart';
import 'package:flutter_ring_indicator/ring_indicator.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
brightness: Brightness.dark,
2 years ago
),
home: const MyHomePage(title: 'Flutter Demo Home Page'),
2 years ago
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key, required this.title});
final String title;
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
double value1 = 30;
double value2 = 50;
double value3 = 10;
2 years ago
2 years ago
List<double> points = [0];
2 years ago
void _incrementCounter() {
setState(() {
value1 = Random().nextDouble() * 100;
value2 = Random().nextDouble() * 100;
value3 = Random().nextDouble() * 100;
2 years ago
points.add(value2 - 20);
if (points.length > 20) points.removeAt(0);
2 years ago
});
}
@override
2 years ago
void initState() {
Timer.periodic(const Duration(seconds: 1), (timer) => _incrementCounter());
super.initState();
}
@override
2 years ago
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
SizedBox.square(
2 years ago
dimension: 240,
2 years ago
child: RingIndicator(
ringColor: Colors.deepPurpleAccent,
startAngel: pi * -0.7,
endAngel: pi * 0.7,
maxValue: 100,
value: value1,
labelBuilder: (values) {
return [
const Align(
alignment: Alignment.bottomCenter,
child: Text(
'CPU',
style: TextStyle(fontSize: 38),
),
),
Center(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
2 years ago
Text('温度 ${values.level(1)?.toStringAsFixed(1) ?? '/'}',
style: const TextStyle(fontSize: 18)),
Text('频率 ${((values.level(0) ?? 0) / 20).toStringAsFixed(1)} GHz',
style: const TextStyle(fontSize: 24)),
Text('利用率 ${values.level(2)?.toStringAsFixed(1) ?? '/'} %',
style: const TextStyle(fontSize: 18)),
],
),
),
];
},
innerRing: RingIndicator(
startAngel: pi * -0.7,
endAngel: pi * 0.7,
maxValue: 100,
ringColor: Colors.teal,
value: value2,
innerRing: RingIndicator(
startAngel: pi * -0.7,
endAngel: pi * 0.7,
ringColor: Colors.amber,
maxValue: 100,
value: value3,
),
),
2 years ago
),
),
const SizedBox(height: 50),
SizedBox.square(
2 years ago
dimension: 240,
child: RingIndicator(
ringColor: Colors.teal,
startAngel: halfPi,
maxValue: 100,
value: value1,
labelBuilder: (values) => [
const Align(
alignment: Alignment.topRight,
child: Text('RAM', style: TextStyle(fontSize: 38, height: 1.8)),
),
Center(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Text(values.level(2)?.toStringAsFixed(1) ?? '/', style: const TextStyle(fontSize: 18)),
Text(values.level(1)?.toStringAsFixed(1) ?? '/', style: const TextStyle(fontSize: 24)),
Text(values.level(0)?.toStringAsFixed(1) ?? '/', style: const TextStyle(fontSize: 18)),
],
),
),
],
innerRing: RingIndicator(
ringColor: Colors.deepOrange,
startAngel: halfPi,
maxValue: 100,
value: value2,
innerRing: RingIndicator(
ringColor: Colors.indigoAccent,
startAngel: halfPi,
maxValue: 100,
value: value3,
),
),
),
2 years ago
),
2 years ago
const SizedBox(height: 50),
SizedBox.square(
dimension: 240,
child: RingIndicator(
ringColor: Colors.blueAccent,
startAngel: -0.8 * pi,
endAngel: 0.8 * pi,
maxValue: 100,
value: value2,
labelBuilder: (values) => [
const Align(
alignment: Alignment.bottomCenter,
child: Text('占用率', style: TextStyle(fontSize: 28, height: 1.8)),
),
Center(
child: FractionallySizedBox(
widthFactor: 0.8,
heightFactor: 0.4,
child: LineChart(
LineChartData(
maxX: 20,
minX: 0,
maxY: 50,
minY: -50,
lineBarsData: [
LineChartBarData(
spots: <FlSpot>[
...List.generate(20 - points.length, (index) => FlSpot.nullSpot),
...points.reversed
.toList()
.asMap()
.entries
.map((e) => FlSpot(20 - e.key.toDouble(), e.value)),
].reversed.toList(),
isCurved: true,
dotData: FlDotData(show: false),
barWidth: 3,
belowBarData: BarAreaData(
show: false,
),
),
],
titlesData: FlTitlesData(show: false),
borderData: FlBorderData(show: false),
),
swapAnimationDuration: Duration.zero,
),
),
),
],
),
),
2 years ago
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
tooltip: 'Increment',
child: const Icon(Icons.add),
),
);
}
}