Skip to content

Commit 0c5458b

Browse files
authored
push screen to external naviation key (#1417)
1 parent 4989958 commit 0c5458b

File tree

4 files changed

+41
-15
lines changed

4 files changed

+41
-15
lines changed

lib/ensemble_app.dart

+14-9
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import 'package:yaml/yaml.dart';
3535

3636
const String backgroundUploadTask = 'backgroundUploadTask';
3737
const String ensembleMethodChannelName = 'com.ensembleui.host.platform';
38+
GlobalKey<NavigatorState>? externalAppNavigateKey;
3839

3940
@pragma('vm:entry-point')
4041
void callbackDispatcher() {
@@ -93,15 +94,19 @@ void callbackDispatcher() {
9394

9495
/// use this as the root widget for Ensemble
9596
class EnsembleApp extends StatefulWidget {
96-
const EnsembleApp(
97-
{super.key,
98-
this.screenPayload,
99-
this.ensembleConfig,
100-
this.externalMethods,
101-
this.isPreview = false,
102-
this.placeholderBackgroundColor,
103-
this.onAppLoad,
104-
this.forcedLocale});
97+
EnsembleApp({
98+
super.key,
99+
this.screenPayload,
100+
this.ensembleConfig,
101+
this.externalMethods,
102+
this.isPreview = false,
103+
this.placeholderBackgroundColor,
104+
this.onAppLoad,
105+
this.forcedLocale,
106+
GlobalKey<NavigatorState>? navigatorKey,
107+
}) {
108+
externalAppNavigateKey = navigatorKey;
109+
}
105110

106111
final ScreenPayload? screenPayload;
107112
final EnsembleConfig? ensembleConfig;

lib/framework/action.dart

+6-2
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,8 @@ class NavigateScreenAction extends BaseNavigateScreenAction {
100100
super.options,
101101
this.onNavigateBack,
102102
super.transition,
103-
super.isExternal})
103+
super.isExternal,
104+
super.asExternal})
104105
: super(asModal: false);
105106
EnsembleAction? onNavigateBack;
106107

@@ -118,6 +119,7 @@ class NavigateScreenAction extends BaseNavigateScreenAction {
118119
onNavigateBack: EnsembleAction.fromYaml(payload['onNavigateBack']),
119120
transition: Utils.getMap(payload['transition']),
120121
isExternal: Utils.getBool(payload['external'], fallback: false),
122+
asExternal: Utils.getBool(payload['asExternal'], fallback: false),
121123
);
122124
}
123125

@@ -200,13 +202,15 @@ abstract class BaseNavigateScreenAction extends EnsembleAction {
200202
this.transition,
201203
this.payload,
202204
this.options,
203-
this.isExternal = false});
205+
this.isExternal = false,
206+
this.asExternal = false});
204207

205208
String screenName;
206209
bool asModal;
207210
Map<String, dynamic>? transition;
208211
final Map<String, dynamic>? options;
209212
final bool isExternal;
213+
final bool asExternal;
210214
Map<String, dynamic>? payload;
211215
}
212216

lib/screen_controller.dart

+20-4
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import 'package:ensemble/action/navigation_action.dart';
88
import 'package:ensemble/action/phone_contact_action.dart';
99
import 'package:ensemble/action/upload_files_action.dart';
1010
import 'package:ensemble/ensemble.dart';
11+
import 'package:ensemble/ensemble_app.dart';
1112
import 'package:ensemble/framework/action.dart';
1213
import 'package:ensemble/framework/apiproviders/api_provider.dart';
1314
import 'package:ensemble/framework/bindings.dart';
@@ -210,6 +211,7 @@ class ScreenController {
210211
pageArgs: nextArgs,
211212
transition: action.transition,
212213
isExternal: action.isExternal,
214+
asExternal: action.asExternal,
213215
);
214216

215217
if (action is NavigateScreenAction && action.onNavigateBack != null) {
@@ -665,7 +667,7 @@ class ScreenController {
665667
SystemStorageBindingSource(key, storagePrefix: storagePrefix), value));
666668
}
667669

668-
/// Navigate to another screen
670+
/// Navigate to another
669671
/// [screenName] - navigate to the screen if specified, otherwise to appHome
670672
/// [asModal] - shows the App in a regular or modal screen
671673
/// [replace] - whether to replace the current route on the stack, such that
@@ -680,6 +682,7 @@ class ScreenController {
680682
Map<String, dynamic>? pageArgs,
681683
Map<String, dynamic>? transition,
682684
bool isExternal = false,
685+
bool asExternal = false,
683686
}) {
684687
PageType pageType = asModal == true ? PageType.modal : PageType.regular;
685688

@@ -715,11 +718,24 @@ class ScreenController {
715718
);
716719
// push the new route and remove all existing screens. This is suitable for logging out.
717720
if (routeOption == RouteOption.clearAllScreens) {
718-
Navigator.pushAndRemoveUntil(context, route, (route) => false);
721+
if (asExternal) {
722+
externalAppNavigateKey?.currentState
723+
?.pushAndRemoveUntil(route, (route) => false);
724+
} else {
725+
Navigator.pushAndRemoveUntil(context, route, (route) => false);
726+
}
719727
} else if (routeOption == RouteOption.replaceCurrentScreen) {
720-
Navigator.pushReplacement(context, route);
728+
if (asExternal) {
729+
externalAppNavigateKey?.currentState?.pushReplacement(route);
730+
} else {
731+
Navigator.pushReplacement(context, route);
732+
}
721733
} else {
722-
Navigator.push(context, route);
734+
if (asExternal) {
735+
externalAppNavigateKey?.currentState?.push(route);
736+
} else {
737+
Navigator.push(context, route);
738+
}
723739
}
724740
return route;
725741
}

lib/util/utils.dart

+1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import 'dart:io';
22
import 'dart:math';
33
import 'dart:ui';
4+
import 'package:ensemble/ensemble_app.dart';
45
import 'package:ensemble/framework/stub/location_manager.dart';
56
import 'package:ensemble/framework/theme/theme_manager.dart';
67
import 'package:path/path.dart' as p;

0 commit comments

Comments
 (0)