💄 Optimize calculator input
This commit is contained in:
@@ -1,6 +1,4 @@
|
|||||||
import 'package:flutter/foundation.dart';
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:google_fonts/google_fonts.dart';
|
|
||||||
import 'package:latext/latext.dart';
|
import 'package:latext/latext.dart';
|
||||||
import 'package:simple_math_calc/models/calculation_step.dart';
|
import 'package:simple_math_calc/models/calculation_step.dart';
|
||||||
import 'package:simple_math_calc/solver.dart';
|
import 'package:simple_math_calc/solver.dart';
|
||||||
@@ -20,17 +18,11 @@ class _CalculatorHomePageState extends State<CalculatorHomePage> {
|
|||||||
|
|
||||||
CalculationResult? _result;
|
CalculationResult? _result;
|
||||||
bool _isLoading = false;
|
bool _isLoading = false;
|
||||||
bool _isInputFocused = false;
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
super.initState();
|
super.initState();
|
||||||
_focusNode = FocusNode();
|
_focusNode = FocusNode();
|
||||||
_focusNode.addListener(() {
|
|
||||||
setState(() {
|
|
||||||
_isInputFocused = _focusNode.hasFocus;
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -69,21 +61,11 @@ class _CalculatorHomePageState extends State<CalculatorHomePage> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void _insertSymbol(String symbol) {
|
|
||||||
final text = _controller.text;
|
|
||||||
final selection = _controller.selection;
|
|
||||||
final newText = text.replaceRange(selection.start, selection.end, symbol);
|
|
||||||
_controller.text = newText;
|
|
||||||
_controller.selection = TextSelection.collapsed(
|
|
||||||
offset: selection.start + symbol.length,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
appBar: AppBar(
|
appBar: AppBar(
|
||||||
title: const Text('方程与表达式计算器'),
|
title: const Text('计算器'),
|
||||||
centerTitle: false,
|
centerTitle: false,
|
||||||
leading: const Icon(Icons.calculate_outlined),
|
leading: const Icon(Icons.calculate_outlined),
|
||||||
),
|
),
|
||||||
@@ -105,12 +87,10 @@ class _CalculatorHomePageState extends State<CalculatorHomePage> {
|
|||||||
floatingLabelAlignment: FloatingLabelAlignment.center,
|
floatingLabelAlignment: FloatingLabelAlignment.center,
|
||||||
hintText: '例如: 2x^2 - 8x + 6 = 0',
|
hintText: '例如: 2x^2 - 8x + 6 = 0',
|
||||||
),
|
),
|
||||||
keyboardType: kIsWeb
|
keyboardType: TextInputType.numberWithOptions(
|
||||||
? TextInputType.numberWithOptions(
|
signed: true,
|
||||||
signed: true,
|
decimal: true,
|
||||||
decimal: true,
|
),
|
||||||
)
|
|
||||||
: TextInputType.number,
|
|
||||||
onSubmitted: (_) => _solveEquation(),
|
onSubmitted: (_) => _solveEquation(),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@@ -128,7 +108,6 @@ class _CalculatorHomePageState extends State<CalculatorHomePage> {
|
|||||||
? const Center(child: Text('请输入方程开始计算'))
|
? const Center(child: Text('请输入方程开始计算'))
|
||||||
: buildResultView(_result!),
|
: buildResultView(_result!),
|
||||||
),
|
),
|
||||||
if (_isInputFocused) _buildToolbar(),
|
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
@@ -242,152 +221,4 @@ class _CalculatorHomePageState extends State<CalculatorHomePage> {
|
|||||||
],
|
],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget _buildToolbar() {
|
|
||||||
return Material(
|
|
||||||
elevation: 8,
|
|
||||||
child: Padding(
|
|
||||||
padding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 8),
|
|
||||||
child: Column(
|
|
||||||
mainAxisSize: MainAxisSize.min,
|
|
||||||
children: [
|
|
||||||
Row(
|
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
|
||||||
spacing: 8,
|
|
||||||
children: [
|
|
||||||
Expanded(
|
|
||||||
child: Tooltip(
|
|
||||||
message: '左括号',
|
|
||||||
child: FilledButton.tonal(
|
|
||||||
onPressed: () => _insertSymbol('('),
|
|
||||||
child: Text('(', style: GoogleFonts.robotoMono()),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
Expanded(
|
|
||||||
child: Tooltip(
|
|
||||||
message: '右括号',
|
|
||||||
child: FilledButton.tonal(
|
|
||||||
onPressed: () => _insertSymbol(')'),
|
|
||||||
child: Text(')', style: GoogleFonts.robotoMono()),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
Expanded(
|
|
||||||
child: Tooltip(
|
|
||||||
message: '幂符号',
|
|
||||||
child: FilledButton.tonal(
|
|
||||||
onPressed: () => _insertSymbol('^'),
|
|
||||||
child: Text('^', style: GoogleFonts.robotoMono()),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
Expanded(
|
|
||||||
child: Tooltip(
|
|
||||||
message: '平方',
|
|
||||||
child: FilledButton.tonal(
|
|
||||||
onPressed: () => _insertSymbol('^2'),
|
|
||||||
child: Text('²', style: GoogleFonts.robotoMono()),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
Expanded(
|
|
||||||
child: Tooltip(
|
|
||||||
message: '未知数',
|
|
||||||
child: FilledButton.tonal(
|
|
||||||
onPressed: () => _insertSymbol('x'),
|
|
||||||
child: Text('x', style: GoogleFonts.robotoMono()),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
Expanded(
|
|
||||||
child: Tooltip(
|
|
||||||
message: '未知数二号',
|
|
||||||
child: FilledButton.tonal(
|
|
||||||
onPressed: () => _insertSymbol('y'),
|
|
||||||
child: Text('y', style: GoogleFonts.robotoMono()),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
const SizedBox(height: 8),
|
|
||||||
Row(
|
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
|
||||||
spacing: 8,
|
|
||||||
children: [
|
|
||||||
Expanded(
|
|
||||||
child: Tooltip(
|
|
||||||
message: '加法',
|
|
||||||
child: FilledButton.tonal(
|
|
||||||
onPressed: () => _insertSymbol('+'),
|
|
||||||
child: Text('+', style: GoogleFonts.robotoMono()),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
Expanded(
|
|
||||||
child: Tooltip(
|
|
||||||
message: '减法',
|
|
||||||
child: FilledButton.tonal(
|
|
||||||
onPressed: () => _insertSymbol('-'),
|
|
||||||
child: Text('-', style: GoogleFonts.robotoMono()),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
Expanded(
|
|
||||||
child: Tooltip(
|
|
||||||
message: '乘法',
|
|
||||||
child: FilledButton.tonal(
|
|
||||||
onPressed: () => _insertSymbol('*'),
|
|
||||||
child: Text('*', style: GoogleFonts.robotoMono()),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
Expanded(
|
|
||||||
child: Tooltip(
|
|
||||||
message: '除法',
|
|
||||||
child: FilledButton.tonal(
|
|
||||||
onPressed: () => _insertSymbol('/'),
|
|
||||||
child: Text('/', style: GoogleFonts.robotoMono()),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
Expanded(
|
|
||||||
child: Tooltip(
|
|
||||||
message: '小数点',
|
|
||||||
child: FilledButton.tonal(
|
|
||||||
onPressed: () => _insertSymbol('.'),
|
|
||||||
child: Text('.', style: GoogleFonts.robotoMono()),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
Expanded(
|
|
||||||
child: Tooltip(
|
|
||||||
message: '等于号',
|
|
||||||
child: FilledButton.tonal(
|
|
||||||
onPressed: () => _insertSymbol('='),
|
|
||||||
child: Text('=', style: GoogleFonts.robotoMono()),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
if (!kIsWeb) const SizedBox(height: 8),
|
|
||||||
if (!kIsWeb)
|
|
||||||
Row(
|
|
||||||
children: [
|
|
||||||
Expanded(
|
|
||||||
child: FilledButton.icon(
|
|
||||||
icon: const Icon(Icons.keyboard_hide),
|
|
||||||
onPressed: () => _focusNode.unfocus(),
|
|
||||||
label: Text('收起键盘'),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user