import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'result_model.dart'; void main() => runApp(const MyApp()); class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return MultiProvider( providers: [ ChangeNotifierProvider.value( value: ResultModel(), ), ], child: MaterialApp( title: 'Energy', home: MyCustomFormState(title: 'Energy'), )); } } class MyCustomFormState extends StatelessWidget with InputValidationMixin { final String title; MyCustomFormState({required this.title}); final formGlobalKey = GlobalKey(); final _controllerStartHeight = TextEditingController(); final _controllerEndHeight = TextEditingController(); final _controllerStartSpeed = TextEditingController(); final _controllerEndSpeed = TextEditingController(); final _controllerWeight = TextEditingController(); void _changeJoule(BuildContext context) { Provider.of(context, listen: false).changeJoule( double.parse(_controllerWeight.text), double.parse(_controllerStartSpeed.text), double.parse(_controllerEndSpeed.text), double.parse(_controllerStartHeight.text), double.parse(_controllerEndHeight.text), ); } @override Widget build(BuildContext context) { double _joule = Provider.of(context).getJoule; String _energyWater = Provider.of(context).getWater; String _energyIron = Provider.of(context).getIron; return Scaffold( appBar: AppBar( title: Text(title), ), body: Padding( padding: const EdgeInsets.symmetric(horizontal: 16.0), child: Form( key: formGlobalKey, child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ TextFormField( controller: _controllerStartHeight, decoration: const InputDecoration( labelText: 'Start height', hintText: 'Enter the height at the start (in meters)'), validator: (value) { if (isInputValid(value.toString())) { return 'Please enter a floating point number'; } }, ), TextFormField( controller: _controllerEndHeight, decoration: const InputDecoration( labelText: 'End height', hintText: 'Enter the height at the end (in meters)'), validator: (value) { if (isInputValid(value.toString())) { return 'Please enter a floating point number'; } }, ), TextFormField( controller: _controllerStartSpeed, decoration: const InputDecoration( labelText: 'Start speed', hintText: 'Enter the speed at the end (in m/s)'), validator: (value) { if (isInputValid(value.toString())) { return 'Please enter a floating point number'; } }, ), TextFormField( controller: _controllerEndSpeed, decoration: const InputDecoration( labelText: 'End speed', hintText: 'Enter the speed at the end (in m/s)'), validator: (value) { if (isInputValid(value.toString())) { return 'Please enter a floating point number'; } }, ), TextFormField( controller: _controllerWeight, decoration: const InputDecoration( labelText: 'Weight', hintText: 'Enter the weight of the object (in kg)'), validator: (value) { if (isInputValid(value.toString())) { return 'Please enter a floating point number'; } }, ), Padding( padding: const EdgeInsets.symmetric(horizontal: 225.0), child: FittedBox( child: Text( '$_joule Joule \n' '$_energyWater Liter Wasser können damit erhitzt werden \n' '$_energyIron kg Eisen können damit zu glühen gebracht werden', style: const TextStyle( fontSize: 20.0, ), textAlign: TextAlign.center, ))), Padding( padding: const EdgeInsets.symmetric(horizontal: 425.0), child: ElevatedButton( onPressed: () => { if (formGlobalKey.currentState!.validate()) {formGlobalKey.currentState!.save()}, _changeJoule(context), }, child: const Text('Submit', style: TextStyle( fontSize: 20.0, )), ), ), ], ), ))); } } mixin InputValidationMixin { bool isInputValid(String value) => !new RegExp(r'[0-9]+.?[0-9]*').hasMatch(value); }