Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import 'package:flutter/material.dart';
- import 'package:math_expressions/math_expressions.dart';
- import 'package:shared_preferences/shared_preferences.dart';
- class CalculatorScreen2 extends StatefulWidget {
- const CalculatorScreen2({super.key});
- @override
- _CalculatorScreen2State createState() => _CalculatorScreen2State();
- }
- class _CalculatorScreen2State extends State<CalculatorScreen2> {
- String _expression = '';
- String _result = '';
- String themeMode = 'dark';
- final List<String> _buttons = [
- 'C', '⌫', '%', '÷',
- '7', '8', '9', '×',
- '4', '5', '6', '-',
- '1', '2', '3', '+',
- '0', '.', '=',
- ];
- bool _isOperator(String s) {
- return ['+', '-', '×', '÷', '%', '*', '/'].contains(s);
- }
- void _buttonPressed(String text) {
- setState(() {
- if (text == 'C') {
- _expression = '';
- _result = '';
- } else if (text == '⌫') {
- if (_expression.isNotEmpty) {
- _expression = _expression.substring(0, _expression.length - 1);
- }
- } else if (text == '=') {
- _calculateResult();
- } else if (text == '.') {
- int lastOp = _expression.lastIndexOf(RegExp(r'[\+\-\×\÷\*\/%]'));
- String lastNumber = lastOp == -1 ? _expression : _expression.substring(lastOp + 1);
- if (!lastNumber.contains('.')) {
- _expression += text;
- }
- } else {
- if (_expression.isNotEmpty &&
- _isOperator(text) &&
- _isOperator(_expression[_expression.length - 1])) {
- _expression = _expression.substring(0, _expression.length - 1) + text;
- } else {
- _expression += text;
- }
- }
- });
- }
- void _calculateResult() {
- try {
- if (_expression.isEmpty) return;
- // Remove trailing operator if any
- while (_expression.isNotEmpty && _isOperator(_expression[_expression.length - 1])) {
- _expression = _expression.substring(0, _expression.length - 1);
- }
- if (_expression.isEmpty) return;
- String finalExpression = _expression
- .replaceAll('×', '*')
- .replaceAll('÷', '/')
- .replaceAll('%', '/100');
- Parser p = Parser();
- Expression exp = p.parse(finalExpression);
- ContextModel cm = ContextModel();
- double eval = exp.evaluate(EvaluationType.REAL, cm);
- String res = eval.toString();
- if (res.endsWith('.0')) res = res.substring(0, res.length - 2);
- _result = res;
- } catch (e) {
- _result = 'Error';
- }
- }
- Future<void> loadTheme() async {
- final prefs = await SharedPreferences.getInstance();
- setState(() {
- themeMode = prefs.getString('theme') ?? 'dark';
- });
- }
- Future<void> saveTheme(String mode) async {
- final prefs = await SharedPreferences.getInstance();
- await prefs.setString('theme', mode);
- }
- @override
- void initState() {
- super.initState();
- loadTheme();
- }
- Color _getButtonColor(String text) {
- if (text == 'C') return Colors.redAccent;
- if (text == '=' || text == '+' || text == '-' || text == '×' || text == '÷') {
- return Colors.blueAccent;
- }
- return themeMode == 'dark' ? Colors.grey[850]! : Colors.grey[300]!;
- }
- Color _getTextColor(String text) {
- if (text == 'C' || text == '=' || text == '+' || text == '-' || text == '×' || text == '÷') {
- return Colors.white;
- }
- return themeMode == 'dark' ? Colors.white70 : Colors.black87;
- }
- @override
- Widget build(BuildContext context) {
- final bool isDark = themeMode == 'dark';
- return Scaffold(
- appBar: AppBar(
- title: const Text('Calculator App'),
- centerTitle: true,
- actions: [
- IconButton(
- onPressed: () {
- setState(() {
- themeMode = isDark ? 'light' : 'dark';
- });
- saveTheme(themeMode);
- },
- icon: Icon(isDark ? Icons.sunny : Icons.dark_mode),
- ),
- ],
- ),
- backgroundColor: isDark ? Colors.black : Colors.white,
- body: SafeArea(
- child: Column(
- mainAxisAlignment: MainAxisAlignment.end,
- children: [
- Container(
- padding: const EdgeInsets.all(20),
- alignment: Alignment.centerRight,
- child: Text(
- _expression,
- style: TextStyle(
- fontSize: 30,
- color: isDark ? Colors.white : Colors.black,
- ),
- ),
- ),
- Container(
- padding: const EdgeInsets.all(20),
- alignment: Alignment.centerRight,
- child: Text(
- _result,
- style: TextStyle(
- fontSize: 40,
- color: isDark ? Colors.white : Colors.black,
- fontWeight: FontWeight.bold,
- ),
- ),
- ),
- Divider(color: isDark ? Colors.white24 : Colors.black12),
- Expanded(
- flex: 2,
- child: Container(
- padding: const EdgeInsets.all(10),
- child: GridView.builder(
- itemCount: _buttons.length,
- gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
- crossAxisCount: 4,
- mainAxisSpacing: 10,
- crossAxisSpacing: 10,
- ),
- itemBuilder: (context, index) {
- final buttonText = _buttons[index];
- return ElevatedButton(
- style: ElevatedButton.styleFrom(
- shape: const CircleBorder(),
- padding: const EdgeInsets.all(20),
- backgroundColor: _getButtonColor(buttonText),
- ),
- onPressed: () => _buttonPressed(buttonText),
- child: Text(
- buttonText,
- style: TextStyle(
- fontSize: 24,
- color: _getTextColor(buttonText),
- fontWeight: FontWeight.bold,
- ),
- ),
- );
- },
- ),
- ),
- ),
- ],
- ),
- ),
- );
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment