Flutter计算器等号按钮功能实现求助:如何获取计算结果?
Flutter计算器等号功能实现方案
你的代码已经完成了输入逻辑,现在需要实现等号的计算功能。这里提供两种方案:使用第三方包快速实现(支持复杂表达式,适合新手)和手动解析基础运算(适合理解核心逻辑)。
方案一:使用math_expressions包(推荐)
这个包可以解析并计算包含括号、百分比在内的复杂数学表达式,快速完成功能开发。
步骤1:添加依赖
在pubspec.yaml中添加依赖:
dependencies: flutter: sdk: flutter math_expressions: ^2.4.0 # 版本号可按需更新
执行flutter pub get完成安装。
步骤2:修改代码实现计算逻辑
更新_HomeScreenState类,新增计算函数并绑定到等号按钮:
import 'package:flutter/material.dart'; import 'package:math_expressions/math_expressions.dart'; class HomeScreen extends StatefulWidget { const HomeScreen({super.key}); @override State<HomeScreen> createState() => _HomeScreenState(); } class _HomeScreenState extends State<HomeScreen> { String formula = "0"; void addCharacter(String character) { setState(() { if (formula == "0") { formula = character; } else { formula += character; } }); } void clearFormula() { setState(() { formula = "0"; }); } // 新增计算结果的函数 void calculateResult() { setState(() { // 替换界面符号为Dart可识别的运算符 String parsedFormula = formula .replaceAll("÷", "/") .replaceAll("x", "*") .replaceAll("%", "/100"); try { // 解析并计算表达式 Parser parser = Parser(); Expression exp = parser.parse(parsedFormula); ContextModel context = ContextModel(); double result = exp.evaluate(EvaluationType.REAL, context); // 格式化结果:整数显示为整数,小数保留原样 formula = result % 1 == 0 ? result.toInt().toString() : result.toString(); } catch (e) { // 处理无效表达式(如未闭合括号、连续运算符) formula = "Error"; } }); } @override Widget build(BuildContext context) { return Column( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ Center( child: Text( formula, style: const TextStyle(fontSize: 32, fontWeight: FontWeight.bold), )), SizedBox( height: 400, width: 400, child: GridView.count( childAspectRatio: 2, mainAxisSpacing: 12, crossAxisSpacing: 12, shrinkWrap: true, crossAxisCount: 4, children: [ // 其余按钮代码保持不变 ElevatedButton(onPressed: calculateResult, child: const Text("=")), // 其余按钮代码保持不变 ], ), ), ], ); } }
方案二:手动解析基础运算(适合理解原理)
如果不想依赖第三方包,可以实现仅支持加减乘除、百分比的基础运算(不支持运算符优先级和括号):
替换计算函数
将方案一中的calculateResult替换为以下代码:
void calculateResult() { setState(() { try { double num1, num2; // 按运算符拆分表达式并计算 if (formula.contains("+")) { List<String> parts = formula.split("+"); num1 = double.parse(parts[0]); num2 = double.parse(parts[1]); formula = (num1 + num2).toString(); } else if (formula.contains("-")) { List<String> parts = formula.split("-"); num1 = double.parse(parts[0]); num2 = double.parse(parts[1]); formula = (num1 - num2).toString(); } else if (formula.contains("x")) { List<String> parts = formula.split("x"); num1 = double.parse(parts[0]); num2 = double.parse(parts[1]); formula = (num1 * num2).toString(); } else if (formula.contains("÷")) { List<String> parts = formula.split("÷"); num1 = double.parse(parts[0]); num2 = double.parse(parts[1]); if (num2 == 0) { formula = "Error"; return; } formula = (num1 / num2).toString(); } else if (formula.contains("%")) { List<String> parts = formula.split("%"); if (parts.length == 1) { num1 = double.parse(parts[0]); formula = (num1 / 100).toString(); } else { num1 = double.parse(parts[0]); num2 = double.parse(parts[1]); formula = (num1 + num1 * num2 / 100).toString(); } } // 格式化结果 double result = double.parse(formula); formula = result % 1 == 0 ? result.toInt().toString() : result.toString(); } catch (e) { formula = "Error"; } }); }
说明
该方案仅支持单运算符的基础运算,无法处理1+2*3这类需要优先级的表达式,适合新手理解计算逻辑的底层实现。
内容的提问来源于stack exchange,提问作者Niklas Westphal
相关产品推荐
相关产品推荐

