You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 05:01:02