Preparo para fórmulas que devuelven cadenas

This commit is contained in:
Álvaro González 2025-11-05 10:35:53 +01:00
parent 82d29022a6
commit 26ad07d076
3 changed files with 53 additions and 34 deletions

View file

@ -4,7 +4,7 @@
# This file should be version controlled and should not be manually edited.
version:
revision: "077b4a4ce10a07b82caa6897f0c626f9c0a3ac90"
revision: "05db9689081f091050f01aed79f04dce0c750154"
channel: "stable"
project_type: app
@ -13,26 +13,11 @@ project_type: app
migration:
platforms:
- platform: root
create_revision: 077b4a4ce10a07b82caa6897f0c626f9c0a3ac90
base_revision: 077b4a4ce10a07b82caa6897f0c626f9c0a3ac90
- platform: android
create_revision: 077b4a4ce10a07b82caa6897f0c626f9c0a3ac90
base_revision: 077b4a4ce10a07b82caa6897f0c626f9c0a3ac90
- platform: ios
create_revision: 077b4a4ce10a07b82caa6897f0c626f9c0a3ac90
base_revision: 077b4a4ce10a07b82caa6897f0c626f9c0a3ac90
- platform: linux
create_revision: 077b4a4ce10a07b82caa6897f0c626f9c0a3ac90
base_revision: 077b4a4ce10a07b82caa6897f0c626f9c0a3ac90
- platform: macos
create_revision: 077b4a4ce10a07b82caa6897f0c626f9c0a3ac90
base_revision: 077b4a4ce10a07b82caa6897f0c626f9c0a3ac90
create_revision: 05db9689081f091050f01aed79f04dce0c750154
base_revision: 05db9689081f091050f01aed79f04dce0c750154
- platform: web
create_revision: 077b4a4ce10a07b82caa6897f0c626f9c0a3ac90
base_revision: 077b4a4ce10a07b82caa6897f0c626f9c0a3ac90
- platform: windows
create_revision: 077b4a4ce10a07b82caa6897f0c626f9c0a3ac90
base_revision: 077b4a4ce10a07b82caa6897f0c626f9c0a3ac90
create_revision: 05db9689081f091050f01aed79f04dce0c750154
base_revision: 05db9689081f091050f01aed79f04dce0c750154
# User provided section

View file

@ -26,7 +26,7 @@ class D4rtEditingController extends TextEditingController {
String? _lastError;
String? get lastError => _lastError;
Number? _lastValue;
FormulaResult? _lastValue;
D4rtEditingController({String? text}) : super(text: text);
@ -36,8 +36,10 @@ class D4rtEditingController extends TextEditingController {
_lastValue = FormulaEvaluator.evaluateExpression(text);
_lastError = null;
return true;
} catch (e) {
} catch (e, s) {
_lastError = e.toString();
print( "validate: $text: $e" );
print( "stack: $s" );
return false;
}
}
@ -98,15 +100,24 @@ class _FormulaScreenState extends State<FormulaScreen> {
if( controller.d4rtValue == null ){
throw FormulaEvaluationException( "Field ${input.name} is invalid" );
}
final value = controller.d4rtValue;
final value = controller.d4rtValue.value;
// Convert input to base unit if needed
// Always convert from dropdown unit to variable's base unit
inputValues[input.name] = widget.corpus.convert(
value,
_selectedUnits[input.name]!,
input.unit,
);
late final convertedValue;
if( value is Number ) {
convertedValue = widget.corpus.convert(
value,
_selectedUnits[input.name]!,
input.unit,
);
}
else{
convertedValue = value;
}
inputValues[input.name] = convertedValue;
}
final evaluator = FormulaEvaluator();

View file

@ -25,6 +25,20 @@ class MyMath{
static Number myPow(Number b, Number e) => Math.pow(b,e) as Number;
}
class FormulaResult{
const FormulaResult();
}
class StringResult extends FormulaResult{
final String value;
const StringResult(this.value);
}
class NumberResult extends FormulaResult{
final Number value;
const NumberResult(this.value);
}
class FormulaEvaluator {
final D4rt _interpreter;
@ -34,7 +48,7 @@ class FormulaEvaluator {
prepareInterpreter(_interpreter);
}
static Number getNumberValueOf(String s){
static Number _getNumberValueOf(String s){
return double.parse(s);
}
@ -44,12 +58,12 @@ class FormulaEvaluator {
name: 'MyMath',
staticMethods: {
'myPow': (visitor, positionalArgs, namedArgs) {
final Number base = getNumberValueOf( positionalArgs[0].toString() );
final Number exp = getNumberValueOf( positionalArgs[1].toString() );
final Number base = _getNumberValueOf( positionalArgs[0].toString() );
final Number exp = _getNumberValueOf( positionalArgs[1].toString() );
return MyMath.myPow(base,exp);
},
'myLog': (visitor, positionalArgs, namedArgs) {
final Number x = getNumberValueOf( positionalArgs[0].toString() );
final Number x = _getNumberValueOf( positionalArgs[0].toString() );
return MyMath.myLog(x);
},
}
@ -58,7 +72,7 @@ class FormulaEvaluator {
interpreter.registerBridgedClass(myMathDefinition, "package:d4rt_formulas.dart");
}
static dynamic evaluateExpression(String code, [D4rt? interpreter]) {
static FormulaResult evaluateExpression(String code, [D4rt? interpreter]) {
final d4rtInterpreter = interpreter ?? createDefaultInterpreter();
prepareInterpreter(d4rtInterpreter);
final d4rtCode = """
@ -71,7 +85,16 @@ class FormulaEvaluator {
}""";
//print("evaluateExpression:\n$d4rtCode");
final result = d4rtInterpreter.execute(source: d4rtCode);
return result.toDouble();
switch ( result ){
case int value:
return NumberResult(value.toDouble());
case Number value:
return NumberResult(value);
case String value:
return StringResult(value);
default:
throw FormulaEvaluationException( "Unexpected result type: ${result.runtimeType} -- $result" );
}
}
dynamic evaluate(Formula formula, Map<String, dynamic> inputValues) {