Preparo para fórmulas que devuelven cadenas
This commit is contained in:
parent
82d29022a6
commit
26ad07d076
3 changed files with 53 additions and 34 deletions
25
.metadata
25
.metadata
|
|
@ -4,7 +4,7 @@
|
||||||
# This file should be version controlled and should not be manually edited.
|
# This file should be version controlled and should not be manually edited.
|
||||||
|
|
||||||
version:
|
version:
|
||||||
revision: "077b4a4ce10a07b82caa6897f0c626f9c0a3ac90"
|
revision: "05db9689081f091050f01aed79f04dce0c750154"
|
||||||
channel: "stable"
|
channel: "stable"
|
||||||
|
|
||||||
project_type: app
|
project_type: app
|
||||||
|
|
@ -13,26 +13,11 @@ project_type: app
|
||||||
migration:
|
migration:
|
||||||
platforms:
|
platforms:
|
||||||
- platform: root
|
- platform: root
|
||||||
create_revision: 077b4a4ce10a07b82caa6897f0c626f9c0a3ac90
|
create_revision: 05db9689081f091050f01aed79f04dce0c750154
|
||||||
base_revision: 077b4a4ce10a07b82caa6897f0c626f9c0a3ac90
|
base_revision: 05db9689081f091050f01aed79f04dce0c750154
|
||||||
- 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
|
|
||||||
- platform: web
|
- platform: web
|
||||||
create_revision: 077b4a4ce10a07b82caa6897f0c626f9c0a3ac90
|
create_revision: 05db9689081f091050f01aed79f04dce0c750154
|
||||||
base_revision: 077b4a4ce10a07b82caa6897f0c626f9c0a3ac90
|
base_revision: 05db9689081f091050f01aed79f04dce0c750154
|
||||||
- platform: windows
|
|
||||||
create_revision: 077b4a4ce10a07b82caa6897f0c626f9c0a3ac90
|
|
||||||
base_revision: 077b4a4ce10a07b82caa6897f0c626f9c0a3ac90
|
|
||||||
|
|
||||||
# User provided section
|
# User provided section
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -26,7 +26,7 @@ class D4rtEditingController extends TextEditingController {
|
||||||
String? _lastError;
|
String? _lastError;
|
||||||
|
|
||||||
String? get lastError => _lastError;
|
String? get lastError => _lastError;
|
||||||
Number? _lastValue;
|
FormulaResult? _lastValue;
|
||||||
|
|
||||||
D4rtEditingController({String? text}) : super(text: text);
|
D4rtEditingController({String? text}) : super(text: text);
|
||||||
|
|
||||||
|
|
@ -36,8 +36,10 @@ class D4rtEditingController extends TextEditingController {
|
||||||
_lastValue = FormulaEvaluator.evaluateExpression(text);
|
_lastValue = FormulaEvaluator.evaluateExpression(text);
|
||||||
_lastError = null;
|
_lastError = null;
|
||||||
return true;
|
return true;
|
||||||
} catch (e) {
|
} catch (e, s) {
|
||||||
_lastError = e.toString();
|
_lastError = e.toString();
|
||||||
|
print( "validate: $text: $e" );
|
||||||
|
print( "stack: $s" );
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -98,16 +100,25 @@ class _FormulaScreenState extends State<FormulaScreen> {
|
||||||
if( controller.d4rtValue == null ){
|
if( controller.d4rtValue == null ){
|
||||||
throw FormulaEvaluationException( "Field ${input.name} is invalid" );
|
throw FormulaEvaluationException( "Field ${input.name} is invalid" );
|
||||||
}
|
}
|
||||||
final value = controller.d4rtValue;
|
final value = controller.d4rtValue.value;
|
||||||
|
|
||||||
// Convert input to base unit if needed
|
// Convert input to base unit if needed
|
||||||
// Always convert from dropdown unit to variable's base unit
|
// Always convert from dropdown unit to variable's base unit
|
||||||
inputValues[input.name] = widget.corpus.convert(
|
late final convertedValue;
|
||||||
|
if( value is Number ) {
|
||||||
|
convertedValue = widget.corpus.convert(
|
||||||
value,
|
value,
|
||||||
_selectedUnits[input.name]!,
|
_selectedUnits[input.name]!,
|
||||||
input.unit,
|
input.unit,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
else{
|
||||||
|
convertedValue = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
inputValues[input.name] = convertedValue;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
final evaluator = FormulaEvaluator();
|
final evaluator = FormulaEvaluator();
|
||||||
final result = evaluator.evaluate(widget.formula, inputValues);
|
final result = evaluator.evaluate(widget.formula, inputValues);
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,20 @@ class MyMath{
|
||||||
static Number myPow(Number b, Number e) => Math.pow(b,e) as Number;
|
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 {
|
class FormulaEvaluator {
|
||||||
final D4rt _interpreter;
|
final D4rt _interpreter;
|
||||||
|
|
||||||
|
|
@ -34,7 +48,7 @@ class FormulaEvaluator {
|
||||||
prepareInterpreter(_interpreter);
|
prepareInterpreter(_interpreter);
|
||||||
}
|
}
|
||||||
|
|
||||||
static Number getNumberValueOf(String s){
|
static Number _getNumberValueOf(String s){
|
||||||
return double.parse(s);
|
return double.parse(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -44,12 +58,12 @@ class FormulaEvaluator {
|
||||||
name: 'MyMath',
|
name: 'MyMath',
|
||||||
staticMethods: {
|
staticMethods: {
|
||||||
'myPow': (visitor, positionalArgs, namedArgs) {
|
'myPow': (visitor, positionalArgs, namedArgs) {
|
||||||
final Number base = getNumberValueOf( positionalArgs[0].toString() );
|
final Number base = _getNumberValueOf( positionalArgs[0].toString() );
|
||||||
final Number exp = getNumberValueOf( positionalArgs[1].toString() );
|
final Number exp = _getNumberValueOf( positionalArgs[1].toString() );
|
||||||
return MyMath.myPow(base,exp);
|
return MyMath.myPow(base,exp);
|
||||||
},
|
},
|
||||||
'myLog': (visitor, positionalArgs, namedArgs) {
|
'myLog': (visitor, positionalArgs, namedArgs) {
|
||||||
final Number x = getNumberValueOf( positionalArgs[0].toString() );
|
final Number x = _getNumberValueOf( positionalArgs[0].toString() );
|
||||||
return MyMath.myLog(x);
|
return MyMath.myLog(x);
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
@ -58,7 +72,7 @@ class FormulaEvaluator {
|
||||||
interpreter.registerBridgedClass(myMathDefinition, "package:d4rt_formulas.dart");
|
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();
|
final d4rtInterpreter = interpreter ?? createDefaultInterpreter();
|
||||||
prepareInterpreter(d4rtInterpreter);
|
prepareInterpreter(d4rtInterpreter);
|
||||||
final d4rtCode = """
|
final d4rtCode = """
|
||||||
|
|
@ -71,7 +85,16 @@ class FormulaEvaluator {
|
||||||
}""";
|
}""";
|
||||||
//print("evaluateExpression:\n$d4rtCode");
|
//print("evaluateExpression:\n$d4rtCode");
|
||||||
final result = d4rtInterpreter.execute(source: 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) {
|
dynamic evaluate(Formula formula, Map<String, dynamic> inputValues) {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue