cpd_2022_energy/lib/main.dart

518 lines
17 KiB
Dart
Raw Normal View History

2022-11-09 11:46:41 +01:00
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:provider/provider.dart';
void main() {
runApp(const EnergyProviderApp());
}
class EnergyModel extends ChangeNotifier {
String startheight = "";
String endheight = "";
String startspeed="";
String endspeed="";
String weight="";
EnergyModel(){
startheight;
endheight;
startspeed;
endspeed;
weight;
}
void setStartheight(String input){
startheight=input;
}
void setEndheight(String input){
endheight= input;
}
void setStartspeed(String input){
startspeed=input;
}
void setEndspeed(String input){
endspeed=input;
}
void setWeight(String input){
weight=input;
}
void changeInput(String input) {
startheight = input;
notifyListeners();
}
}
class KineticModel extends ChangeNotifier{
String startheight = "";
String endheight = "";
String startspeed="";
String endspeed="";
String weight="";
KineticModel(){
startspeed;
endspeed;
weight;
}
void setStartspeed(String input){
startspeed=input;
}
void setEndspeed(String input){
endspeed=input;
}
void setWeight(String input){
weight=input;
}
void update(){
notifyListeners();
}
}
class PotentialModel extends ChangeNotifier{
String startheight = "";
String endheight = "";
String weight="";
PotentialModel(){
startheight;
endheight;
weight;
}
void setStartheight(String input){
startheight=input;
}
void setEndheight(String input){
endheight=input;
}
void setWeight(String input){
weight=input;
}
void update(){
notifyListeners();
}
}
class PotentialCalc extends StatelessWidget{
PotentialCalc({super.key});
final _formKey = GlobalKey<FormState>();
double calcPotentialE(double mass, double startheight, double endheight){
double height = (startheight-endheight).abs();
return mass * 9.81 * height;
}
double calcWater(double e){
return e/(80*4190);
}
double calcIron(double e){
return e/(460*680);
}
double joule=0.0;
double water=0.0;
double iron=0.0;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text("Potentielle Energie"),
),
body: ChangeNotifierProvider(
create: (_) => PotentialModel(),
child: Center(
child: Column(
children: [
Consumer<PotentialModel>(
builder: (context, model, child) => Column(
children: [
Center(
child: Form(
key: _formKey,
child: Column(
children: <Widget>[
const Padding(
padding: const EdgeInsets.all(8.0),
child: const Text("Geben Sie Ihre Werte ein"),
),
//Anfangsgeschwindigkeit
Padding(
padding: const EdgeInsets.only(left: 8, top: 40, right: 8, bottom: 0),
child: TextFormField(
onSaved: (String? val) {
model.setStartheight(val!);
},
keyboardType: TextInputType.numberWithOptions(decimal: true),
inputFormatters: [
FilteringTextInputFormatter.allow(RegExp(r"^((\d+)?(\.)?(\d{1,2})?)"))
],
decoration: const InputDecoration(
border: OutlineInputBorder(),
labelText: "Anfangshöhe in Meter",
hintText: "Geben Sie eine Dezimalzahl an",
),
),
),
//Endgeschwindigkeit
Padding(
padding: const EdgeInsets.only(left: 8, top: 8, right: 8, bottom: 0),
child: TextFormField(
onSaved: (String? val) {
model.setEndheight(val!);
},
keyboardType: TextInputType.numberWithOptions(decimal: true),
inputFormatters: [
FilteringTextInputFormatter.allow(RegExp(r"^((\d+)?(\.)?(\d{1,2})?)"))
],
decoration: const InputDecoration(
border: OutlineInputBorder(),
labelText: "Endhöhe in Meter",
hintText: "Geben Sie eine Dezimalzahl an",
),
),
),
// Gewicht des Objekts
Padding(
padding: const EdgeInsets.only(left: 8, top: 40, right: 8, bottom: 0),
child: TextFormField(
onSaved: (String? val) {
model.setWeight(val!);
},
keyboardType: TextInputType.numberWithOptions(decimal: true),
inputFormatters: [
FilteringTextInputFormatter.allow(RegExp(r"^((\d+)?(\.)?(\d{1,2})?)"))
],
decoration: const InputDecoration(
border: OutlineInputBorder(),
labelText: "Gewicht in Kilogramm",
hintText: "Geben Sie eine Dezimalzahl an",
),
),
),
IconButton(
onPressed: () {
if(_formKey.currentState!.validate()){
_formKey.currentState!.save();
}
joule=calcPotentialE(double.parse(model.weight), double.parse(model.startheight), double.parse(model.endheight));
water=calcWater(joule);
iron=calcIron(joule);
model.update();
},
icon: const Icon(Icons.calculate, color: Colors.blue),
tooltip: 'Berechne',
),
//Divider
const Divider(
height: 40,
thickness: 2,
color: Colors.black,
),
const Text("Ergebnis:"),
Padding(
padding: const EdgeInsets.only(left: 8, top: 16, right: 8, bottom: 0),
child: Text(
joule.toStringAsFixed(2) +"Joule"
),
),
Padding(
padding: const EdgeInsets.only(left: 8, top: 16, right: 8, bottom: 0),
child: Text(
"Damit kann man "+ water.toStringAsFixed(2) +"l Wasser zum Kochen bringen"
),
),
Padding(
padding: const EdgeInsets.only(left: 8, top: 8, right: 8, bottom: 0),
child: Text(
"Damit kann man "+ iron.toStringAsFixed(2) +"kg Eisen zum Glühen bringen"
),
),
],
),
),
),
],
)
),
],
),
),
),
//TextButton(child: const Text("Berechne"),onPressed: () { },)
);
}
}
class KineticCalc extends StatelessWidget{
KineticCalc({super.key});
final _formKey = GlobalKey<FormState>();
double calcKineticE(double mass, double startspeed, double endspeed){
double speed = (startspeed-endspeed).abs();
return mass * speed * speed/2;
}
double calcWater(double e){
return (e/(80*4190));
}
double calcIron(double e){
return e/(460*680);
}
double joule=0.0;
double water=0;
double iron=0.0;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text("Kinetische Energie"),
),
body: ChangeNotifierProvider(
create: (_) => KineticModel(),
child: Center(
child: Column(
children: [
Consumer<KineticModel>(
builder: (context, model, child) => Column(
children: [
Center(
child: Form(
key: _formKey,
child: Column(
children: <Widget>[
Padding(
padding: const EdgeInsets.all(8.0),
child: const Text("Geben Sie Ihre Werte ein"),
),
//Anfangsgeschwindigkeit
Padding(
padding: const EdgeInsets.only(left: 8, top: 40, right: 8, bottom: 0),
child: TextFormField(
onSaved: (String? val) {
model.setStartspeed(val!);
},
keyboardType: TextInputType.numberWithOptions(decimal: true),
inputFormatters: [
FilteringTextInputFormatter.allow(RegExp(r"^((\d+)?(\.)?(\d{1,2})?)"))
],
decoration: const InputDecoration(
border: OutlineInputBorder(),
labelText: "Anfangsgeschwindigkeit in Meter/Sekunde",
hintText: "Geben Sie eine Dezimalzahl an",
),
),
),
//Endgeschwindigkeit
Padding(
padding: const EdgeInsets.only(left: 8, top: 8, right: 8, bottom: 0),
child: TextFormField(
onSaved: (String? val) {
model.setEndspeed(val!);
},
keyboardType: TextInputType.numberWithOptions(decimal: true),
inputFormatters: [
FilteringTextInputFormatter.allow(RegExp(r"^((\d+)?(\.)?(\d{1,2})?)"))
],
decoration: const InputDecoration(
border: OutlineInputBorder(),
labelText: "Endgeschwindigkeit in Meter/Sekunde",
hintText: "Geben Sie eine Dezimalzahl an",
),
),
),
// Gewicht des Objekts
Padding(
padding: const EdgeInsets.only(left: 8, top: 40, right: 8, bottom: 0),
child: TextFormField(
onSaved: (String? val) {
model.setWeight(val!);
},
keyboardType: TextInputType.numberWithOptions(decimal: true),
inputFormatters: [
FilteringTextInputFormatter.allow(RegExp(r"^((\d+)?(\.)?(\d{1,2})?)"))
],
decoration: const InputDecoration(
border: OutlineInputBorder(),
labelText: "Gewicht in Kilogramm",
hintText: "Geben Sie eine Dezimalzahl an",
),
),
),
IconButton(
onPressed: () {
if(_formKey.currentState!.validate()){
_formKey.currentState!.save();
}
joule=calcKineticE(double.parse(model.weight), double.parse(model.startspeed), double.parse(model.endspeed));
water=calcWater(joule);
iron=calcIron(joule);
model.update();
},
icon: const Icon(Icons.calculate, color: Colors.blue),
tooltip: 'Berechne',
),
//Divider
const Divider(
height: 40,
thickness: 2,
color: Colors.black,
),
const Text("Ergebnis:"),
Padding(
padding: const EdgeInsets.only(left: 8, top: 16, right: 8, bottom: 0),
child: Text(
joule.toStringAsFixed(2)+" Joule"
),
),
Padding(
padding: const EdgeInsets.only(left: 8, top: 16, right: 8, bottom: 0),
child: Text(
"Damit kann man "+ water.toStringAsFixed(2) +"l Wasser zum Kochen bringen"
),
),
Padding(
padding: const EdgeInsets.only(left: 8, top: 8, right: 8, bottom: 0),
child: Text(
"Damit kann man "+ iron.toStringAsFixed(2) +"kg Eisen zum Glühen bringen"
),
),
],
),
),
),
],
)
),
],
),
),
),
//TextButton(child: const Text("Berechne"),onPressed: () { },)
);
}
}
class EnergyProviderApp extends StatelessWidget {
const EnergyProviderApp({super.key});
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Energiebilanz',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const EnergyApp(title: 'Energiebilanz Rechner'),
routes: {
"/kinetic": (context) => KineticCalc(),
"/potential": (context) => PotentialCalc(),
},
);
}
}
class EnergyApp extends StatefulWidget {
const EnergyApp({super.key, required this.title});
final String title;
@override
State<EnergyApp> createState() => _EnergyAppState();
}
class _EnergyAppState extends State<EnergyApp> {
double calcPotentialE(double mass, double startheight, double endheight){
return mass * 9.81 * (startheight - endheight).abs();
}
double calcKineticE(double mass, double startspeed, double endspeed){
double speed = (startspeed-endspeed).abs();
return mass * speed * speed;
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
children: [
Padding(
padding: const EdgeInsets.all(8.0),
child: ElevatedButton(
onPressed: () {Navigator.pushNamed(context,"/kinetic");
},
child: const Text("Kinetische Energie berechnen"),
),
),
Padding(
padding: const EdgeInsets.all(8.0),
child: ElevatedButton(
onPressed: () => {Navigator.pushNamed(context, "/potential")},
child: const Text("Potentielle Energie berechnen"),
),
),
],
),
),
);
}
}