hybrid_flutter 0.2.1 copy "hybrid_flutter: ^0.2.1" to clipboard
hybrid_flutter: ^0.2.1 copied to clipboard

discontinued
PlatformAndroidiOS

Flutter Hybrid Stack Manager.

Introduction #

Flutter Hybrid stack Manager.

This plugin can be used in both Flutter Module and Flutter App.

This plugin support sharing single FlutterEngine in FlutterFragment or FlutterViewController

Also, you can switch to multi-engine mode.

Getting Started #

More feature usage can be found in example.

Add dependency

In you pubsepc.yaml:

hybrid_flutter: ^0.1.0

In Dart

Use HybridApp instead of WidgetsAppMaterialApp or CupertinoApp in your app.dart.

Map<String, WidgetBuilder> get pages => {
  '/': (ctx) => Container(),
  '/home': (ctx) => HomePage(),
  '/share': (ctx) => SharePage(),
  '/spawn': (ctx) => SpawnPage(),
};

class MyApp extends StatefulWidget {

  const MyApp({
    Key? key,
  }) : super(key: key);

  @override
  State<StatefulWidget> createState() {
    return _MyAppState();
  }
}

class _MyAppState extends State<MyApp> {

  @override
  Widget build(BuildContext context) {
    TextStyle style = const TextStyle(
      fontFamily: 'PingFangSC-Regular',
      fontFamilyFallback: ['PingFang SC', 'Roboto'],
      fontSize: 14,
      color: Colors.black
    );
    return HybridApp(
      textStyle: style,
      onGenerateInitialRoutes: (String initialRouteName) {
        final List<Route<dynamic>> result = <Route<dynamic>>[];
        final route = onGenerateRoute(RouteSettings(name: initialRouteName));
        if (route != null) {
          result.add(route);
        }
        return result;
      },
      onGenerateRoute: onGenerateRoute,
      color: Colors.white,
      builder: (ctx, child) {
        return Theme(
          data: ThemeData(
            textTheme: TextTheme(
              bodyText1: style,
              bodyText2: style,
            ),
            primaryTextTheme: TextTheme(
              bodyText1: style,
              bodyText2: style,
            )
          ),
          child: child!,
        );
      },
    );
  }
  
  Route<dynamic>? onGenerateRoute(RouteSettings settings) {
    String? routeName = settings.name;
    Object? arguments = settings.arguments;
    final Uri? uri = Uri.tryParse(routeName ?? '/');
    if (uri != null) {
      routeName = uri.path;
      arguments ??= uri.queryParameters;
    }
    final newSettings = RouteSettings(
      name: routeName,
      arguments: arguments,
    );
    return MyRoute(
      settings: newSettings,
      builder: pages[newSettings.name] ?? (ctx) => Container(color: Colors.red)
    );
  }
}

In Android

First, implement IHybridFlutterNavigator interface

object HybridFlutterNavigator : IHybridFlutterNavigator {
  override fun push(route: String, arguments: HashMap<String, String>?, context: Context) {
    val intent = Intent(context, MainFragmentActivity::class.java)
    intent.putExtra(MainFragmentActivity.KEY_ROUTE, route)
    arguments?.keys?.forEach { key ->
      intent.putExtra(key, arguments[key])
    }
    context.startActivity(intent)
  }

  override fun pop(activity: Activity?, result: Any?) {
    activity?.finish()
  }
}

Then, set the navigator to HybridFlutterManager before enter FlutterEngine

HybridFlutterManager.navigator = HybridFlutterNavigator

Finally, use HybridFlutterFragment instead of FlutterFragment in FragmentActivity.

val flutterFragment = FlutterFragment.NewEngineFragmentBuilder(HybridFlutterFragment::class.java)
    .initialRoute(route)
    .build()
supportFragmentManager
    .beginTransaction()
    .add(R.id.fragment_container, flutterFragment, TAG_FLUTTER_FRAGMENT)
    .commit()

In iOS

First, implement HybridFlutterNavigator protocol.

class MyHybridFlutterNavigator : NSObject, HybridFlutterNavigator {
  func pushRoute(_ route: String?, arguments: Any?, viewController flutterViewController: FlutterViewController?) {
    let vc = MyFlutterViewController.init(route: route, parameters: arguments as? [String:String], useNewEngine: false)
    flutterViewController?.navigationController?.pushViewController(vc, animated: true)
  }
  
  func pop(_ flutterViewController: FlutterViewController?, result: Any?) {
    flutterViewController?.navigationController?.popViewController(animated: true)
  }
}

Then, set the navigator to HybridFlutterManager before enter FlutterEngine.

HybridFlutterManager.sharedInstance().navigator = MyHybridFlutterNavigator.init()

Finally, use HybridFlutterViewController instead of FlutterViewController.

let win = UIWindow.init(frame: UIScreen.main.bounds)
let flutterViewController = MyFlutterViewController.init(route: "/home", parameters: nil, useNewEngine: false)
let navigationController = UINavigationController.init(rootViewController: flutterViewController)
navigationController.navigationBar.isHidden = true
win.rootViewController = navigationController
1
likes
100
pub points
0%
popularity

Publisher

unverified uploader

Flutter Hybrid Stack Manager.

Repository (GitHub)
View/report issues

Documentation

API reference

License

BSD-3-Clause (LICENSE)

Dependencies

flutter

More

Packages that depend on hybrid_flutter