Bagan batang horizontal di Flutter
Saya mencoba membuat grafik batang horizontal dengan flutter. Saya menemukan paket ini fl_charts dan charts_flutter. tapi saya perlu menyesuaikan tampilannya agar sesuai dengan gambar berikut yang saya lampirkan. Jika ada juara yang dapat mendukung saya dalam memberi saya langkah-langkah bagaimana mencapai ini atau kode teladan akan sangat membantu. Terima kasih banyak sebelumnya.
Jawaban
Gunakan LayoutBuilder untuk mengetahui kemungkinan lebarnya, dan IntrinsicWidth untuk menghitung tempat judul dan angka, tetapi pada saat yang sama jangan menciutkan teks judul yang panjang.
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: Scaffold(
body: SafeArea(
child: MyHomePage(),
),
),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.all(10.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
_title('Food Weight(grams)'),
Padding(
padding: const EdgeInsets.only(left: 20),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
ChartLine(title: 'Fat', number: 1800, rate: 1),
ChartLine(title: 'Protein', number: 600, rate: 0.4)
],
),
),
_title('Ratios'),
Padding(
padding: const EdgeInsets.only(left: 20),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
ChartLine(
title: 'Calculum/Phosporous ratio = 2:1',
rate: 0.5,
),
ChartLine(
title: 'Omega3/6 ratio = 1:4',
rate: 0.4,
),
],
),
),
],
),
);
}
Widget _title(String title) {
return Padding(
padding: const EdgeInsets.only(bottom: 8.0, top: 4),
child: Text(
title,
style: TextStyle(fontSize: 18),
),
);
}
}
class ChartLine extends StatelessWidget {
const ChartLine({
Key key,
@required this.rate,
@required this.title,
this.number,
}) : assert(title != null),
assert(rate != null),
assert(rate > 0),
assert(rate <= 1),
super(key: key);
final double rate;
final String title;
final int number;
@override
Widget build(BuildContext context) {
return LayoutBuilder(builder: (context, constraints) {
final lineWidget = constraints.maxWidth * rate;
return Padding(
padding: const EdgeInsets.only(bottom: 10.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
constraints: BoxConstraints(minWidth: lineWidget),
child: IntrinsicWidth(
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
title,
style: TextStyle(
fontSize: 18,
),
),
if (number != null)
Text(
number.toString(),
style: TextStyle(
fontSize: 18,
fontWeight: FontWeight.bold,
),
),
],
),
),
),
Container(
color: Colors.blue,
height: 60,
width: lineWidget,
),
],
),
);
});
}
}
Anda dapat menggunakan paket bagan Flutter Syncfusion, seperti yang saya gunakan sekarang untuk aplikasi saya. Menggunakan widget SfCartesianChart Syncfusion, render diagram batang bersama dengan label data dan dengan mengubah posisi default label data, output Anda dapat dicapai. Widget ini berfungsi di platform Android, iOS, dan web.
- Paket- https://pub.dev/packages/syncfusion_flutter_charts
- Fitur- https://www.syncfusion.com/flutter-widgets/flutter-charts
- Dokumentasi- https://help.syncfusion.com/flutter/cartesian-charts/overview