Skip to content

Commit 8103bb0

Browse files
committed
AssetPermission, ListView.builder, Image.network
1 parent fd76e2a commit 8103bb0

File tree

8 files changed

+207
-3
lines changed

8 files changed

+207
-3
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use this to display a custom error fallback.
88
- Add ListView and InkWell
99
- Add Card, Drawer, and ListTile (thanks to @DevAdalat)
10+
- Add Image, ImageProvider, and NetworkImage (thanks to @DevAdalat)
1011
- Fix BoxDecoration not extending Decoration
1112
- Fix error when constructing a TextStyle without the `inherit` property
1213
## 0.5.4

lib/flutter_eval.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ import 'package:flutter_eval/src/widgets/icon.dart';
5959
import 'package:flutter_eval/src/widgets/icon_data.dart';
6060
import 'package:flutter_eval/src/widgets/image.dart';
6161
import 'package:flutter_eval/src/widgets/navigator.dart';
62+
import 'package:flutter_eval/src/widgets/scroll_controller.dart';
6263
import 'package:flutter_eval/src/widgets/scroll_view.dart';
6364
import 'package:flutter_eval/src/widgets/spacer.dart';
6465
import 'package:flutter_eval/src/widgets/text.dart';
@@ -151,6 +152,7 @@ class FlutterEvalPlugin implements EvalPlugin {
151152
$Border.$declaration,
152153
$InkWell.$declaration,
153154
$ListView.$declaration,
155+
$ScrollController.$declaration,
154156
$Card.$declaration,
155157
$Drawer.$declaration,
156158
$ListTile.$declaration,
@@ -267,6 +269,7 @@ class FlutterEvalPlugin implements EvalPlugin {
267269
..registerBridgeFunc('package:flutter/src/widgets/icon_data.dart', 'IconData.', $IconData.$new)
268270
..registerBridgeFunc('package:flutter/src/widgets/icon.dart', 'Icon.', $Icon.$new)
269271
..registerBridgeFunc('package:flutter/src/widgets/scroll_view.dart', 'ListView.', $ListView.$new)
272+
..registerBridgeFunc('package:flutter/src/widgets/scroll_view.dart', 'ListView.builder', $ListView.$builder)
270273
..registerBridgeFunc('package:flutter/src/widgets/spacer.dart', 'Spacer.', $Spacer.$new)
271274
..registerBridgeFunc('package:flutter/src/widgets/text.dart', 'Text.', $Text.$new)
272275
..registerBridgeFunc('package:flutter/src/widgets/container.dart', 'Container.', $Container.$new)
@@ -291,6 +294,8 @@ class FlutterEvalPlugin implements EvalPlugin {
291294
..registerBridgeFunc('package:flutter/src/material/drawer.dart', 'Drawer.', $Drawer.$new)
292295
..registerBridgeFunc('package:flutter/src/material/card.dart', 'Card.', $Card.$new)
293296
..registerBridgeFunc('package:flutter/src/widgets/image.dart', 'Image.', $Image.$new)
297+
..registerBridgeFunc('package:flutter/src/widgets/image.dart', 'Image.network', $Image.$network)
298+
..registerBridgeFunc('package:flutter/src/widgets/image.dart', 'Image.asset', $Image.$asset)
294299
..registerBridgeFunc('package:flutter/src/material/theme.dart', 'Theme.of', $Theme.$of)
295300
..registerBridgeFunc('package:flutter/src/material/theme.dart', 'Theme.', $Theme.$new)
296301
..registerBridgeFunc('package:flutter/src/material/floating_action_button.dart', 'FloatingActionButton.',

lib/security.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
library flutter_eval.security;
2+
3+
export 'package:dart_eval/dart_eval_security.dart';
4+
export 'src/flutter_eval_security.dart';

lib/src/flutter_eval_security.dart

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import 'package:dart_eval/dart_eval_security.dart';
2+
3+
/// A permission that allows access to Flutter assets.
4+
class AssetPermission implements Permission {
5+
/// The pattern that will be matched against the path.
6+
final Pattern matchPattern;
7+
8+
/// Create a new filesystem permission that matches a [Pattern].
9+
const AssetPermission(this.matchPattern);
10+
11+
/// A permission that allows access to any file system resource.
12+
static final AssetPermission any = AssetPermission(RegExp('.*'));
13+
14+
/// Create a new filesystem permission that matches a specific file.
15+
factory AssetPermission.asset(String asset) {
16+
final escaped = asset.replaceAll(r'\', r'\\').replaceAll(r'/', r'\/');
17+
return AssetPermission(RegExp('^$escaped\$'));
18+
}
19+
20+
@override
21+
List<String> get domains => ['asset'];
22+
23+
@override
24+
bool match([Object? data]) {
25+
if (data is String) {
26+
return matchPattern.matchAsPrefix(data) != null;
27+
}
28+
return false;
29+
}
30+
31+
@override
32+
bool operator ==(Object other) {
33+
if (other is AssetPermission) {
34+
return other.matchPattern == matchPattern && other.domains == domains;
35+
}
36+
return false;
37+
}
38+
39+
@override
40+
int get hashCode => matchPattern.hashCode ^ domains.hashCode;
41+
}

lib/src/material/list_tile.dart

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ import 'package:dart_eval/dart_eval.dart';
22
import 'package:dart_eval/dart_eval_bridge.dart';
33
import 'package:flutter/material.dart';
44
import 'package:flutter_eval/src/foundation/key.dart';
5+
import 'package:flutter_eval/src/painting/edge_insets.dart';
6+
import 'package:flutter_eval/src/sky_engine/ui/painting.dart';
57
import 'package:flutter_eval/src/widgets/framework.dart';
68

79
class $ListTile implements $Instance {
@@ -17,6 +19,20 @@ class $ListTile implements $Instance {
1719
BridgeParameter('subtitle', BridgeTypeAnnotation($Widget.$type), true),
1820
BridgeParameter('trailing', BridgeTypeAnnotation($Widget.$type), true),
1921
BridgeParameter('isThreeLine', BridgeTypeAnnotation(BridgeTypeRef.type(RuntimeTypes.boolType)), true),
22+
BridgeParameter('dense', BridgeTypeAnnotation(BridgeTypeRef.type(RuntimeTypes.boolType)), true),
23+
BridgeParameter('contentPadding', BridgeTypeAnnotation($EdgeInsetsGeometry.$type), true),
24+
BridgeParameter('enabled', BridgeTypeAnnotation(BridgeTypeRef.type(RuntimeTypes.boolType)), true),
25+
BridgeParameter('onTap', BridgeTypeAnnotation(BridgeTypeRef.type(RuntimeTypes.functionType)), true),
26+
BridgeParameter('onLongPress', BridgeTypeAnnotation(BridgeTypeRef.type(RuntimeTypes.functionType)), true),
27+
BridgeParameter('selected', BridgeTypeAnnotation(BridgeTypeRef.type(RuntimeTypes.boolType)), true),
28+
BridgeParameter('focusColor', BridgeTypeAnnotation($Color.$type), true),
29+
BridgeParameter('hoverColor', BridgeTypeAnnotation($Color.$type), true),
30+
BridgeParameter('horizontalTitleGap',
31+
BridgeTypeAnnotation(BridgeTypeRef.type(RuntimeTypes.doubleType), nullable: true), true),
32+
BridgeParameter('minVerticalPadding',
33+
BridgeTypeAnnotation(BridgeTypeRef.type(RuntimeTypes.doubleType), nullable: true), true),
34+
BridgeParameter('minLeadingWidth',
35+
BridgeTypeAnnotation(BridgeTypeRef.type(RuntimeTypes.doubleType), nullable: true), true),
2036
]))
2137
},
2238
methods: {},
@@ -40,6 +56,17 @@ class $ListTile implements $Instance {
4056
subtitle: args[3]?.$value,
4157
trailing: args[4]?.$value,
4258
isThreeLine: args[5]?.$value ?? false,
59+
dense: args[6]?.$value ?? false,
60+
contentPadding: args[7]?.$value,
61+
enabled: args[8]?.$value ?? true,
62+
onTap: args[9] == null ? null : () => (args[9] as EvalCallable).call(runtime, null, []),
63+
onLongPress: args[10] == null ? null : () => (args[10] as EvalCallable).call(runtime, null, []),
64+
selected: args[11]?.$value ?? false,
65+
focusColor: args[12]?.$value,
66+
hoverColor: args[13]?.$value,
67+
horizontalTitleGap: args[14]?.$value,
68+
minVerticalPadding: args[15]?.$value,
69+
minLeadingWidth: args[16]?.$value,
4370
));
4471
}
4572

lib/src/widgets.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ export 'src/widgets/icon.dart';
1111
export 'src/widgets/icon_data.dart';
1212
export 'src/widgets/image.dart';
1313
export 'src/widgets/spacer.dart';
14+
export 'src/widgets/scroll_controller.dart';
15+
export 'src/widgets/scroll_view.dart';
1416
export 'src/widgets/text.dart';
1517
export 'src/widgets/navigator.dart';
1618
''';

lib/src/widgets/image.dart

Lines changed: 82 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,51 @@ class $Image implements $Instance {
2525
BridgeParameter('height', BridgeTypeAnnotation(BridgeTypeRef.type(RuntimeTypes.doubleType)), true),
2626
BridgeParameter('color', BridgeTypeAnnotation($Color.$type), true),
2727
BridgeParameter('fit', BridgeTypeAnnotation($BoxFit.$type), true),
28-
BridgeParameter('alignment', BridgeTypeAnnotation($Alignment.$type), true),
28+
BridgeParameter('alignment', BridgeTypeAnnotation($AlignmentGeometry.$type), true),
29+
BridgeParameter(
30+
'filterQuality',
31+
BridgeTypeAnnotation($FilterQuality.$type),
32+
true,
33+
),
34+
],
35+
),
36+
),
37+
'network': BridgeConstructorDef(
38+
BridgeFunctionDef(
39+
returns: BridgeTypeAnnotation($type),
40+
params: [
41+
BridgeParameter('src', BridgeTypeAnnotation(BridgeTypeRef.type(RuntimeTypes.stringType)), false),
42+
],
43+
namedParams: [
44+
BridgeParameter('key', BridgeTypeAnnotation($Key.$type), true),
45+
BridgeParameter('scale', BridgeTypeAnnotation(BridgeTypeRef.type(RuntimeTypes.doubleType)), true),
46+
BridgeParameter('width', BridgeTypeAnnotation(BridgeTypeRef.type(RuntimeTypes.doubleType)), true),
47+
BridgeParameter('height', BridgeTypeAnnotation(BridgeTypeRef.type(RuntimeTypes.doubleType)), true),
48+
BridgeParameter('color', BridgeTypeAnnotation($Color.$type), true),
49+
BridgeParameter('fit', BridgeTypeAnnotation($BoxFit.$type), true),
50+
BridgeParameter('alignment', BridgeTypeAnnotation($AlignmentGeometry.$type), true),
51+
BridgeParameter(
52+
'filterQuality',
53+
BridgeTypeAnnotation($FilterQuality.$type),
54+
true,
55+
),
56+
],
57+
),
58+
),
59+
'asset': BridgeConstructorDef(
60+
BridgeFunctionDef(
61+
returns: BridgeTypeAnnotation($type),
62+
params: [
63+
BridgeParameter('name', BridgeTypeAnnotation(BridgeTypeRef.type(RuntimeTypes.stringType)), false),
64+
],
65+
namedParams: [
66+
BridgeParameter('key', BridgeTypeAnnotation($Key.$type), true),
67+
BridgeParameter('scale', BridgeTypeAnnotation(BridgeTypeRef.type(RuntimeTypes.doubleType)), true),
68+
BridgeParameter('width', BridgeTypeAnnotation(BridgeTypeRef.type(RuntimeTypes.doubleType)), true),
69+
BridgeParameter('height', BridgeTypeAnnotation(BridgeTypeRef.type(RuntimeTypes.doubleType)), true),
70+
BridgeParameter('color', BridgeTypeAnnotation($Color.$type), true),
71+
BridgeParameter('fit', BridgeTypeAnnotation($BoxFit.$type), true),
72+
BridgeParameter('alignment', BridgeTypeAnnotation($AlignmentGeometry.$type), true),
2973
BridgeParameter(
3074
'filterQuality',
3175
BridgeTypeAnnotation($FilterQuality.$type),
@@ -62,8 +106,44 @@ class $Image implements $Instance {
62106
);
63107
}
64108

109+
static $Value? $network(Runtime runtime, $Value? target, List<$Value?> args) {
110+
final url = args[0]!.$value;
111+
runtime.assertPermission('network', url);
112+
return $Image.wrap(
113+
Image.network(
114+
args[0]!.$value,
115+
key: args[1]?.$value,
116+
scale: args[2]?.$value,
117+
width: args[3]?.$value,
118+
height: args[4]?.$value,
119+
color: args[5]?.$value,
120+
fit: args[6]?.$value,
121+
alignment: args[7]?.$value ?? Alignment.center,
122+
filterQuality: args[8]?.$value ?? FilterQuality.low,
123+
),
124+
);
125+
}
126+
127+
static $Value? $asset(Runtime runtime, $Value? target, List<$Value?> args) {
128+
final name = args[0]!.$value;
129+
runtime.assertPermission('asset', name);
130+
return $Image.wrap(
131+
Image.asset(
132+
args[0]!.$value,
133+
key: args[1]?.$value,
134+
scale: args[2]?.$value,
135+
width: args[3]?.$value,
136+
height: args[4]?.$value,
137+
color: args[5]?.$value,
138+
fit: args[6]?.$value,
139+
alignment: args[7]?.$value ?? Alignment.center,
140+
filterQuality: args[8]?.$value ?? FilterQuality.low,
141+
),
142+
);
143+
}
144+
65145
@override
66-
get $reified => throw UnimplementedError();
146+
get $reified => $value;
67147

68148
@override
69149
int $getRuntimeType(Runtime runtime) => runtime.lookupType($type.spec!);

lib/src/widgets/scroll_view.dart

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import 'package:dart_eval/dart_eval.dart';
22
import 'package:dart_eval/dart_eval_bridge.dart';
3+
import 'package:dart_eval/stdlib/core.dart';
34
import 'package:flutter/cupertino.dart';
45
import 'package:flutter/material.dart';
56
import 'package:flutter_eval/painting.dart';
@@ -37,7 +38,29 @@ class $ListView implements $Instance {
3738
BridgeParameter(
3839
'cacheExtent', BridgeTypeAnnotation(BridgeTypeRef.type(RuntimeTypes.doubleType), nullable: true), true),
3940
BridgeParameter('children', BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.list)), false),
40-
]))
41+
])),
42+
'builder': BridgeConstructorDef(BridgeFunctionDef(returns: BridgeTypeAnnotation($type), namedParams: [
43+
BridgeParameter('key', BridgeTypeAnnotation($Key.$type, nullable: true), true),
44+
BridgeParameter('scrollDirection', BridgeTypeAnnotation($Axis.$type), true),
45+
BridgeParameter('reverse', BridgeTypeAnnotation(BridgeTypeRef.type(RuntimeTypes.boolType)), true),
46+
BridgeParameter('controller', BridgeTypeAnnotation($ScrollController.$type), true),
47+
BridgeParameter(
48+
'primary', BridgeTypeAnnotation(BridgeTypeRef.type(RuntimeTypes.boolType), nullable: true), true),
49+
//BridgeParameter('physics', BridgeTypeAnnotation($ScrollPhysics.$type), true),
50+
BridgeParameter('shrinkWrap', BridgeTypeAnnotation(BridgeTypeRef.type(RuntimeTypes.boolType)), true),
51+
BridgeParameter('padding', BridgeTypeAnnotation($EdgeInsetsGeometry.$type, nullable: true), true),
52+
BridgeParameter(
53+
'itemExtent', BridgeTypeAnnotation(BridgeTypeRef.type(RuntimeTypes.doubleType), nullable: true), true),
54+
BridgeParameter(
55+
'addAutomaticKeepAlives', BridgeTypeAnnotation(BridgeTypeRef.type(RuntimeTypes.boolType)), true),
56+
BridgeParameter(
57+
'addRepaintBoundaries', BridgeTypeAnnotation(BridgeTypeRef.type(RuntimeTypes.boolType)), true),
58+
BridgeParameter('addSemanticIndexes', BridgeTypeAnnotation(BridgeTypeRef.type(RuntimeTypes.boolType)), true),
59+
BridgeParameter(
60+
'cacheExtent', BridgeTypeAnnotation(BridgeTypeRef.type(RuntimeTypes.doubleType), nullable: true), true),
61+
BridgeParameter('itemBuilder', BridgeTypeAnnotation(BridgeTypeRef.type(RuntimeTypes.functionType)), false),
62+
BridgeParameter('itemCount', BridgeTypeAnnotation(BridgeTypeRef.type(RuntimeTypes.intType)), true),
63+
])),
4164
},
4265
methods: {},
4366
getters: {},
@@ -72,6 +95,27 @@ class $ListView implements $Instance {
7295
));
7396
}
7497

98+
static $Value? $builder(Runtime runtime, $Value? target, List<$Value?> args) {
99+
return $ListView.wrap(ListView.builder(
100+
key: args[0]?.$value as Key?,
101+
scrollDirection: args[1]?.$value as Axis? ?? Axis.vertical,
102+
reverse: args[2]?.$value as bool? ?? false,
103+
controller: args[3]?.$value as ScrollController?,
104+
primary: args[4]?.$value as bool?,
105+
//physics: args[5]?.$reified as ScrollPhysics?,
106+
shrinkWrap: args[5]?.$value as bool? ?? false,
107+
padding: args[6]?.$value as EdgeInsetsGeometry?,
108+
itemExtent: args[7]?.$value as double?,
109+
addAutomaticKeepAlives: args[8]?.$value as bool? ?? true,
110+
addRepaintBoundaries: args[9]?.$value as bool? ?? true,
111+
addSemanticIndexes: args[10]?.$value as bool? ?? true,
112+
cacheExtent: args[11]?.$value as double?,
113+
itemBuilder: (context, index) =>
114+
(args[12] as EvalCallable).call(runtime, target, [$BuildContext.wrap(context), $int(index)])?.$value,
115+
itemCount: args[13]?.$value as int?,
116+
));
117+
}
118+
75119
/// Wrap a [ListView] instance in a [$ListView].
76120
$ListView.wrap(this.$value);
77121

0 commit comments

Comments
 (0)