Flutter: Módulo Flutter integrado Android/iOS

1. Proyecto del módulo Flutter de integración del proyecto Android:

1. Use el comando para crear el proyecto del módulo Flutter lib_flutter (que pertenece al mismo directorio de nivel que el proyecto de Android):

flutter create -t module --org com.yyh lib_flutter

2. Actualice la configuración del proyecto de Android:

(1) Reemplace el paquete Android Support V4/V7 del proyecto con el paquete AndroidX, haga clic con el botón derecho en el proyecto, seleccione Refactorizar > Migrar a AndroidX... en el menú emergente y luego haga clic en Refactorizar en el cuadro que aparece. en la esquina inferior izquierda, y luego espere el automático El reemplazo está hecho:

(2) Modifique compileSdkVersion y targetSdkVersion a 31, en Android project/app/build.gradle:

android {
    compileSdkVersion 31   //修改为31,否则报错
    buildToolsVersion '30.0.2'
    defaultConfig {
        minSdkVersion 23
        targetSdkVersion 31   //修改为31,否则报错
        //...省略其他配置
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

(3) Modificar kotlin_version, en Android project/build.gradle:

buildscript {
    ext.kotlin_version = '1.6.10'
    ...
    dependencies {
        classpath 'com.android.tools.build:gradle:4.2.1'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version"
    }
}

(4) Manejar el informe de errores de Android12 en AndroidManifest.xml:

<application tools:node="replace">   <!-- 替换三方库中的相关属性,以此处为准 -->
        <activity android:exported="true">   <!-- 为含<intent-filter>的节点增加android:exported属性(Android12要求) -->
            <intent-filter>...</intent-filter>
        </activity>
        <receiver android:exported="true">
            <intent-filter>...</intent-filter>
        </receiver>
        <service android:exported="true">
            <intent-filter>...</intent-filter>
        </service>
</application>

3. Importa el módulo Flutter:

(1) Cargue el proyecto del módulo lib_flutter, agregue Android project/settings.gradle:

...  #省略其他配置
setBinding(new Binding([gradle: this]))
evaluate(new File(settingsDir.parentFile, 'lib_flutter/.android/include_flutter.groovy'))
#以下2行Sync后自动产生,无需添加(如果不能生成,则手动添加)
include ':lib_flutter'
project(':lib_flutter').projectDir = new File('../lib_flutter')

(3) Agregue la dependencia de Flutter, en Android project/app/build.gradle:

dependencies {
  //...省略其他配置
  implementation project(':flutter')  //添加Flutter依赖
}

(4) Haga clic en Sincronizar proyecto con... para sincronizar y podrá ver el módulo lib_flutter en Android Studio una vez finalizado.

4. Salta a la página de Flutter:

(1) Agregue FlutterActivity al nodo <application> en AndroidManifest.xml:

<activity
    android:name="io.flutter.embedding.android.FlutterActivity"
    android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
    android:theme="@style/FlutterPageTheme"    
    android:hardwareAccelerated="true"
    android:screenOrientation="portrait"
    android:windowSoftInputMode="adjustResize"
    />

(2) Ir a la página de inicio de entrada de Flutter (inicio en frío):

startActivity(FlutterActivity.createDefaultIntent(this));

(3) Ir a la página personalizada de Flutter:

Método 1 (arranque en frío):

startActivity(FlutterActivity.withNewEngine()
                .initialRoute("路由id")  //要跳转的页面路由id,需要在Flutter中注册此路由id
                //.backgroundMode(FlutterActivityLaunchConfigs.BackgroundMode.transparent)  //设置透明背景
                .build(this));

Método 2 (arranque en caliente):

//初始化FlutterEngine
public class AFApplication extends Application {
    public FlutterEngine mFlutterEngine; //预热方式启动的FlutterEngine
    @Override
    public void onCreate() {
        super.onCreate();
        initFlutterEngine();
        ...
    }
    void initFlutterEngine(){//初始化FlutterEngine
        mFlutterEngine = new FlutterEngine(this);
        mFlutterEngine.getNavigationChannel().setInitialRoute("路由id"); //设置初始跳转页路由id,需要在Flutter中注册此路由id
        mFlutterEngine.getDartExecutor().executeDartEntrypoint(DartExecutor.DartEntrypoint.createDefault());  //开始预热FlutterEngine
        FlutterEngineCache.getInstance().put("engine_id", mFlutterEngine); //缓存engine_id
    }
}
//跳转Flutter指定页(热启动,低延迟)
startActivity(FlutterActivity.withCachedEngine("engine_id")  //使用已缓存的engine_id启动Flutter自定义页
                //.backgroundMode(FlutterActivityLaunchConfigs.BackgroundMode.transparent)  //设置透明背景
                .build(this));

5. Consulta la documentación oficial de Flutter Fragment y Flutter View:

https://flutter.cn/docs/development/add-to-app/android/add-flutter-fragment

2. Proyecto del módulo Flutter de integración del proyecto iOS:

1. Use el comando para crear el proyecto del módulo Flutter lib_flutter (que pertenece al mismo directorio de nivel que el proyecto iOS):

flutter create --template module lib_flutter

2. Configure el proyecto iOS y agréguelo al proyecto/Podfile (ejecute el comando después de completarlo: pod install):

#导入lib_flutter模块工程
flutter_application_path = '../lib_flutter'
load File.join(flutter_application_path, '.ios', 'Flutter', 'podhelper.rb')

target 'iOSP_FlutterM' do
  use_frameworks!
  install_all_flutter_pods(flutter_application_path)  #flutter相关
end
#flutter相关
post_install do |installer|
  flutter_post_install(installer) if defined?(flutter_post_install)
end

3. Salta a la página de Flutter:

(1) Modo 1 (arranque en frío):

- (void)startFlutterPageByCold{
    //跳转Flutter入口首页
    FlutterViewController *flutterViewController = [[FlutterViewController alloc] initWithProject:nil nibName:nil bundle:nil];
    //跳转Flutter指定页,路由id需要在Flutter中注册
    //FlutterViewController *flutterViewController = [[FlutterViewController alloc] initWithProject:nil initialRoute:@"路由id" nibName:nil bundle:nil];
    [self presentViewController:flutterViewController animated:YES completion:nil];
}

(2) Modo 2 (arranque en caliente):

AppDelegate.h:

@import Flutter;
//...省略其他无关的
@interface AppDelegate : FlutterAppDelegate
@property (nonatomic,strong) FlutterEngine *flutterEngine;  //定义FlutterEngine
//...省略其他无关的
@end

AppDelegate.m:

#import "AppDelegate.h"
#import <FlutterPluginRegistrant/GeneratedPluginRegistrant.h>
//...省略其他无关的
@interface AppDelegate ()
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    self.flutterEngine = [[FlutterEngine alloc] initWithName:@"engine_id"];
    [self.flutterEngine run]; //跳转Flutter入口首页
    //[self.flutterEngine runWithEntrypoint:FlutterDefaultDartEntrypoint initialRoute:@"路由id"];  //跳转Flutter指定页面,路由id需要在Flutter中注册
    [GeneratedPluginRegistrant registerWithRegistry:self.flutterEngine];  //连接插件(仅带有iOS平台的插件时需要)
    return YES;
}
//...省略其他无关的

Código de salto:

- (void)startFlutterPageByHot{
    FlutterEngine *flutterEngine = ((AppDelegate *)UIApplication.sharedApplication.delegate).flutterEngine;//获取AppDelegate中的FlutterEngine
    FlutterViewController *flutterViewController = [[FlutterViewController alloc] initWithEngine:flutterEngine nibName:nil bundle:nil];
    [self presentViewController:flutterViewController animated:YES completion:nil];
}

Supongo que te gusta

Origin blog.csdn.net/a526001650a/article/details/127987359
Recomendado
Clasificación