Flutter
1、Flutter版本要求:1.17及以上
2、yaml中引入
d_stack: ^1.2.5
3、执行 pub get
4、在main.dart引入文件
import 'package:d_stack/d_stack.dart'; import 'package:d_stack/observer/life_cycle_observer.dart';
5、在main()函数加入
// 注册路由builder , 生命周期监听 DStack.instance.register( builders: builder的实现者,参考步骤7 );
6、在MaterialApp里面配置navigatorKey、navigatorObservers、home
return MaterialApp( navigatorKey: DStack.instance.navigatorKey, navigatorObservers: [DStack.instance.dStackNavigatorObserver], home: DStackWidget(), );
对于home: DStackWidget(),如果工程是flutter为主工程的,则配置为home: DStackWidget(homePage: yourHomePage),需要在DStackWidget初始化时配置自己工程中的homePage
如果是native为主工程,flutter是以module形式接入的,则配置为home: DStackWidget()即可
7、builder的实现
class RouterBuilder { static Map<String, DStackWidgetBuilder> builders() { Map<String, DStackWidgetBuilder> builders = { 'page1': page1Builder, 'page2': page2Builder, }; return builders; } static DStackWidgetBuilder page1Builder = (Map params) { return (BuildContext context) { return Page1(); }; }; static DStackWidgetBuilder page2Builder = (Map params) { return (BuildContext context) { return Page2(); }; }; }
安卓
纯Flutter工程
1.工程的pubspec.yaml中,引入dstack依赖
d_stack: ^1.2.5
2.以工程方式打开android目录,进入android工程进行配置
3.在自己工程的自定义application中,onCreate方法内初始化混合栈
val nativeRouter = INativeRouter { routerUrl, params -> } DStack.getInstance().init(this, nativeRouter)
4.在自己工程的flutter容器activity中,实现引擎复用方法
override fun provideFlutterEngine(context: Context): FlutterEngine? { return FlutterEngineCache.getInstance().get(DStack.ENGINE_ID) }
原生工程接入flutter模块
1,2,3,4,步骤如上,额外添加步骤5
5.在app的build.gradle中,添加依赖 implementation project(':d_stack')
iOS
1、在AppDelegate引入头文件
#import "FlutterPluginRegistrant/GeneratedPluginRegistrant.h" #import <DStack.h>
2、在didFinishLaunchingWithOptions调用
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [DStack sharedInstance] startWithDelegate:id<DStackDelegate>]; [GeneratedPluginRegistrant registerWithRegistry:DStack.sharedInstance.engine]; }
3、在id所在的头文件中加入
@DStackInject(当前类);
4、实现DStackDelegate的代理方法
+ (nonnull FlutterEngine *)dStackForFlutterEngine { } - (UINavigationController *)dStack:(DStack *)stack navigationControllerForNode:(DStackNode *)node { } - (void)dStack:(DStack *)stack presentWithNode:(DStackNode *)node { } - (void)dStack:(DStack *)stack pushWithNode:(DStackNode *)node { }
例如在TRouterDelegate里实现DStackDelegate,完整示例为
#import <DStack.h> @interface TRouterDelegate : NSObject <DStackDelegate> @end #import "TRouterDelegate.h" // 注解 @DStackInject(TRouterDelegate); @implementation TRouterDelegate + (nonnull FlutterEngine *)dStackForFlutterEngine { FlutterEngine *engine = [[FlutterEngine alloc] initWithName:@"io.flutter" project:nil]; [engine run]; return engine; } - (UINavigationController *)dStack:(DStack *)stack navigationControllerForNode:(DStackNode *)node { } - (void)dStack:(DStack *)stack presentWithNode:(DStackNode *)node { } - (void)dStack:(DStack *)stack pushWithNode:(DStackNode *)node { }