Hybrid Navigation
Scenarios
Scenario 1
When users click the CTA, the default behavior is rendering the CTA link content using the native web view. But the host app developers may want to render the CTA link content using the Flutter page.
Scenario 2
When users click the cart icon, the host app may want to navigate the custom Flutter cart page.
Issues
Both the CTA button and cart icon belong to the video player. There are similar issues in these two scenarios. As follows, when the video player is launched, the Flutter navigation stack is covered by the video player.
And when the host app developers use Navigator.of(context).pushNamed
to navigate the Flutter page, the page will be rendered in the bottom Flutter navigation stack. Therefore, the new Flutter page would be covered by the video player(native page).
Solution
As follows, we add a new native container to embed a new Flutter navigation stack:
API
We add FWNavigator to help navigate from the native page to the Flutter page.
Integration steps for scenario 1
On the iOS side
The host app needs to return the FlutterViewController
instance in SwiftFireworkFlutterSdkPlugin.navigatorPageProvider
. The sample file is AppDelegate.swift.
On the Android side
The host app needs to set FireworkFlutterSdkPlugin.containerFragmentDelegate
and return FlutterFragment
instance in getFragment
method. The sample file is MainActivity.kt.
On the Dart side
Add route configuration for the custom CTA link content page. For example, we could set the route name to
/cta_link_content
. The sample file is routes.dart.In the sample project, we add
new_native_container
(or any other custom prefix without/
) to the prefix of route name, which could avoid rendering the screen whose route name is/
in the new engine. Therefore, we need to removenew_native_container
from the route name. The sample file is my_app.dart.Custom back button of the app bar. For the new native container, we need to call
FireworkSDK.getInstance().navigator.popNativeContainer()
to pop the native container. The sample file is fw_app_bar.dart.
As above steps, we create a new Flutter engine for the new native container. Therefore, we also provide FWEventBus to dispatch events across Flutter engines. You could refer to the following files for more details:
For integration steps for scenario 2, you could refer to Navigate to the Flutter page from the video player.
The reasons for creating the Flutter engine by the host app
Creating the Flutter engine by the host app has better performance. For example, the host app could use Flutter Engine Group to manage multiple engines.
We need to use
GeneratedPluginRegistrant
to register related plugins in the new Engine. But the iOS platform codes of Firework Flutter SDK can't access the class.
Close the video or live stream player
If you don't want to handle hybrid navigation, you could use FireworkSDK.getInstance().navigator.popNativeContainer()
to close the video or live stream player.
Last updated