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 
{

}