alibaba / flutter_boost

FlutterBoost is a Flutter plugin which enables hybrid integration of Flutter for your existing native apps with minimum efforts
https://github.com/alibaba/flutter_boost
MIT License
6.96k stars 1.23k forks source link

混合开发如何设置第一个页面为 Flutter 页面 #1579

Open zmtzawqlp opened 2 years ago

zmtzawqlp commented 2 years ago

1.用 flutter create 命令新建一个项目 2.加入boost

问题

  1. 如何让第一个页面为 FlutterBoostActivity
  2. 物理退后按钮失效,点击之后直接退出应用,我发现这个问题,然后猜测应该要让 MainActivity 为 FlutterBoostActivity

谢谢

flutter_boost-e19bf36cb451e2790edb65d353a643dbd472f8fa.zip

zmtzawqlp commented 2 years ago

根据大佬的提示,做了以下修改

安卓: 将 MainActivity 改为继承 FlutterBoostActivity


public class MainActivity extends FlutterBoostActivity {

    private String uniqueId;

    @Override
    public String getUrl() {
        return "SplashPage";
    }

    @Override
    public String getUniqueId() {
        if (uniqueId == null) {
            uniqueId = FlutterBoostUtils.createUniqueId(getUrl());
        }
        return uniqueId;
    }
}

最开始,试过在 application里面设置 initialRoute,好像没用。

public class MyApplication extends FlutterApplication {
    @Override
    public void onCreate() {
        super.onCreate();
        ArrayList<String> args = new ArrayList<>();
        args.add("--trace-systrace");
        args.add("--user-authorization-code=QZvoUptODA+KDgeFUluhheYns7X7CnDu9YRv8YmU0GXQcKLzs4C2WgjblrAIhtkqqGg==");
        // 加不加 initialRoute 都一样。。
        FlutterBoostSetupOptions options = new FlutterBoostSetupOptions.Builder().shellArgs(args.toArray(new String[0])).initialRoute("SplashPage").build();
        FlutterBoost.instance().setup(this, new MyFlutterBoostDelegate(), engine->{
            // Register the platform view
//            engine.getPlatformViewsController().getRegistry().registerViewFactory("<platform-view-type>", new NativeViewFactory());
//            engine.getPlugins();
        }, options);

    }
}

Ios: 在 AppDelegate.m 将root controller 改成以下,注意 给 FlutterBoostSetupOptions 设置 initalRoute 并没啥用

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application
    didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  [GeneratedPluginRegistrant registerWithRegistry:self];

    self.window = [[UIWindow alloc] initWithFrame: [UIScreen mainScreen].bounds];
    [self.window makeKeyAndVisible];
    //默认方法
    MyFlutterBoostDelegate* delegate=[[MyFlutterBoostDelegate alloc ] init];
    //加不加这段都一样,狗头
    FlutterBoostSetupOptions* options = [FlutterBoostSetupOptions createDefault];
    options.initalRoute=@"SplashPage";
    [[FlutterBoost instance] setup:application delegate:delegate callback:^(FlutterEngine *engine) {
        // NSObject<FlutterPluginRegistrar>* registrar = [engine registrarForPlugin:@"plugin-name"];
        // FLNativeViewFactory* factory = [[FLNativeViewFactory alloc] initWithMessenger:registrar.messenger];
        // [[engine registrarForPlugin:@"<plugin-name>"] registerViewFactory:factory withId:@"<platform-view-type>"];
    } options:options];

    FBFlutterViewContainer *fvc = FBFlutterViewContainer.new ;
    [fvc setName:@"SplashPage" uniqueId:[[NSUUID UUID] UUIDString] params:@{} opaque:YES];
    UINavigationController *rvc = [[UINavigationController alloc] initWithRootViewController:fvc];
    rvc.navigationBar.hidden = YES;
   delegate.navigationController=rvc;

   self.window.rootViewController = rvc;
  return [super application:application didFinishLaunchingWithOptions:launchOptions];
}
@end

Flutter:

FlutterBoostApp(initialRoute:'SplashPage')

如果有不对的地方,希望指出一下。谢谢

zmtzawqlp commented 2 years ago

新的一个问题是:routeFactory 会走2次,一次看起来是 flutter 这端触发,一次是原生触发的。希望有空的时候帮忙看看。谢谢

flutter: SplashPage----1644546364676_SplashPage flutter: SplashPage----8AC93EB5-F0F9-4110-8155-4212E0B30CD8

注意,isFlutterPage 这个方法,我已经改过了。不会用 routeFactory 去判断,第一次触发是在 FlutterBoostAppState的初始化方法中 image

yoni1988 commented 2 years ago

有谁知道这个怎么解决吗?

Passer-by commented 2 years ago

我也有同样的问题

zmtzawqlp commented 2 years ago

魔改。把flutter触发的那次去掉。因为原生已经设置过了