import 'package:flutter/material.dart'; enum Operation { plus, minus, multi, div, point, res, percent, plusMinus, backspace, clear } extension OperationExtension on Operation { String getString() { switch (this) { case Operation.plus: return "+"; case Operation.minus: return "-"; case Operation.multi: return "x"; case Operation.div: return "÷"; case Operation.point: return "."; case Operation.res: return "="; default: throw UnimplementedError(); } } } enum Numbers { zero, one, two, three, four, five, six, seven, eight, nine } extension NumbersExtension on num { num backspace() { String pull = "$this"; pull = pull.substring(0, pull.length - 1); if (pull.isNotEmpty && pull.split('').last.contains('.')) { pull = pull.substring(0, pull.length - 1); } return num.parse(pull, (pull) => 0); } num concat({bool pointer, int value}) { if (pointer == true) { final String pull = "${this}." + "$value"; return num.parse(pull); } else { final String pull = "$this" + "$value"; return num.parse(pull); } } } void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { // This widget is the root of your application. @override Widget build(BuildContext context) { return MaterialApp( title: 'Calculator', theme: ThemeData( primarySwatch: Colors.blue, visualDensity: VisualDensity.adaptivePlatformDensity, ), home: const MyHomePage(title: 'Calculator'), ); } } class MyHomePage extends StatefulWidget { const MyHomePage({Key key, this.title}) : super(key: key); final String title; @override _MyHomePageState createState() => _MyHomePageState(); } class _MyHomePageState extends State { num a, b; bool pointStatus; dynamic operator; String textResh = "0"; void getCalc(dynamic type) { if (type is Numbers) { if (a == null) { a = type.index; setState(() { textResh = '$a'; }); } else if (a != null && operator == null) { if (pointStatus == true) { a = a.concat(pointer: true, value: type.index); pointStatus = false; } else { a = a.concat(pointer: false, value: type.index); } setState(() { textResh = '$a'; }); } else if (operator != null) { if (b == null) { b = type.index; setState(() { textResh = "$a ${(operator as Operation).getString()} $b"; }); } else if (b != null) { if (pointStatus == true) { b = b.concat(pointer: true, value: type.index); pointStatus = false; } else { b = b.concat(pointer: false, value: type.index); } pointStatus = false; setState(() { textResh = "$a ${(operator as Operation).getString()} $b"; }); } } } else if (type is Operation) { if (type == Operation.res) { setState(() { textResh = "$a ${(operator as Operation).getString()} $b"; }); a = operationEvent(a, b, operator as Operation); b = null; operator = null; setState(() { textResh = "$a"; }); } else if (type == Operation.point) { if (a != null && b == null) { if (a is double) { pointStatus = false; setState(() { textResh = "$a"; }); } else { pointStatus = true; setState(() { textResh = "$a."; }); } } else { if (b is double) { pointStatus = false; setState(() { textResh = "$a ${(operator as Operation).getString()} $b"; }); } else { pointStatus = true; setState(() { textResh = "$a ${(operator as Operation).getString()} $b."; }); } } } else if (type == Operation.clear) { a = 0; b = null; operator = null; setState(() { textResh = "$a"; }); } else if (type == Operation.backspace) { if (a != null && b == null) { a = a.backspace(); setState(() { textResh = "$a"; }); } else { b = b.backspace(); setState(() { textResh = "$a ${(operator as Operation).getString()} $b"; }); } } else if (type == Operation.plusMinus) { if (a != null && b == null) { a = a * -1; setState(() { textResh = "$a"; }); } else { b = b * -1; setState(() { textResh = "$a ${(operator as Operation).getString()} $b"; }); } } else if (type == Operation.percent) { if (a != null && b == null) { a = a / 100; setState(() { textResh = "$a"; }); } else { b = b / 100; setState(() { textResh = "$a ${(operator as Operation).getString()} $b"; }); } } else { operator = type; setState(() { textResh = "$a ${(operator as Operation).getString()}"; }); } } } num operationEvent(num x, num y, Operation op) { num result = 0; switch (op) { case Operation.plus: result = x + y; break; case Operation.minus: result = x - y; break; case Operation.multi: result = x * y; break; case Operation.div: result = x / y; break; default: result = 0; break; } if (result % 1 == 0) { return result.toInt(); } else { return result; } } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text(widget.title), ), body: Container( color: const Color(0xFF4b44cf), child: Padding( padding: const EdgeInsets.all(8.0), child: Column( mainAxisSize: MainAxisSize.min, children: [ Expanded( child: Align( alignment: Alignment.centerRight, child: Text( textResh, style: const TextStyle(fontSize: 80, color: Colors.white), ), ), ), Row( children: [ CallButton( text: "±", value: Operation.plusMinus, onPressed: getCalc, ), CallButton( text: "%", value: Operation.percent, onPressed: getCalc), CallButton( text: "⌫", value: Operation.backspace, onPressed: getCalc), CallButton( text: "AC", value: Operation.clear, onPressed: getCalc), ], ), Row( children: [ CallButton( text: "7", value: Numbers.seven, onPressed: getCalc, ), CallButton( text: "8", value: Numbers.eight, onPressed: getCalc), CallButton( text: "9", value: Numbers.nine, onPressed: getCalc), CallButton( text: "/", value: Operation.div, onPressed: getCalc), ], ), Row( children: [ CallButton( text: "4", value: Numbers.four, onPressed: getCalc), CallButton( text: "5", value: Numbers.five, onPressed: getCalc), CallButton( text: "6", value: Numbers.six, onPressed: getCalc), CallButton( text: "*", value: Operation.multi, onPressed: getCalc), ], ), Row( children: [ CallButton( text: "1", value: Numbers.one, onPressed: getCalc), CallButton( text: "2", value: Numbers.two, onPressed: getCalc), CallButton( text: "3", value: Numbers.three, onPressed: getCalc), CallButton( text: "-", value: Operation.minus, onPressed: getCalc), ], ), Row( children: [ CallButton( text: "0", value: Numbers.zero, onPressed: getCalc), CallButton( text: ".", value: Operation.point, onPressed: getCalc), CallButton( text: "=", value: Operation.res, onPressed: getCalc), CallButton( text: "+", value: Operation.plus, onPressed: getCalc, ), ], ), ], ), ), )); } } class CallButton extends StatelessWidget { final String text; final dynamic value; final void Function(dynamic) onPressed; const CallButton( {@required this.text, @required this.value, @required this.onPressed}); @override Widget build(BuildContext context) { return Expanded( child: Padding( padding: const EdgeInsets.all(2.0), child: Container( clipBehavior: Clip.antiAlias, width: 100, decoration: BoxDecoration( borderRadius: BorderRadius.circular(12), color: const Color(0xE0E0E0E0)), child: FlatButton( height: 60, onPressed: () => onPressed(value), child: Text( text, style: TextStyle(fontSize: 40, color: Colors.blue[900]), ), ), ), ), ); } }