import 'dart:math'; import 'package:flutter/material.dart'; import 'package:real_time_chart/real_time_chart.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, ), home: const MyHomePage(title: 'Flutter Demo Home Page'), ); } } class MyHomePage extends StatefulWidget { const MyHomePage({super.key, required this.title}); final String title; @override State createState() => _MyHomePageState(); } class _MyHomePageState extends State { @override Widget build(BuildContext context) { final stream = positiveDataStream(); return Scaffold( appBar: AppBar( title: Text(widget.title), ), body: SizedBox( width: double.maxFinite, child: SingleChildScrollView( child: Column( children: [ SizedBox( width: MediaQuery.of(context).size.width, height: MediaQuery.of(context).size.width * 0.8, child: Padding( padding: const EdgeInsets.all(16.0), child: RealTimeGraph( stream: stream, ), ), ), const SizedBox(height: 32), SizedBox( width: MediaQuery.of(context).size.width, height: MediaQuery.of(context).size.width * 0.8, child: Padding( padding: const EdgeInsets.all(16.0), child: RealTimeGraph( stream: stream, displayMode: ChartDisplay.points, ), ), ), const SizedBox(height: 32), SizedBox( width: MediaQuery.of(context).size.width, height: MediaQuery.of(context).size.width * 0.8, child: Padding( padding: const EdgeInsets.all(16.0), child: RealTimeGraph( stream: stream.map((value) => value - 150), supportNegativeValuesDisplay: true, xAxisColor: Colors.black12, ), ), ), const SizedBox(height: 32), SizedBox( width: MediaQuery.of(context).size.width, height: MediaQuery.of(context).size.width * 0.8, child: Padding( padding: const EdgeInsets.all(16.0), child: RealTimeGraph( stream: stream.map((value) => value - 150), supportNegativeValuesDisplay: true, displayMode: ChartDisplay.points, xAxisColor: Colors.black12, ), ), ), ], ), ), ), ); } Stream positiveDataStream() { return Stream.periodic(const Duration(milliseconds: 500), (_) { return Random().nextInt(300).toDouble(); }).asBroadcastStream(); } }