Skip to content

Commit

Permalink
v0.4.6
Browse files Browse the repository at this point in the history
  • Loading branch information
ethanblake4 committed Sep 10, 2022
1 parent 07b14d9 commit ccb607e
Show file tree
Hide file tree
Showing 17 changed files with 620 additions and 20 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -123,3 +123,5 @@ app.*.symbols
pubspec.lock
**/*.evc
**/pubspec_overrides.yaml

flutter_eval.json
10 changes: 10 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,13 @@
## 0.4.6
- Add Builder
- Add AlignmentGeometry, Alignment, and BoxConstraints
- Add alignment, margin, constraints, and transformAlignment on Container
- Add widthFactor and heightFactor on Center
- Add TextDirection, VerticalDirection, and TextBaseline
- Add textDirection and verticalDirection on Row
- Add verticalDirection and textBaseline on Column
- Documentation improvements

## 0.4.5
- Support for Flutter 3.3
- Update example to the Flutter counter example
Expand Down
49 changes: 49 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,22 @@ Your project structure should look like this:
└── main.dart
```

You'll also have to change your entrypoint a bit. flutter_eval does not support
`runApp()` as it runs inside an existing Flutter app, which already calls runApp().
Instead, you can change your main() function to look like this:

```dart
Widget main() {
// do any setup, then
return MyApp();
}
```

Alternatively, you can simply comment out runApp() and reference Widget
constructors directly from RuntimeWidget. This is recommended if your project
has multiple widgets which are displayed at different times or in different
parts of the app.

Finally, in the root of your project, run:
```bash
dart_eval compile -o program.evc
Expand All @@ -122,6 +138,37 @@ The resulting `program.evc` file will be in the root of your project and you can
in flutter_eval, as an asset or from a URL. The package name will be automatically inferred
from your pubspec.yaml file.

## Calling functions and passing arguments

To instantiate a class with its default constructor, append a '.' to the class name.

When calling a dart_eval function or constructor externally, you must specify *all*
arguments - even optional and named ones - in order, using null to indicate the absence
of an argument (whereas `$null()` indicates a null value).

E.g. for the following class:

```dart
class MyApp extends SomeWidget {
MyApp(this.name, {Key? key, Color? color}) : super(key: key, color: color);
final String name;
}
```

You could instantiate it in `RuntimeWidget` with:

```dart
return RuntimeWidget(
uri: Uri.parse('asset:assets/program.evc'),
library: 'package:example/main.dart',
function: 'MyApp.',
args: [$String('Jessica'), null, null]
);
```

You can also pass callbacks with `$Function`.

## Supported widgets and classes

Currently supported widgets and classes include:
Expand All @@ -130,10 +177,12 @@ Currently supported widgets and classes include:
- `WidgetsApp`, `Container`, `Column`, `Row`, `Center`;
- `Padding`, `EdgeInsetsGeometry`, `EdgeInsets`;
- `MainAxisAlignment`, `MainAxisSize`, `CrossAxisAlignment`;
- `AlignmentGeometry`, `Alignment`, `Constraints`, `BoxConstraints`;
- `Color`, `ColorSwatch`, `Colors`, `FontWeight`, `FontStyle`;
- `MaterialApp`, `MaterialColor`, `MaterialAccentColor`;
- `Theme`, `ThemeData`, `TextTheme`;
- `Text`, `TextStyle`, `TextEditingController`, `TextField`;
- `TextDirection`, `VerticalDirection`, `TextBaseline`
- `Scaffold`, `ScaffoldMessenger`, `AppBar`, `SnackBar`, `FloatingActionButton`;
- `TextButton`, `ElevatedButton`;
- `Navigator`, `NavigatorState`;
Expand Down
38 changes: 35 additions & 3 deletions lib/flutter_eval.dart
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,15 @@ import 'package:flutter_eval/src/material/text_theme.dart';
import 'package:flutter_eval/src/material/theme.dart';
import 'package:flutter_eval/src/material/theme_data.dart';
import 'package:flutter_eval/src/painting.dart';
import 'package:flutter_eval/src/painting/alignment.dart';
import 'package:flutter_eval/src/painting/basic_types.dart';
import 'package:flutter_eval/src/painting/colors.dart';
import 'package:flutter_eval/src/painting/edge_insets.dart';
import 'package:flutter_eval/src/painting/text_style.dart';
import 'package:flutter_eval/src/rendering.dart';
import 'package:flutter_eval/src/rendering/box.dart';
import 'package:flutter_eval/src/rendering/flex.dart';
import 'package:flutter_eval/src/rendering/object.dart';
import 'package:flutter_eval/src/sky_engine/ui/painting.dart';
import 'package:flutter_eval/src/sky_engine/ui/text.dart';
import 'package:flutter_eval/src/sky_engine/ui/ui.dart';
Expand Down Expand Up @@ -78,7 +81,12 @@ void setupFlutterForCompile(Compiler compiler) {
$TextButton.$declaration,
$ThemeData.$declaration,
$Theme.$declaration,
$ElevatedButton.$declaration
$ElevatedButton.$declaration,
$Builder.$declaration,
$AlignmentGeometry.$declaration,
$Alignment.$declaration,
$Constraints.$declaration,
$BoxConstraints.$declaration
];

compiler.defineBridgeClasses(classes);
Expand All @@ -88,6 +96,9 @@ void setupFlutterForCompile(Compiler compiler) {
compiler.defineBridgeEnum($MainAxisSize.$declaration);
compiler.defineBridgeEnum($FontWeight.$declaration);
compiler.defineBridgeEnum($FontStyle.$declaration);
compiler.defineBridgeEnum($TextDirection.$declaration);
compiler.defineBridgeEnum($VerticalDirection.$declaration);
compiler.defineBridgeEnum($TextBaseline.$declaration);

compiler.addSource(DartSource('dart:ui', dartUiSource));

Expand All @@ -105,7 +116,7 @@ void setupFlutterForCompile(Compiler compiler) {
compiler.addSource(DartSource('package:flutter/src/widgets/framework.dart', widgetsFrameworkSource));
compiler.addSource(DartSource('package:flutter/src/widgets/basic.dart', widgetsBasicSource));

/*final outJson = json.encode({
/* final outJson = json.encode({
'classes': classes.map((c) => c.toJson()).toList(),
'enums': [
$MainAxisAlignment.$declaration.toJson(),
Expand All @@ -128,7 +139,7 @@ void setupFlutterForCompile(Compiler compiler) {
]
});
File('flutter_eval.json').writeAsStringSync(outJson);*/
File('flutter_eval.json').writeAsStringSync(outJson); */
}

/// Setup Flutter classes for use in a dart_eval [Runtime]. After
Expand All @@ -144,14 +155,35 @@ void setupFlutterForRuntime(Runtime runtime) {
..registerBridgeFunc('package:flutter/src/widgets/framework.dart', 'StatefulWidget.', $StatefulWidget$bridge.$new,
isBridge: true)
..registerBridgeFunc('package:flutter/src/widgets/framework.dart', 'State.', $State$bridge.$new, isBridge: true)
..registerBridgeFunc('package:flutter/src/painting/alignment.dart', 'Alignment.', $Alignment.$new)
..registerBridgeFunc('package:flutter/src/painting/alignment.dart', 'Alignment.topLeft*g', $Alignment.$topLeft)
..registerBridgeFunc('package:flutter/src/painting/alignment.dart', 'Alignment.topCenter*g', $Alignment.$topCenter)
..registerBridgeFunc('package:flutter/src/painting/alignment.dart', 'Alignment.topRight*g', $Alignment.$topRight)
..registerBridgeFunc(
'package:flutter/src/painting/alignment.dart', 'Alignment.centerLeft*g', $Alignment.$centerLeft)
..registerBridgeFunc('package:flutter/src/painting/alignment.dart', 'Alignment.center*g', $Alignment.$center)
..registerBridgeFunc(
'package:flutter/src/painting/alignment.dart', 'Alignment.centerRight*g', $Alignment.$centerRight)
..registerBridgeFunc(
'package:flutter/src/painting/alignment.dart', 'Alignment.bottomLeft*g', $Alignment.$bottomLeft)
..registerBridgeFunc(
'package:flutter/src/painting/alignment.dart', 'Alignment.bottomCenter*g', $Alignment.$bottomCenter)
..registerBridgeFunc(
'package:flutter/src/painting/alignment.dart', 'Alignment.bottomRight*g', $Alignment.$bottomRight)
..registerBridgeFunc('package:flutter/src/painting/edge_insets.dart', 'EdgeInsets.fromLTRB', $EdgeInsets.$fromLTRB)
..registerBridgeFunc('package:flutter/src/painting/edge_insets.dart', 'EdgeInsets.all', $EdgeInsets.$all)
..registerBridgeFunc('package:flutter/src/painting/text_style.dart', 'TextStyle.', $TextStyle.$new)
..registerBridgeFunc('package:flutter/src/rendering/box.dart', 'BoxConstraints.', $BoxConstraints.$new)
..registerBridgeFunc('package:flutter/src/rendering/box.dart', 'BoxConstraints.tightFor', $BoxConstraints.$tightFor)
..registerBridgeFunc(
'package:flutter/src/rendering/box.dart', 'BoxConstraints.tightForFinite', $BoxConstraints.$tightForFinite)
..registerBridgeFunc('package:flutter/src/rendering/box.dart', 'BoxConstraints.expand', $BoxConstraints.$expand)
..registerBridgeFunc('package:flutter/src/widgets/app.dart', 'WidgetsApp.', $WidgetsApp.$new)
..registerBridgeFunc('package:flutter/src/widgets/basic.dart', 'Padding.', $Padding.$new)
..registerBridgeFunc('package:flutter/src/widgets/basic.dart', 'Column.', $Column.$new)
..registerBridgeFunc('package:flutter/src/widgets/basic.dart', 'Row.', $Row.$new)
..registerBridgeFunc('package:flutter/src/widgets/basic.dart', 'Center.', $Center.$new)
..registerBridgeFunc('package:flutter/src/widgets/basic.dart', 'Builder.', $Builder.$new)
..registerBridgeFunc('package:flutter/src/widgets/text.dart', 'Text.', $Text.$new)
..registerBridgeFunc('package:flutter/src/widgets/container.dart', 'Container.', $Container.$new)
..registerBridgeFunc(
Expand Down
1 change: 1 addition & 0 deletions lib/src/painting.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
const paintingSource = '''
library painting;
export 'package:flutter/src/painting/alignment.dart';
export 'package:flutter/src/painting/basic_types.dart';
export 'package:flutter/src/painting/edge_insets.dart';
export 'package:flutter/src/painting/text_style.dart';
Expand Down
141 changes: 141 additions & 0 deletions lib/src/painting/alignment.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,141 @@
import 'package:dart_eval/dart_eval.dart';
import 'package:dart_eval/dart_eval_bridge.dart';
import 'package:dart_eval/stdlib/core.dart';
import 'package:flutter/material.dart';

class $AlignmentGeometry implements $Instance {
static const $type =
BridgeTypeRef.spec(BridgeTypeSpec('package:flutter/src/painting/alignment.dart', 'AlignmentGeometry'));

static const $declaration = BridgeClassDef(BridgeClassType($type, isAbstract: true),
constructors: {}, methods: {}, getters: {}, setters: {}, fields: {}, wrap: true);

$AlignmentGeometry.wrap(this.$value);

@override
final AlignmentGeometry $value;

late final $Instance _superclass = $Object($value);

@override
AlignmentGeometry get $reified => $value;

@override
$Value? $getProperty(Runtime runtime, String identifier) {
return _superclass.$getProperty(runtime, identifier);
}

@override
int get $runtimeType => throw UnimplementedError();

@override
void $setProperty(Runtime runtime, String identifier, $Value value) {
return _superclass.$setProperty(runtime, identifier, value);
}
}

class $Alignment implements $Instance {
static const $type = BridgeTypeRef.spec(BridgeTypeSpec('package:flutter/src/painting/alignment.dart', 'Alignment'));

static const _stValueType =
BridgeMethodDef(BridgeFunctionDef(returns: BridgeTypeAnnotation($Alignment.$type)), isStatic: true);
static const $declaration =
BridgeClassDef(BridgeClassType($type, isAbstract: false, $extends: $AlignmentGeometry.$type),
constructors: {
'': BridgeConstructorDef(BridgeFunctionDef(returns: BridgeTypeAnnotation($type), namedParams: [
BridgeParameter('x', BridgeTypeAnnotation(BridgeTypeRef.type(RuntimeTypes.doubleType)), false),
BridgeParameter('y', BridgeTypeAnnotation(BridgeTypeRef.type(RuntimeTypes.doubleType)), false),
]))
},
methods: {},
getters: {
'x': BridgeMethodDef(
BridgeFunctionDef(returns: BridgeTypeAnnotation(BridgeTypeRef.type(RuntimeTypes.doubleType)))),
'y': BridgeMethodDef(
BridgeFunctionDef(returns: BridgeTypeAnnotation(BridgeTypeRef.type(RuntimeTypes.doubleType)))),
'topLeft': _stValueType,
'topCenter': _stValueType,
'topRight': _stValueType,
'centerLeft': _stValueType,
'center': _stValueType,
'centerRight': _stValueType,
'bottomLeft': _stValueType,
'bottomCenter': _stValueType,
'bottomRight': _stValueType,
},
setters: {},
fields: {},
wrap: true);

static $Value? $new(Runtime runtime, $Value? target, List<$Value?> args) {
return $Alignment.wrap(Alignment(
args[0]!.$value,
args[1]!.$value,
));
}

static $Value? $topLeft(Runtime runtime, $Value? target, List<$Value?> args) {
return $Alignment.wrap(Alignment.topLeft);
}

static $Value? $topCenter(Runtime runtime, $Value? target, List<$Value?> args) {
return $Alignment.wrap(Alignment.topCenter);
}

static $Value? $topRight(Runtime runtime, $Value? target, List<$Value?> args) {
return $Alignment.wrap(Alignment.topRight);
}

static $Value? $centerLeft(Runtime runtime, $Value? target, List<$Value?> args) {
return $Alignment.wrap(Alignment.centerLeft);
}

static $Value? $center(Runtime runtime, $Value? target, List<$Value?> args) {
return $Alignment.wrap(Alignment.center);
}

static $Value? $centerRight(Runtime runtime, $Value? target, List<$Value?> args) {
return $Alignment.wrap(Alignment.centerRight);
}

static $Value? $bottomLeft(Runtime runtime, $Value? target, List<$Value?> args) {
return $Alignment.wrap(Alignment.bottomLeft);
}

static $Value? $bottomCenter(Runtime runtime, $Value? target, List<$Value?> args) {
return $Alignment.wrap(Alignment.bottomCenter);
}

static $Value? $bottomRight(Runtime runtime, $Value? target, List<$Value?> args) {
return $Alignment.wrap(Alignment.bottomRight);
}

$Alignment.wrap(this.$value);

@override
final Alignment $value;

late final $Instance _superclass = $AlignmentGeometry.wrap($value);

@override
get $reified => $value;

@override
$Value? $getProperty(Runtime runtime, String identifier) {
switch (identifier) {
case 'x':
return $double($value.x);
case 'y':
return $double($value.y);
}
return _superclass.$getProperty(runtime, identifier);
}

@override
int get $runtimeType => throw UnimplementedError();

@override
void $setProperty(Runtime runtime, String identifier, $Value value) {
throw UnimplementedError();
}
}
38 changes: 38 additions & 0 deletions lib/src/painting/basic_types.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
import 'package:dart_eval/dart_eval.dart';
import 'package:dart_eval/dart_eval_bridge.dart';
import 'package:flutter/material.dart';

const paintingBasicTypesSource = '''
export 'dart:ui' show
BlendMode,
Expand Down Expand Up @@ -43,3 +47,37 @@ export 'dart:ui' show
export 'package:flutter/foundation.dart' show VoidCallback;
''';

class $VerticalDirection implements $Instance {
static const $type =
BridgeTypeRef.spec(BridgeTypeSpec('package:flutter/src/painting/basic_types.dart', 'VerticalDirection'));

static const $declaration =
BridgeEnumDef($type, methods: {}, getters: {}, setters: {}, values: ['rtl', 'ltr'], fields: {});

static final $values = {
'up': $VerticalDirection.wrap(VerticalDirection.up),
'down': $VerticalDirection.wrap(VerticalDirection.down),
};

$VerticalDirection.wrap(this.$value);

@override
final VerticalDirection $value;

@override
get $reified => $value;

@override
$Value? $getProperty(Runtime runtime, String identifier) {
throw UnimplementedError();
}

@override
int get $runtimeType => throw UnimplementedError();

@override
void $setProperty(Runtime runtime, String identifier, $Value value) {
throw UnimplementedError();
}
}
2 changes: 2 additions & 0 deletions lib/src/rendering.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
const renderingSource = '''
export 'package:flutter/src/rendering/box.dart';
export 'package:flutter/src/rendering/flex.dart';
export 'package:flutter/src/rendering/object.dart';
''';
Loading

0 comments on commit ccb607e

Please sign in to comment.