Skip to content

Commit c52157a

Browse files
committed
接入FlutterBoost简化Native与Flutter交互
1 parent e9bfea3 commit c52157a

16 files changed

+146
-126
lines changed

app/build.gradle

+6-4
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
apply plugin: 'com.android.application'
22
apply plugin: 'kotlin-android'
3-
apply plugin: 'kotlin-android-extensions'
43
apply plugin: 'kotlin-kapt'
4+
apply plugin: 'kotlin-android-extensions'
55
apply plugin: 'android-aspectjx'
66
apply plugin: 'com.didi.dokit'
77
apply plugin: 'image-compress-plugin'
@@ -20,9 +20,9 @@ aspectjx {
2020
exclude 'module-info', 'kotlinx.coroutines', 'androidx.paging', 'com.lxj.xpopup', 'com.just.agentweb'
2121
}
2222

23-
kapt {
24-
generateStubs = true
25-
}
23+
//kapt {
24+
// generateStubs = true
25+
//}
2626

2727
android {
2828
compileSdkVersion 29
@@ -190,5 +190,7 @@ dependencies {
190190

191191
//flutter
192192
implementation project(':flutter')
193+
//flutter_boost
194+
implementation project(':flutter_boost')
193195

194196
}

app/src/main/AndroidManifest.xml

+7-7
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@
2828
<meta-data
2929
android:name="io.flutter.app.android.SplashScreenUntilFirstFrame"
3030
android:value="true" />
31+
<meta-data
32+
android:name="flutterEmbedding"
33+
android:value="2"/>
3134
<activity
3235
android:name=".WelcomeActivity"
3336
android:theme="@style/SplashTheme">
@@ -72,14 +75,11 @@
7275
android:screenOrientation="portrait"
7376
android:theme="@style/FullScreenTheme" />
7477
<activity
75-
android:name=".FlutterAppActivity"
76-
android:screenOrientation="portrait" />
77-
<activity
78-
android:name="io.flutter.embedding.android.FlutterActivity"
79-
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
78+
android:name="com.idlefish.flutterboost.containers.FlutterBoostActivity"
79+
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density"
8080
android:hardwareAccelerated="true"
81-
android:windowSoftInputMode="adjustResize"
82-
/>
81+
android:theme="@style/Theme.AppCompat"
82+
android:windowSoftInputMode="adjustResize"/>
8383
<!-- Android 7.0以上 照片、APK等下载保存路径 -->
8484
<provider
8585
android:name="androidx.core.content.FileProvider"

app/src/main/java/com/fmt/github/App.kt

+7-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package com.fmt.github
22

33
import android.app.Application
44
import android.content.ContextWrapper
5+
import android.os.Debug
56
import com.fmt.github.tasks.*
67
import com.rousetime.android_startup.StartupManager
78

@@ -17,7 +18,12 @@ class App : Application() {
1718
StartupManager.Builder()
1819
.addStartup(InitBuGlyTask())
1920
.addStartup(InitKoInTask())
20-
.addStartup(InitDoKitTask())
21+
.apply {
22+
if (BuildConfig.DEBUG) {
23+
addStartup(InitDoKitTask())
24+
}
25+
}
26+
.addStartup(InitFlutterBoostTask())
2127
.addStartup(InitImageLoaderTask())
2228
.addStartup(InitSmartRefreshLayoutTask())
2329
.build(this)

app/src/main/java/com/fmt/github/FlutterAppActivity.kt

-24
This file was deleted.

app/src/main/java/com/fmt/github/home/activity/HomeActivity.kt

+6-6
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,9 @@ import androidx.appcompat.app.ActionBarDrawerToggle
88
import androidx.core.content.ContextCompat
99
import androidx.lifecycle.lifecycleScope
1010
import androidx.navigation.Navigation
11-
import com.fmt.github.FlutterAppActivity
1211
import com.fmt.github.R
1312
import com.fmt.github.base.activity.BaseVMActivity
1413
import com.fmt.github.base.viewmodel.BaseViewModel
15-
import com.fmt.github.constant.Constant
1614
import com.fmt.github.data.storage.Preference
1715
import com.fmt.github.databinding.LayoutNavHeaderBinding
1816
import com.fmt.github.ext.getVersionName
@@ -28,6 +26,8 @@ import com.fmt.github.user.dao.UserDao
2826
import com.fmt.github.user.model.UserModel
2927
import com.fmt.github.user.model.db.User
3028
import com.google.android.material.navigation.NavigationView
29+
import com.idlefish.flutterboost.FlutterBoost
30+
import com.idlefish.flutterboost.FlutterBoostRouteOptions
3131
import kotlinx.android.synthetic.main.activity_main.*
3232
import kotlinx.coroutines.launch
3333
import org.koin.android.ext.android.inject
@@ -98,10 +98,10 @@ class HomeActivity : BaseVMActivity(), NavigationView.OnNavigationItemSelectedLi
9898
R.id.item_about -> startActivity<AboutActivity>(false)
9999

100100
R.id.item_trend -> {
101-
Bundle().run {
102-
putString(FlutterAppActivity.INIT_PARAMS, Constant.Router.ROUTER_TREND)
103-
startActivity<FlutterAppActivity>(this)
104-
}
101+
FlutterBoost.instance().open(FlutterBoostRouteOptions.Builder()
102+
.pageName("trendPage")
103+
.arguments(mapOf())
104+
.build())
105105
}
106106

107107
R.id.item_logout -> showLogoutPopup()

app/src/main/java/com/fmt/github/plugin/PluginManager.kt

-44
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package com.fmt.github.tasks
2+
3+
import android.content.Context
4+
import android.content.Intent
5+
import com.fmt.github.config.Configs
6+
import com.fmt.github.mApplication
7+
import com.fmt.github.repos.activity.ReposDetailActivity
8+
import com.rousetime.android_startup.AndroidStartup
9+
import com.idlefish.flutterboost.FlutterBoost;
10+
import com.idlefish.flutterboost.FlutterBoostDelegate;
11+
import com.idlefish.flutterboost.FlutterBoostRouteOptions;
12+
import com.idlefish.flutterboost.containers.FlutterBoostActivity;
13+
import io.flutter.embedding.android.FlutterActivityLaunchConfigs;
14+
import io.flutter.embedding.engine.FlutterEngine
15+
16+
class InitFlutterBoostTask : AndroidStartup<Unit>() {
17+
18+
override fun callCreateOnMainThread(): Boolean = true
19+
20+
override fun waitOnMainThread(): Boolean = true
21+
22+
override fun create(context: Context) {
23+
FlutterBoost.instance().setup(mApplication, object : FlutterBoostDelegate {
24+
override fun pushNativeRoute(options: FlutterBoostRouteOptions) {
25+
if ("reposDetail" == options.pageName()) {
26+
val intent = Intent(
27+
FlutterBoost.instance().currentActivity(),
28+
ReposDetailActivity::class.java
29+
).apply {
30+
putExtra(
31+
ReposDetailActivity.WEB_URL,
32+
"${Configs.GITHUB_BASE_URL}${options.arguments()[ReposDetailActivity.WEB_URL]}"
33+
)
34+
putExtra(
35+
ReposDetailActivity.REPO,
36+
options.arguments()[ReposDetailActivity.REPO].toString()
37+
)
38+
putExtra(
39+
ReposDetailActivity.OWNER,
40+
options.arguments()[ReposDetailActivity.OWNER].toString()
41+
)
42+
}
43+
FlutterBoost.instance().currentActivity()
44+
.startActivityForResult(intent, options.requestCode())
45+
}
46+
}
47+
48+
override fun pushFlutterRoute(options: FlutterBoostRouteOptions) {
49+
val intent: Intent =
50+
FlutterBoostActivity.CachedEngineIntentBuilder(FlutterBoostActivity::class.java)
51+
.backgroundMode(FlutterActivityLaunchConfigs.BackgroundMode.transparent)
52+
.destroyEngineWithActivity(false)
53+
.uniqueId(options.uniqueId())
54+
.url(options.pageName())
55+
.urlParams(options.arguments())
56+
.build(FlutterBoost.instance().currentActivity())
57+
FlutterBoost.instance().currentActivity().startActivity(intent)
58+
}
59+
}) { engine: FlutterEngine ->
60+
61+
}
62+
}
63+
}

build.gradle

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
apply from: './config.gradle'
33

44
buildscript {
5-
ext.kotlin_version = '1.4.10'
5+
ext.kotlin_version = '1.5.10'
66
repositories {
77
maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
88
maven { url 'https://maven.aliyun.com/repository/google' }

flutter_module/lib/main.dart

+29-12
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,13 @@ import 'dart:ui';
33

44
import 'package:flutter/material.dart';
55
import 'package:flutter/services.dart';
6+
import 'package:flutter_boost/flutter_boost.dart';
67
import 'package:flutter_module/page/trend_page.dart';
78
import 'color/color.dart';
89

910
void main() {
11+
//这里的CustomFlutterBinding调用务必不可缺少,用于控制Boost状态的resume和pause
12+
CustomFlutterBinding();
1013
runApp(MyApp(window.defaultRouteName));
1114
if (Platform.isAndroid) {
1215
// 以下两行 设置android状态栏为透明的沉浸。写在组件渲染之后,是为了在渲染后进行set赋值,覆盖状态栏,写在渲染之前MaterialApp组件会覆盖掉这个值。
@@ -16,32 +19,46 @@ void main() {
1619
}
1720
}
1821

22+
///4.创建一个自定义的Binding,继承和with的关系如下,里面什么都不用写
23+
class CustomFlutterBinding extends WidgetsFlutterBinding
24+
with BoostFlutterBinding {}
25+
1926
class MyApp extends StatelessWidget {
2027
final String defaultRoute;
2128

2229
const MyApp(this.defaultRoute, {Key key}) : super(key: key);
2330

31+
//1.配置路由表
32+
static Map<String, FlutterBoostRouteFactory> routerMap = {
33+
'trendPage': (settings, uniqueId) {
34+
return PageRouteBuilder(
35+
settings: settings,
36+
pageBuilder: (_, __, ___) {
37+
return TrendPage();
38+
});
39+
}
40+
};
41+
42+
//2.创建路由工厂
43+
Route<dynamic> routeFactory(RouteSettings settings, String uniqueId) {
44+
FlutterBoostRouteFactory func = routerMap[settings.name];
45+
if (func == null) {
46+
return null;
47+
}
48+
return func(settings, uniqueId);
49+
}
50+
2451
@override
2552
Widget build(BuildContext context) {
2653
return MaterialApp(
2754
title: 'GitHub',
2855
theme: ThemeData(
2956
primarySwatch: createMaterialColor(DColor.themeColor),
3057
),
31-
home: _widgetForRoute(defaultRoute));
58+
//3.通过FlutterBoostApp启动Flutter
59+
home: FlutterBoostApp(routeFactory));
3260
}
3361
}
34-
35-
Widget _widgetForRoute(String route) {
36-
//根据不同的路由显示不同的界面
37-
switch (route) {
38-
case "trend":
39-
return TrendPage();
40-
default:
41-
return Center(child: Text('Unknown route: $route'));
42-
}
43-
}
44-
4562
//自定义主题颜色
4663
MaterialColor createMaterialColor(Color color) {
4764
List strengths = <double>[.05];

flutter_module/lib/plugin/plugin_manager.dart

-15
This file was deleted.

flutter_module/lib/widget/trend_page_item.dart

+8-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import 'package:cached_network_image/cached_network_image.dart';
22
import 'package:flutter/material.dart';
3+
import 'package:flutter_boost/flutter_boost.dart';
34
import 'package:flutter_module/color/color.dart';
45
import 'package:flutter_module/model/trend_model.dart';
5-
import 'package:flutter_module/plugin/plugin_manager.dart';
66

77
class TrendPageItem extends StatelessWidget {
88
final TrendModel trendModel;
@@ -14,8 +14,13 @@ class TrendPageItem extends StatelessWidget {
1414
return Card(
1515
margin: EdgeInsets.fromLTRB(8, 8, 8, 4),
1616
child: InkWell(
17-
onTap: () => PluginManager.go2ReposDetail(
18-
trendModel.url, trendModel.reposName, trendModel.name),
17+
onTap: () {
18+
BoostNavigator.instance.push("reposDetail", arguments: {
19+
"web_url": trendModel.url,
20+
"owner": trendModel.name,
21+
"repo": trendModel.reposName
22+
});
23+
},
1924
child: Padding(
2025
padding: EdgeInsets.all(8),
2126
child: Row(

0 commit comments

Comments
 (0)