Skip to content

Commit ef0ad22

Browse files
committed
接入FlutterBoost简化Native与Flutter交互
1 parent 7c95a18 commit ef0ad22

32 files changed

+576
-75
lines changed

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

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@ import com.fmt.github.user.activity.UserInfoActivity
2525
import com.fmt.github.user.dao.UserDao
2626
import com.fmt.github.user.model.UserModel
2727
import com.fmt.github.user.model.db.User
28+
import com.fmt.github.utils.NavigationUtil
29+
import com.fmt.github.utils.TREND_PAGE
2830
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
@@ -97,12 +97,7 @@ class HomeActivity : BaseVMActivity(), NavigationView.OnNavigationItemSelectedLi
9797

9898
R.id.item_about -> startActivity<AboutActivity>(false)
9999

100-
R.id.item_trend -> {
101-
FlutterBoost.instance().open(FlutterBoostRouteOptions.Builder()
102-
.pageName("trendPage")
103-
.arguments(mapOf())
104-
.build())
105-
}
100+
R.id.item_trend -> NavigationUtil.go(TREND_PAGE)
106101

107102
R.id.item_logout -> showLogoutPopup()
108103
}
@@ -112,8 +107,8 @@ class HomeActivity : BaseVMActivity(), NavigationView.OnNavigationItemSelectedLi
112107

113108
private fun go2UserInfoActivity(login: String, avatar_url: String) {
114109
Bundle().run {
115-
val userModel = UserModel(login, avatar_url)
116-
putSerializable(UserInfoActivity.USER_INFO, userModel)
110+
putString(UserInfoActivity.USER_NAME, login)
111+
putString(UserInfoActivity.USER_AVATAR, avatar_url)
117112
startActivity<UserInfoActivity>(this)
118113
}
119114
}

app/src/main/java/com/fmt/github/home/adapter/HomeAdapter.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import com.fmt.github.databinding.LayoutReceivedEventBinding
1212
import com.fmt.github.home.model.ReceivedEventModel
1313
import com.fmt.github.repos.activity.go2ReposDetailActivity
1414
import com.fmt.github.user.activity.go2UserInfoActivity
15-
import com.fmt.github.user.model.UserModel
1615

1716
class HomeAdapter(private val mContext: Activity) :
1817
PagingDataAdapter<ReceivedEventModel, HomeAdapter.ViewHolder>(DIFF_CALLBACK) {
@@ -58,7 +57,8 @@ class HomeAdapter(private val mContext: Activity) :
5857
go2UserInfoActivity(
5958
mContext,
6059
binding.ivHead,
61-
UserModel(receivedEventModel.actor.login, receivedEventModel.actor.avatar_url)
60+
receivedEventModel.actor.login,
61+
receivedEventModel.actor.avatar_url
6262
)
6363
}
6464
}

app/src/main/java/com/fmt/github/tasks/InitFlutterBoostTask.kt

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,24 +5,31 @@ import android.content.Intent
55
import com.fmt.github.config.Configs
66
import com.fmt.github.mApplication
77
import com.fmt.github.repos.activity.ReposDetailActivity
8+
import com.fmt.github.user.activity.UserInfoActivity
89
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;
10+
import com.idlefish.flutterboost.FlutterBoost
11+
import com.idlefish.flutterboost.FlutterBoostDelegate
12+
import com.idlefish.flutterboost.FlutterBoostRouteOptions
13+
import com.idlefish.flutterboost.containers.FlutterBoostActivity
14+
import io.flutter.embedding.android.FlutterActivityLaunchConfigs
1415
import io.flutter.embedding.engine.FlutterEngine
1516

1617
class InitFlutterBoostTask : AndroidStartup<Unit>() {
1718

19+
companion object {
20+
const val USER_INFO_PAGE = "userInfoPage";
21+
const val REPOS_DETAIL_PAGE = "reposDetailPage";
22+
}
23+
1824
override fun callCreateOnMainThread(): Boolean = true
1925

2026
override fun waitOnMainThread(): Boolean = true
2127

2228
override fun create(context: Context) {
29+
//统一处理Flutter与Native的跳转逻辑
2330
FlutterBoost.instance().setup(mApplication, object : FlutterBoostDelegate {
2431
override fun pushNativeRoute(options: FlutterBoostRouteOptions) {
25-
if ("reposDetail" == options.pageName()) {
32+
if (REPOS_DETAIL_PAGE == options.pageName()) {
2633
val intent = Intent(
2734
FlutterBoost.instance().currentActivity(),
2835
ReposDetailActivity::class.java
@@ -42,6 +49,22 @@ class InitFlutterBoostTask : AndroidStartup<Unit>() {
4249
}
4350
FlutterBoost.instance().currentActivity()
4451
.startActivityForResult(intent, options.requestCode())
52+
} else if (USER_INFO_PAGE == options.pageName()) {
53+
val intent = Intent(
54+
FlutterBoost.instance().currentActivity(),
55+
UserInfoActivity::class.java
56+
).apply {
57+
putExtra(
58+
UserInfoActivity.USER_NAME,
59+
options.arguments()[UserInfoActivity.USER_NAME].toString()
60+
)
61+
putExtra(
62+
UserInfoActivity.USER_AVATAR,
63+
options.arguments()[UserInfoActivity.USER_AVATAR].toString()
64+
)
65+
}
66+
FlutterBoost.instance().currentActivity()
67+
.startActivityForResult(intent, options.requestCode())
4568
}
4669
}
4770

app/src/main/java/com/fmt/github/user/activity/UserInfoActivity.kt

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,12 @@ import kotlinx.android.synthetic.main.activity_user_info.*
1818
class UserInfoActivity : BaseDataBindActivity<ActivityUserInfoBinding>() {
1919

2020
private val mTitles = listOf("Info", "Repos", "Favor")
21-
22-
lateinit var mUserModel: UserModel
21+
lateinit var mUserName:String
22+
private lateinit var mUserAvatar:String
2323

2424
companion object {
25-
const val USER_INFO = "user_info"
25+
const val USER_NAME = "user_name"
26+
const val USER_AVATAR = "user_avatar"
2627
}
2728

2829
override fun getLayoutId(): Int = R.layout.activity_user_info
@@ -34,10 +35,13 @@ class UserInfoActivity : BaseDataBindActivity<ActivityUserInfoBinding>() {
3435
}
3536

3637
private fun initUserInfo() {
37-
mUserModel = intent.getSerializableExtra(USER_INFO) as UserModel
38-
mDataBind.userModel = mUserModel
38+
mUserName = intent.getStringExtra(USER_NAME)!!
39+
mUserAvatar = intent.getStringExtra(USER_AVATAR)!!
40+
41+
mDataBind.userName = mUserName
42+
mDataBind.userAvatar = mUserAvatar
3943
mUserIconIv.setOnClickListener {
40-
PhotoPreviewActivity.go2PhotoPreviewActivity(this, mUserModel.avatar_url)
44+
PhotoPreviewActivity.go2PhotoPreviewActivity(this, mUserAvatar)
4145
}
4246
}
4347

@@ -50,8 +54,8 @@ class UserInfoActivity : BaseDataBindActivity<ActivityUserInfoBinding>() {
5054
private fun initViewPager() {
5155
mutableListOf<Fragment>().apply {
5256
add(UserInfoFragment())
53-
add(UserReposFragment.newInstance(mUserModel.login))
54-
add(UserReposFragment.newInstance(mUserModel.login, true))
57+
add(UserReposFragment.newInstance(mUserName))
58+
add(UserReposFragment.newInstance(mUserName, true))
5559
}.also { fragmentList ->
5660
mViewPager.adapter = UserInfoPagerAdapter(this, fragmentList)
5761
}
@@ -68,9 +72,10 @@ class UserInfoActivity : BaseDataBindActivity<ActivityUserInfoBinding>() {
6872
}
6973
}
7074

71-
fun go2UserInfoActivity(activity: Activity, view: View, userModel: UserModel) {
75+
fun go2UserInfoActivity(activity: Activity, view: View, userName: String,userAvatar:String) {
7276
with(Intent(activity, UserInfoActivity::class.java)) {
73-
putExtra(UserInfoActivity.USER_INFO, userModel)
77+
putExtra(UserInfoActivity.USER_NAME, userName)
78+
putExtra(UserInfoActivity.USER_AVATAR, userAvatar)
7479
}.run {
7580
//共享元素共享动画
7681
ActivityOptionsCompat.makeSceneTransitionAnimation(

app/src/main/java/com/fmt/github/user/fragment/UserFragment.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class UserFragment : BaseListMVFragment<UserModel>() {
2626
override fun initRecyclerView() {
2727
val type = Type<LayoutUsersBinding>(R.layout.layout_users)
2828
.onClick {
29-
go2UserInfoActivity(mActivity,it.binding.ivHead, mListData[it.bindingAdapterPosition])
29+
go2UserInfoActivity(mActivity,it.binding.ivHead, mListData[it.bindingAdapterPosition].login,mListData[it.bindingAdapterPosition].avatar_url)
3030
}
3131
LastAdapter(mListData, BR.item)//基于DataBinding封装简化RecyclerView.Adapter
3232
.map<UserModel>(type)

app/src/main/java/com/fmt/github/user/fragment/UserInfoFragment.kt

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,18 @@ import com.fmt.github.base.viewmodel.BaseViewModel
66
import com.fmt.github.databinding.FragmentUserInfoBinding
77
import com.fmt.github.user.activity.UserInfoActivity
88
import com.fmt.github.user.viewmodel.UserViewModel
9+
import com.fmt.github.utils.FOLLOW_PAGE
10+
import com.fmt.github.utils.NavigationUtil
911
import kotlinx.android.synthetic.main.fragment_user_info.*
1012
import org.koin.androidx.viewmodel.ext.android.viewModel
1113

1214
class UserInfoFragment : BaseDataBindVMFragment<FragmentUserInfoBinding>() {
1315

16+
private val FOLLOWERS_TYPE = "followers"
17+
private val FOLLOWING_TYPE = "following"
18+
private val USERNAME_KEY = "userName"
19+
private val TYPE_KEY = "type"
20+
1421
private val mViewModel: UserViewModel by viewModel()
1522

1623
override fun getViewModel(): BaseViewModel = mViewModel
@@ -20,10 +27,20 @@ class UserInfoFragment : BaseDataBindVMFragment<FragmentUserInfoBinding>() {
2027
private lateinit var mUser: String
2128

2229
override fun initView() {
23-
mUser = (activity as UserInfoActivity).mUserModel.login
30+
mUser = (activity as UserInfoActivity).mUserName
2431
mSwipeRefreshLayout.setOnRefreshListener {
2532
initData()
2633
}
34+
mDataBind.llFollowers.setOnClickListener {
35+
go2FollowFlutterPage(FOLLOWERS_TYPE)
36+
}
37+
mDataBind.llFollowing.setOnClickListener {
38+
go2FollowFlutterPage(FOLLOWING_TYPE)
39+
}
40+
}
41+
42+
private fun go2FollowFlutterPage(type: String) {
43+
NavigationUtil.go(FOLLOW_PAGE,mapOf(USERNAME_KEY to mUser, TYPE_KEY to type))
2744
}
2845

2946
override fun showLoading() {
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package com.fmt.github.utils
2+
3+
val TREND_PAGE = "trendPage"
4+
val FOLLOW_PAGE = "followPage"
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.fmt.github.utils
2+
3+
import com.idlefish.flutterboost.FlutterBoost
4+
import com.idlefish.flutterboost.FlutterBoostRouteOptions
5+
6+
object NavigationUtil {
7+
8+
fun go(pageName: String, arguments: Map<String, Any> = mapOf()) {
9+
FlutterBoost.instance().open(
10+
FlutterBoostRouteOptions.Builder()
11+
.pageName(pageName)
12+
.arguments(arguments)
13+
.build()
14+
)
15+
}
16+
}

app/src/main/res/layout/activity_user_info.xml

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,11 @@
44

55
<data>
66
<variable
7-
name="userModel"
8-
type="com.fmt.github.user.model.UserModel" />
7+
name="userName"
8+
type="java.lang.String" />
9+
<variable
10+
name="userAvatar"
11+
type="java.lang.String" />
912
</data>
1013

1114
<androidx.coordinatorlayout.widget.CoordinatorLayout
@@ -50,7 +53,7 @@
5053
android:layout_height="wrap_content"
5154
android:layout_marginTop="16dp"
5255
android:gravity="center"
53-
android:text="@{@string/introduce(userModel.login)}"
56+
android:text="@{@string/introduce(userName)}"
5457
android:textColor="@android:color/white"
5558
android:textSize="16sp" />
5659

@@ -99,7 +102,7 @@
99102
app:behavior_targetX="50dp"
100103
app:behavior_targetY="8dp"
101104
app:layout_behavior="@string/simple_view_behavior"
102-
app:url="@{userModel.avatar_url}" />
105+
app:url="@{userAvatar}" />
103106

104107
<TextView
105108
android:id="@+id/mUserNameTv"
@@ -110,7 +113,7 @@
110113
android:alpha="0"
111114
android:elevation="10dp"
112115
android:gravity="center_vertical"
113-
android:text="@{userModel.login}"
116+
android:text="@{userName}"
114117
android:textColor="@android:color/white"
115118
android:textSize="18sp"
116119
app:behavior_dependTarget="-206dp"

app/src/main/res/layout/fragment_user_info.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@
120120
app:layout_constraintBottom_toBottomOf="parent">
121121

122122
<LinearLayout
123+
android:id="@+id/ll_followers"
123124
android:layout_width="0dp"
124125
android:layout_height="wrap_content"
125126
android:layout_weight="1"
@@ -144,6 +145,7 @@
144145
</LinearLayout>
145146

146147
<LinearLayout
148+
android:id="@+id/ll_following"
147149
android:layout_width="0dp"
148150
android:layout_height="wrap_content"
149151
android:layout_weight="1"

0 commit comments

Comments
 (0)