返回键处理
This commit is contained in:
parent
76bb6e3e42
commit
b1ab016709
|
|
@ -1,8 +1,8 @@
|
|||
package com.gamedog.vididin
|
||||
|
||||
import android.app.Application
|
||||
import com.ama.core.architecture.BaseApp
|
||||
import dagger.hilt.android.HiltAndroidApp
|
||||
|
||||
|
||||
@HiltAndroidApp
|
||||
class App : Application()
|
||||
class App : BaseApp()
|
||||
|
|
@ -2,7 +2,6 @@ package com.gamedog.vididin.main
|
|||
|
||||
|
||||
import com.ama.core.common.util.asSafe
|
||||
import androidx.activity.OnBackPressedCallback
|
||||
import androidx.core.view.ViewCompat
|
||||
import androidx.core.view.WindowInsetsCompat
|
||||
import androidx.fragment.app.Fragment
|
||||
|
|
@ -10,15 +9,17 @@ import androidx.fragment.app.FragmentManager
|
|||
import androidx.fragment.app.FragmentManager.FragmentLifecycleCallbacks
|
||||
import androidx.viewpager2.widget.ViewPager2
|
||||
import android.view.LayoutInflater
|
||||
import androidx.activity.addCallback
|
||||
import androidx.activity.viewModels
|
||||
import com.ama.core.architecture.appBase.AppViewsActivity
|
||||
import com.ama.core.architecture.appBase.OnFragmentBackgroundListener
|
||||
import com.ama.core.architecture.ext.toast
|
||||
import com.ama.core.architecture.util.bindViewPager2
|
||||
import com.ama.core.architecture.util.setCommonNavigator
|
||||
import com.ama.core.architecture.util.setDataOrAdapter
|
||||
import com.gamedog.vididin.R
|
||||
import com.gamedog.vididin.adapter.MainTabsAdapter
|
||||
import com.gamedog.vididin.adapter.MainViewPagerAdapter
|
||||
import com.gamedog.vididin.main.interfaces.OnSwitchTabListener
|
||||
import com.gamedog.vididin.main.interfaces.OnTabStyleListener
|
||||
import dagger.hilt.android.AndroidEntryPoint
|
||||
import kotlin.getValue
|
||||
|
|
@ -32,21 +33,11 @@ import com.gamedog.vididin.main.MainViewModel as ViewModel
|
|||
@AndroidEntryPoint
|
||||
class MainActivity : AppViewsActivity<ViewBinding, UiState, ViewModel>(), OnTabStyleListener {
|
||||
|
||||
override val viewModel: ViewModel by viewModels()
|
||||
override val mViewModel: ViewModel by viewModels()
|
||||
private lateinit var navigatorAdapter: MainTabsAdapter
|
||||
private val fragmentStateAdapter by lazy { MainViewPagerAdapter(this) }
|
||||
|
||||
|
||||
|
||||
private val onBackPressedCallback = object : OnBackPressedCallback(true) {
|
||||
override fun handleOnBackPressed() {
|
||||
fragmentStateAdapter.getFragmentByIndex(0).asSafe<OnSwitchTabListener>()
|
||||
?.onSwitchTab(-1)
|
||||
|
||||
binding.viewPager2.setCurrentItem(0, false)
|
||||
}
|
||||
}
|
||||
|
||||
override fun inflateViewBinding(inflater: LayoutInflater) = ViewBinding.inflate(inflater)
|
||||
|
||||
override fun ViewBinding.initWindowInsets() {
|
||||
|
|
@ -76,12 +67,18 @@ class MainActivity : AppViewsActivity<ViewBinding, UiState, ViewModel>(), OnTabS
|
|||
}
|
||||
|
||||
override fun ViewBinding.initListeners() {
|
||||
onBackPressedDispatcher.addCallback(this@MainActivity, onBackPressedCallback)
|
||||
onBackPressedDispatcher.addCallback(this@MainActivity) {
|
||||
if (mViewModel.canBack) {
|
||||
finish()
|
||||
} else {
|
||||
toast(R.string.close_app_hint)
|
||||
mViewModel.startCanBackTimer()
|
||||
}
|
||||
}
|
||||
|
||||
viewPager2.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
|
||||
override fun onPageSelected(position: Int) {
|
||||
super.onPageSelected(position)
|
||||
setOnBackPressedCallbackIsEnabled()
|
||||
}
|
||||
})
|
||||
|
||||
|
|
@ -102,16 +99,13 @@ class MainActivity : AppViewsActivity<ViewBinding, UiState, ViewModel>(), OnTabS
|
|||
|
||||
}
|
||||
|
||||
|
||||
override fun ViewBinding.onUiStateCollect(uiState: UiState) {
|
||||
magicIndicator.setDataOrAdapter(uiState.tabs) { navigatorAdapter }
|
||||
viewPager2.setDataOrAdapter(uiState.tabs, Int.MAX_VALUE) { fragmentStateAdapter }
|
||||
}
|
||||
|
||||
|
||||
private fun setOnBackPressedCallbackIsEnabled() {
|
||||
onBackPressedCallback.isEnabled = binding.viewPager2.currentItem != 0
|
||||
}
|
||||
|
||||
override fun onResume() {
|
||||
super.onResume()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
package com.gamedog.vididin.main
|
||||
|
||||
|
||||
import android.util.TimeUtils
|
||||
import androidx.lifecycle.viewModelScope
|
||||
import com.ama.core.architecture.appBase.vm.AppViewModel
|
||||
import com.gamedog.vididin.R
|
||||
|
|
@ -8,6 +9,7 @@ import com.gamedog.vididin.beans.MainTabsItem
|
|||
import com.gamedog.vididin.repository.MainRepository
|
||||
import com.gamedog.vididin.repository.MainTabType
|
||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||
import kotlinx.coroutines.delay
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.map
|
||||
import kotlinx.coroutines.launch
|
||||
|
|
@ -51,6 +53,17 @@ class MainViewModel @Inject constructor(
|
|||
}.map {
|
||||
UiState(tabs = it)
|
||||
}
|
||||
|
||||
|
||||
|
||||
var canBack = false
|
||||
fun startCanBackTimer() {
|
||||
viewModelScope.launch {
|
||||
canBack = true
|
||||
delay(2000)
|
||||
canBack = false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@ package com.gamedog.vididin.main.fragments
|
|||
|
||||
import android.view.LayoutInflater
|
||||
import android.view.ViewGroup
|
||||
import androidx.activity.OnBackPressedCallback
|
||||
import androidx.core.view.ViewCompat
|
||||
import androidx.core.view.WindowInsetsCompat
|
||||
import androidx.core.view.updatePadding
|
||||
|
|
@ -27,16 +26,13 @@ import com.gamedog.vididin.main.fragments.home.YoutubeUiState as UiState
|
|||
|
||||
|
||||
@AndroidEntryPoint
|
||||
class HomeFragment : AppViewsFragment<ViewBinding, UiState, ViewModel>(), OnSwitchTabListener,
|
||||
OnFragmentBackgroundListener {
|
||||
override val viewModel: ViewModel by viewModels()
|
||||
class HomeFragment : AppViewsFragment<ViewBinding, UiState, ViewModel>(), OnSwitchTabListener, OnFragmentBackgroundListener {
|
||||
|
||||
override val mViewModel: ViewModel by viewModels()
|
||||
override var isBackgroundBright: Boolean = true
|
||||
|
||||
|
||||
private val onBackPressedCallback = object : OnBackPressedCallback(false) {
|
||||
override fun handleOnBackPressed() {
|
||||
}
|
||||
}
|
||||
|
||||
private val mViewPagerAdapter by lazy { HomeFragmentStateAdapter(this) }
|
||||
|
||||
override fun inflateViewBinding(
|
||||
|
|
@ -59,16 +55,10 @@ class HomeFragment : AppViewsFragment<ViewBinding, UiState, ViewModel>(), OnSwit
|
|||
}
|
||||
|
||||
override fun ViewBinding.initListeners() {
|
||||
requireActivity().onBackPressedDispatcher.addCallback(
|
||||
this@HomeFragment,
|
||||
onBackPressedCallback
|
||||
)
|
||||
|
||||
viewPager2.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
|
||||
override fun onPageSelected(position: Int) {
|
||||
super.onPageSelected(position)
|
||||
setHomeTabStyle(mViewPagerAdapter.getFragmentByIndex(position))
|
||||
setOnBackPressedCallbackIsEnabled()
|
||||
}
|
||||
})
|
||||
|
||||
|
|
@ -91,12 +81,10 @@ class HomeFragment : AppViewsFragment<ViewBinding, UiState, ViewModel>(), OnSwit
|
|||
|
||||
override fun onResume() {
|
||||
super.onResume()
|
||||
setOnBackPressedCallbackIsEnabled()
|
||||
}
|
||||
|
||||
override fun onPause() {
|
||||
super.onPause()
|
||||
setOnBackPressedCallbackIsEnabled()
|
||||
}
|
||||
|
||||
override fun onSwitchTab(index: Int, smoothScroll: Boolean) {
|
||||
|
|
@ -108,10 +96,6 @@ class HomeFragment : AppViewsFragment<ViewBinding, UiState, ViewModel>(), OnSwit
|
|||
}
|
||||
|
||||
|
||||
private fun setOnBackPressedCallbackIsEnabled() {
|
||||
onBackPressedCallback.isEnabled =
|
||||
isResumed && binding?.viewPager2?.currentItem != mViewPagerAdapter.itemCount - 1
|
||||
}
|
||||
|
||||
private fun setHomeTabStyle(f: Fragment?) {
|
||||
isBackgroundBright = f.asSafe<OnFragmentBackgroundListener>()?.isBackgroundBright ?: return
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@ import com.gamedog.vididin.main.fragments.mine.MineViewModel as ViewModel
|
|||
@AndroidEntryPoint
|
||||
class MineFragment : AppViewsFragment<ViewBinding, UiState, ViewModel>(),
|
||||
OnFragmentBackgroundListener {
|
||||
override val viewModel: ViewModel by viewModels()
|
||||
override val mViewModel: ViewModel by viewModels()
|
||||
override var isBackgroundBright: Boolean = true
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,22 @@
|
|||
package com.gamedog.vididin.widget.loopViewpager
|
||||
|
||||
import androidx.fragment.app.Fragment
|
||||
import androidx.fragment.app.FragmentActivity
|
||||
import androidx.viewpager2.adapter.FragmentStateAdapter
|
||||
|
||||
class LoopPagerAdapter<T>(
|
||||
private val activity: FragmentActivity,
|
||||
private val dataList: List<T>,
|
||||
private val fragmentCreatorFun: (List<T>, Int) -> Fragment // 修改点1:传入整个数据列表和真实位置, 接收一个创建Fragment的lambda,传入数据和在ViewPager中的真实位置
|
||||
) : FragmentStateAdapter(activity) {
|
||||
|
||||
private val mRealPageCount = 3
|
||||
|
||||
override fun getItemCount(): Int = Int.MAX_VALUE
|
||||
|
||||
override fun createFragment(position: Int): Fragment {
|
||||
val realPosition = position % mRealPageCount
|
||||
return fragmentCreatorFun(dataList, realPosition)
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -7,4 +7,5 @@
|
|||
<string name="main_tabs_message">Message</string>
|
||||
<string name="main_tabs_mine">Mine</string>
|
||||
<string name="main_tabs_friend">Friend</string>
|
||||
<string name="close_app_hint">Press again to close app</string>
|
||||
</resources>
|
||||
|
|
@ -15,7 +15,6 @@ dependencies {
|
|||
api(project(":core:common"))
|
||||
api(project(":core:designsystem"))
|
||||
api(project(":core:model"))
|
||||
api 'com.google.code.gson:gson:2.10.1'
|
||||
api(libs.material)
|
||||
api(libs.appcompat)
|
||||
api(libs.lifecycle.viewmodel.ktx)
|
||||
|
|
@ -26,6 +25,9 @@ dependencies {
|
|||
api(libs.glide)
|
||||
api(libs.okhttp.logging)
|
||||
api(libs.kotlinx.serialization.json)
|
||||
//api(libs.multiDex)
|
||||
//api(libs.gson)
|
||||
api 'com.google.code.gson:gson:2.13.2'
|
||||
|
||||
implementation(libs.startup)
|
||||
implementation 'org.jetbrains.kotlin:kotlin-stdlib:1.8.22'
|
||||
|
|
|
|||
|
|
@ -0,0 +1,42 @@
|
|||
package com.ama.core.architecture
|
||||
|
||||
|
||||
import android.app.Activity
|
||||
import android.app.Application
|
||||
import android.content.Context
|
||||
import android.content.res.Configuration
|
||||
import java.lang.ref.WeakReference
|
||||
|
||||
abstract class BaseApp : Application() {
|
||||
|
||||
companion object {
|
||||
private var currentActivity: WeakReference<Activity>? = null
|
||||
|
||||
fun setCurrentActivity(activity: Activity?) {
|
||||
currentActivity = if (activity == null) null else WeakReference(activity)
|
||||
}
|
||||
|
||||
fun getCurrentActivity(): Activity? {
|
||||
return currentActivity?.get()
|
||||
}
|
||||
private lateinit var instance: BaseApp
|
||||
fun appContext(): Context = instance
|
||||
}
|
||||
|
||||
|
||||
|
||||
override fun onCreate() {
|
||||
super.onCreate()
|
||||
instance = this
|
||||
}
|
||||
|
||||
override fun onTerminate() {
|
||||
super.onTerminate()
|
||||
}
|
||||
|
||||
// 系统资源配置发生更改回调,例如主题模式,需要重新刷新多语言
|
||||
override fun onConfigurationChanged(newConfig: Configuration) {
|
||||
super.onConfigurationChanged(newConfig)
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -8,7 +8,7 @@ import com.ama.core.architecture.empty.EmptyViewModel
|
|||
|
||||
abstract class AppViewsEmptyViewModelActivity<Binding : ViewBinding> :
|
||||
AppViewsActivity<Binding, EmptyUiState, EmptyViewModel>() {
|
||||
override val viewModel: EmptyViewModel by viewModels()
|
||||
override val mViewModel: EmptyViewModel by viewModels()
|
||||
|
||||
override fun Binding.onUiStateCollect(uiState: EmptyUiState) {
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ import com.ama.core.architecture.empty.EmptyViewModel
|
|||
|
||||
abstract class AppViewsEmptyViewModelDialogFragment<Binding : ViewBinding> :
|
||||
AppViewsDialogFragment<Binding, EmptyUiState, EmptyViewModel>() {
|
||||
override val viewModel: EmptyViewModel by viewModels()
|
||||
override val mViewModel: EmptyViewModel by viewModels()
|
||||
|
||||
override fun Binding.onUiStateCollect(uiState: EmptyUiState) {
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ import com.ama.core.architecture.empty.EmptyViewModel
|
|||
|
||||
abstract class AppViewsEmptyViewModelFragment<Binding : ViewBinding> :
|
||||
AppViewsFragment<Binding, EmptyUiState, EmptyViewModel>() {
|
||||
override val viewModel: EmptyViewModel by viewModels()
|
||||
override val mViewModel: EmptyViewModel by viewModels()
|
||||
|
||||
override fun Binding.onUiStateCollect(uiState: EmptyUiState) {
|
||||
}
|
||||
|
|
|
|||
|
|
@ -72,7 +72,7 @@ abstract class BaseViewsActivity<Binding : ViewBinding, UiState : Any,
|
|||
override fun Binding.initBaseObservers() {
|
||||
// 初始化UiState收集
|
||||
lifecycleScope.launch {
|
||||
viewModel.uiState
|
||||
mViewModel.uiState
|
||||
.flowWithLifecycle(lifecycle)
|
||||
.collect { uiState ->
|
||||
onUiStateCollect(uiState)
|
||||
|
|
@ -80,13 +80,13 @@ abstract class BaseViewsActivity<Binding : ViewBinding, UiState : Any,
|
|||
}
|
||||
// 初始化Message收集
|
||||
messageCollector.initCollect(
|
||||
viewModel.messageController,
|
||||
mViewModel.messageController,
|
||||
lifecycleScope,
|
||||
lifecycle,
|
||||
)
|
||||
|
||||
// 初始化LoadStateUiState收集
|
||||
initLoadStateUiStateCollect(viewModel, lifecycleScope, lifecycle)
|
||||
initLoadStateUiStateCollect(mViewModel, lifecycleScope, lifecycle)
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -99,20 +99,20 @@ abstract class BaseViewsDialogFragment<Binding : ViewBinding, UiState : Any, Vie
|
|||
// -必须用viewLifecycleOwner.lifecycleScope.launch{},否则里面的收集被调用多次,而没取消,导致同一个数据会被多个接收者接收。
|
||||
// --说明:因为页面跳转,View销毁,但是Fragment没有,所以不能用范围广的lifecycleScope,而是用view的lifecycleScope。(lifecycle同理)
|
||||
viewLifecycleOwner.lifecycleScope.launch {
|
||||
viewModel.uiState.flowWithLifecycle(viewLifecycleOwner.lifecycle).collect { uiState ->
|
||||
mViewModel.uiState.flowWithLifecycle(viewLifecycleOwner.lifecycle).collect { uiState ->
|
||||
onUiStateCollect(uiState)
|
||||
}
|
||||
}
|
||||
// 初始化Message收集
|
||||
// -说明:使用Activity的lifecycleScope、lifecycle会收集多次,所以不能在此使用,也不能覆盖此实现。
|
||||
messageCollector.initCollect(
|
||||
viewModel.messageController,
|
||||
mViewModel.messageController,
|
||||
viewLifecycleOwner.lifecycleScope,
|
||||
viewLifecycleOwner.lifecycle,
|
||||
)
|
||||
// 初始化LoadStateUiState收集
|
||||
initLoadStateUiStateCollect(
|
||||
viewModel,
|
||||
mViewModel,
|
||||
viewLifecycleOwner.lifecycleScope,
|
||||
viewLifecycleOwner.lifecycle
|
||||
)
|
||||
|
|
|
|||
|
|
@ -118,21 +118,21 @@ abstract class BaseViewsFragment<Binding : ViewBinding, UiState : Any, ViewModel
|
|||
// -必须用viewLifecycleOwner.lifecycleScope.launch{},否则里面的收集被调用多次,而没取消,导致同一个数据会被多个接收者接收。
|
||||
// --说明:因为页面跳转,View销毁,但是Fragment没有,所以不能用范围广的lifecycleScope,而是用view的lifecycleScope。(lifecycle同理)
|
||||
viewLifecycleOwner.lifecycleScope.launch {
|
||||
viewModel.uiState.flowWithLifecycle(viewLifecycleOwner.lifecycle).collect { uiState ->
|
||||
mViewModel.uiState.flowWithLifecycle(viewLifecycleOwner.lifecycle).collect { uiState ->
|
||||
onUiStateCollect(uiState)
|
||||
}
|
||||
}
|
||||
// 初始化Message收集
|
||||
// -说明:使用Activity的lifecycleScope、lifecycle会收集多次,所以不能在此使用,也不能覆盖此实现。
|
||||
messageCollector.initCollect(
|
||||
viewModel.messageController,
|
||||
mViewModel.messageController,
|
||||
viewLifecycleOwner.lifecycleScope,
|
||||
viewLifecycleOwner.lifecycle,
|
||||
)
|
||||
|
||||
// 初始化LoadStateUiState收集
|
||||
initLoadStateUiStateCollect(
|
||||
viewModel,
|
||||
mViewModel,
|
||||
viewLifecycleOwner.lifecycleScope,
|
||||
viewLifecycleOwner.lifecycle
|
||||
)
|
||||
|
|
|
|||
|
|
@ -0,0 +1,17 @@
|
|||
package com.ama.core.architecture.ext
|
||||
|
||||
import android.app.Activity
|
||||
import android.view.View
|
||||
import android.widget.Toast
|
||||
import androidx.fragment.app.Fragment
|
||||
import com.ama.core.architecture.BaseApp
|
||||
|
||||
|
||||
private fun toast(strRes: Int): Unit {
|
||||
Toast.makeText(BaseApp.appContext(), strRes, Toast.LENGTH_SHORT).show()
|
||||
}
|
||||
|
||||
|
||||
fun View.toast(strRes: Int): Unit = toast(strRes = strRes)
|
||||
fun Fragment.toast(strRes: Int): Unit = toast(strRes = strRes)
|
||||
fun Activity.toast(strRes: Int): Unit = toast(strRes = strRes)
|
||||
|
|
@ -4,5 +4,5 @@ import com.ama.core.architecture.base.BaseViewModel
|
|||
|
||||
|
||||
interface ViewModelOwner<UiState : Any, ViewModel : BaseViewModel<UiState>> {
|
||||
val viewModel: ViewModel
|
||||
val mViewModel: ViewModel
|
||||
}
|
||||
|
|
@ -19,7 +19,7 @@ fun <UiState : Any, ViewModel : BaseViewModel<UiState>, Value> BaseViewsFragment
|
|||
flowCollector: FlowCollector<Value>
|
||||
) {
|
||||
viewLifecycleOwner.lifecycleScope.launch {
|
||||
viewModel.uiState.map { mapFun(it) }.distinctUntilChanged()
|
||||
mViewModel.uiState.map { mapFun(it) }.distinctUntilChanged()
|
||||
.flowWithLifecycle(viewLifecycleOwner.lifecycle).collect(flowCollector)
|
||||
}
|
||||
}
|
||||
|
|
@ -32,7 +32,7 @@ fun <UiState : Any, ViewModel : BaseViewModel<UiState>, Value> BaseViewsActivity
|
|||
flowCollector: FlowCollector<Value>
|
||||
) {
|
||||
lifecycleScope.launch {
|
||||
viewModel.uiState.map { mapFun(it) }.distinctUntilChanged()
|
||||
mViewModel.uiState.map { mapFun(it) }.distinctUntilChanged()
|
||||
.flowWithLifecycle(lifecycle).collect(flowCollector)
|
||||
}
|
||||
}
|
||||
|
|
@ -10,7 +10,7 @@ class DefaultStateEmptyView : ConstraintLayoutMergeStateBaseView(), StateEmptyVi
|
|||
|
||||
private val emptyGroup by lazy { root!!.findViewById<View>(R.id.state_empty_group) }
|
||||
|
||||
override fun getResId() = R.layout.douyin_core_designsystem_view_state_empty
|
||||
override fun getResId() = R.layout.view_state_empty
|
||||
|
||||
override fun setVisible(isVisible: Boolean) {
|
||||
emptyGroup.isVisible = isVisible
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ class DefaultStateErrorView : ConstraintLayoutMergeStateBaseView(), StateErrorVi
|
|||
private val errorRetry by lazy { root!!.findViewById<View>(R.id.state_error_retry) }
|
||||
private val errorDescription by lazy { root!!.findViewById<TextView>(R.id.state_error_description) }
|
||||
|
||||
override fun getResId() = R.layout.douyin_core_designsystem_view_state_error
|
||||
override fun getResId() = R.layout.view_state_error
|
||||
|
||||
override fun setVisible(isVisible: Boolean) {
|
||||
errorGroup.isVisible = isVisible
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@ import com.gamedog.vididin.core.designsystem.stateview.state.interfaces.StateLoa
|
|||
class DefaultStateLoadingView : ConstraintLayoutMergeStateBaseView(), StateLoadingView {
|
||||
private val loading by lazy { root!!.findViewById<View>(R.id.state_loading) }
|
||||
|
||||
override fun getResId() = R.layout.douyin_core_designsystem_view_state_loading
|
||||
override fun getResId() = R.layout.view_state_loading
|
||||
|
||||
override fun setVisible(isVisible: Boolean) {
|
||||
loading.isVisible = isVisible
|
||||
|
|
|
|||
|
|
@ -35,9 +35,10 @@ smartRefreshLayout = "3.0.0-alpha"
|
|||
retrofit = "2.11.0"
|
||||
okhttp = "4.12.0"
|
||||
glide = "4.16.0"
|
||||
gson = "2.9.0"
|
||||
gsonVer = "2.10.1"
|
||||
testPoint = "0.0.1"
|
||||
spans = "1.1.0"
|
||||
multiDex = "2.0.1"
|
||||
#================================Plugin相关===================================
|
||||
agp = "8.10.1"
|
||||
kotlin = "2.1.20"
|
||||
|
|
@ -93,8 +94,11 @@ okhttp-logging = { group = "com.squareup.okhttp3", name = "logging-interceptor",
|
|||
# glide
|
||||
glide = { group = "com.github.bumptech.glide", name = "glide", version.ref = "glide" }
|
||||
|
||||
# multiDex
|
||||
multiDex = { group = "androidx.multidex:multidex", name = "multiDex", version.ref = "multiDex" }
|
||||
|
||||
# gson
|
||||
gson = { group = "com.google.code.gson:gson", name = "gson", version.ref = "gson" }
|
||||
gson = { group = "com.google.code.gson:gson", name = "gson", version.ref = "gsonVer" }
|
||||
|
||||
# test-point
|
||||
test-point-annotation = { group = "io.github.zrq1060", name = "test-point-annotation", version.ref = "testPoint" }
|
||||
|
|
|
|||
Loading…
Reference in New Issue