關於Flutter和Android混合開發引入flutter_boost插件-有更新,見底部


參考鏈接:https://www.jianshu.com/p/4eee4ddb2b6a

flutter_boost:https://github.com/alibaba/flutter_boost

定義:新一代Flutter-Native混合解決方案。 FlutterBoost是一個Flutter插件,它可以輕松地為現有原生應用程序提供Flutter混合集成方案。FlutterBoost的理念是將Flutter像Webview那樣來使用。在現有應用程序中同時管理Native頁面和Flutter頁面並非易事。 FlutterBoost幫你處理頁面的映射和跳轉,你只需關心頁面的名字和參數即可(通常可以是URL)

上篇里面的插件打包代碼雖然已經將flutter_boost打包到flutter_module工程最終產出aar包里,但是Android Native端也要集成flutter_boost的代碼,這是flutter_boost插件和其他插件不一樣的地方,比如http插件只是在flutter代碼中調用就可以了。本來想可以直接改下上篇的gradle build文件直接把flutter_boost也一起打到aar包里試了試不行,誰搞了定了或者有更好的方案可以告我下

當然也可以針對flutter_boost單獨build aar包並上傳到maven庫,但感覺有些麻煩,而且flutter_boost還依賴xservice_kit和fastjson,先手動搞下

直接用的flutter_boost下的example,包含了native中打開native,flutter,flutter fragment。flutter中打開native,flutter,flutter widget,flutter fragment。示例挺全的

Flutter_module端

1、添加flutter_boost插件

2、復制dart代碼,build新包給Android Native用

flutter_boost example在C:\flutter\.pub-cache\hosted\pub.flutter-io.cn\flutter_boost-0.0.420\example\下,C:\flutter是我的flutter根目錄

把C:\flutter\.pub-cache\hosted\pub.flutter-io.cn\flutter_boost-0.0.420\example\lib下的main.dart,simple_page_widgets.dart覆蓋到flutter_module工程lib下

Android Native端

1、將flutter_boost和xservice_kit build后的aar包復制到Android Native libs目錄下(用來Android導入本地包的目錄)

flutter_boost和xservice_kit aar包的位置,C:\flutter是我的flutter根目錄

C:\flutter\.pub-cache\hosted\pub.flutter-io.cn\flutter_boost-0.0.420\android\build\outputs\aar\flutter_boost-release.aar

C:\flutter\.pub-cache\hosted\pub.flutter-io.cn\xservice_kit-0.0.29\android\build\outputs\aar\xservice_kit-release.aar

2、Android Native工程引入資源,修改app目錄下的build.gradle文件

repositories配置
repositories {
    maven {
        url "maven庫url"
        credentials {
            username 'maven庫用戶名'
            password 'maven庫密碼'
        }
    }
    flatDir {
        dirs 'libs'
    }
}
dependencies配置

dependencies {
    ***
    // libs 包,手動導入flutter_boost 和 xservice_kit
    implementation(name: 'flutter_boost-release', ext: 'aar')
    implementation(name: 'xservice_kit-release', ext: 'aar')
    // 引入fastjson flutter_boost
    implementation 'com.alibaba:fastjson:1.2.41'

}

3、build完成后可以寫Android Native端的代碼了,把example下android工程main下的代碼都copy過來,包含了java代碼、AndroidManifest.xml新增activity、res下面的layout xml、res下面的values xml

C:\flutter\.pub-cache\hosted\pub.flutter-io.cn\flutter_boost-0.0.420\example\android\app\src\main

不知道MainActivity為什么沒初始化,會報錯,加了一個初始化FlutterBoostPlugin的類FlutterMediator.java,並在MainActivity中調用,我這里用的androidx,代碼可能會有些出入

MainActivity.java

 1 2 
 3 import android.app.Activity;
 4 import android.app.Application;
 5 import android.content.Context;
 6 import android.os.Bundle;
 7 import android.view.View;
 8 import android.widget.TextView;
 9 
10 import androidx.annotation.Nullable;
11 import androidx.appcompat.app.AppCompatActivity;
12 import com.sinagz.b.R;
13 import com.taobao.idlefish.flutterboost.FlutterBoostPlugin;
14 import com.taobao.idlefish.flutterboost.interfaces.IPlatform;
15 import io.flutter.view.FlutterMain;
16 
17 import java.lang.ref.WeakReference;
18 import java.util.HashMap;
19 import java.util.Map;
20 
21 public class FlutterMainActivity extends AppCompatActivity implements View.OnClickListener {
22 
23     public static WeakReference<FlutterMainActivity> sRef;
24     private TextView mOpenNative;
25     private TextView mOpenFlutter;
26     private TextView mOpenFlutterFragment;
27 
28     @Override
29     protected void onCreate(@Nullable Bundle savedInstanceState) {
30         super.onCreate(savedInstanceState);
31         FlutterMediator.init(new Application());
32         FlutterMain.startInitialization(getApplicationContext());
33         sRef = new WeakReference<>(this);
34 
35         setContentView(R.layout.native_page);
36 
37         mOpenNative = findViewById(R.id.open_native);
38         mOpenFlutter = findViewById(R.id.open_flutter);
39         mOpenFlutterFragment = findViewById(R.id.open_flutter_fragment);
40 
41         mOpenNative.setOnClickListener(this);
42         mOpenFlutter.setOnClickListener(this);
43         mOpenFlutterFragment.setOnClickListener(this);
44 
45 
46     }
47 
48     @Override
49     protected void onDestroy() {
50         super.onDestroy();
51         sRef.clear();
52         sRef = null;
53     }
54 
55     @Override
56     public void onClick(View v) {
57         if (v == mOpenNative) {
58             PageRouter.openPageByUrl(this, PageRouter.NATIVE_PAGE_URL);
59         } else if (v == mOpenFlutter) {
60             PageRouter.openPageByUrl(this, PageRouter.FLUTTER_PAGE_URL);
61             FlutterBoostPlugin.onPageResult("result_id_100",new HashMap(),new HashMap());
62         } else if (v == mOpenFlutterFragment) {
63             PageRouter.openPageByUrl(this, PageRouter.FLUTTER_FRAGMENT_PAGE_URL);
64         }
65     }
66 }

FlutterMediator.java

 1  2 
 3 import android.app.Activity;
 4 import android.app.Application;
 5 import android.content.Context;
 6 import com.taobao.idlefish.flutterboost.Debuger;
 7 import com.taobao.idlefish.flutterboost.FlutterBoostPlugin;
 8 import com.taobao.idlefish.flutterboost.interfaces.IPlatform;
 9 import io.flutter.app.FlutterApplication;
10 import io.flutter.view.FlutterMain;
11 
12 import java.util.Map;
13 
14 public class FlutterMediator extends FlutterApplication {
15 
16     public static void init(Application app) {
17 
18         FlutterBoostPlugin.init(new IPlatform() {
19             @Override
20             public Application getApplication() {
21                 return app;
22             }
23 
24             @Override
25             public Activity getMainActivity() {
26                 return FlutterMainActivity.sRef.get();
27             }
28 
29             @Override
30             public boolean isDebug() {
31                 return true;
32             }
33 
34             @Override
35             public boolean startActivity(Context context, String url, int requestCode) {
36                 Debuger.log("startActivity url="+url);
37 
38                 return PageRouter.openPageByUrl(context,url,requestCode);
39             }
40 
41             @Override
42             public Map getSettings() {
43                 return null;
44             }
45         });
46     }
47 }

 結果:

 

 

 --------------------------------------------------------更新線-------------------------------------------------

flutter_boost可以直接打到fat-aar包里,方式見 https://www.jianshu.com/p/2258760e9540

native端使用的時候可以直接將example里的MyApplication.java放到AndroidManifest.xml做入口文件,但是一般項目不會這樣弄,我是集成到native項目,直接在native項目的入口文件做初始化,然后只需要一個PageRouter.java和FlutterPageActivity.java文件,在native頁面的點擊方法里調PageRouter.openPageByUrl(context, PageRouter.FLUTTER_PAGE, params)並在PageRouter用Intent傳參,這樣就可以一個FlutterPageActivity調不同的flutter頁面了

還有一個問題就是用了flutter_boost后,FlutterView交給flutter_boost管理了,這樣的話和原生建立MethodChannel的時候會有問題,因為MethodChannel的BinaryMessenger是通過FlutterView實現的。又不能在原生項目里單獨再生成一個FlutterView,這樣會直接調起main.dart里的頁面。我一想flutter_boost既然管理flutterView肯定能拿到,getFlutterView 類似的方法找了半天都沒找到,最后去官方看了下issue,果然有提到的。在mFlutterEngine.getDartExecutor()

 還有問題就是flutter_boost最新只支持到v1.5.4-hotfix.2,之前調好flutter_boost后直接升級到1.7.8了。。然后又降級flutter版本,然后一堆插件報錯。。開始就應該基於v1.5.4-hotfix.2寫


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM