소스 검색

fix: #150 scopeDialog预览模式

drake 2 년 전
부모
커밋
074e189672

+ 20 - 20
net/src/main/java/com/drake/net/scope/DialogCoroutineScope.kt

@@ -18,9 +18,7 @@ package com.drake.net.scope
 
 import android.app.Dialog
 import androidx.fragment.app.FragmentActivity
-import androidx.lifecycle.Lifecycle
-import androidx.lifecycle.LifecycleObserver
-import androidx.lifecycle.OnLifecycleEvent
+import androidx.lifecycle.*
 import com.drake.net.NetConfig
 import kotlinx.coroutines.CoroutineDispatcher
 import kotlinx.coroutines.Dispatchers
@@ -46,37 +44,39 @@ class DialogCoroutineScope(
 ) : NetCoroutineScope(dispatcher = dispatcher), LifecycleObserver {
 
     init {
-        activity.lifecycle.addObserver(this)
+        activity.lifecycle.addObserver(object : LifecycleEventObserver {
+            override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
+                if (event == Lifecycle.Event.ON_DESTROY) {
+                    dialog?.cancel()
+                }
+            }
+        })
     }
 
     override fun start() {
         activity.runOnUiThread {
-            dialog = when {
-                dialog != null -> dialog
-                else -> NetConfig.dialogFactory.onCreate(activity)
+            val dialog = dialog ?: NetConfig.dialogFactory.onCreate(activity)
+            this.dialog = dialog
+            dialog.setCancelable(cancelable)
+            dialog.setOnCancelListener {
+                cancel()
+            }
+            if (!activity.isFinishing) {
+                dialog.show()
             }
-            dialog?.setOnDismissListener { cancel() }
-            dialog?.setCancelable(cancelable)
-            if (!activity.isFinishing) dialog?.show()
         }
     }
 
     override fun previewFinish(succeed: Boolean) {
-        if (succeed) {
-            dismiss()
+        super.previewFinish(succeed)
+        if (succeed && previewBreakLoading) {
+            dialog?.dismiss()
         }
     }
 
     override fun finally(e: Throwable?) {
         super.finally(e)
-        dismiss()
-    }
-
-    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
-    fun dismiss() {
-        if (dialog?.isShowing == true) {
-            dialog?.dismiss()
-        }
+        dialog?.dismiss()
     }
 
 }

+ 6 - 4
net/src/main/java/com/drake/net/scope/NetCoroutineScope.kt

@@ -37,8 +37,8 @@ open class NetCoroutineScope(
     /** 预览模式 */
     protected var preview: (suspend CoroutineScope.() -> Unit)? = null
 
-    /** 是否可读取缓存 */
-    protected var isPreview = true
+    /** 是否启用预览 */
+    protected var previewEnabled = true
 
     /** 是否读取缓存成功 */
     protected var previewSucceed = false
@@ -54,7 +54,7 @@ open class NetCoroutineScope(
     override fun launch(block: suspend CoroutineScope.() -> Unit): NetCoroutineScope {
         launch(EmptyCoroutineContext) {
             start()
-            if (preview != null && isPreview) {
+            if (preview != null && previewEnabled) {
                 supervisorScope {
                     previewSucceed = try {
                         preview?.invoke(this)
@@ -80,7 +80,9 @@ open class NetCoroutineScope(
      * 读取缓存回调
      * @param succeed 缓存是否成功
      */
-    protected open fun previewFinish(succeed: Boolean) {}
+    protected open fun previewFinish(succeed: Boolean) {
+        previewEnabled = false
+    }
 
     override fun handleError(e: Throwable) {
         NetConfig.errorHandler.onError(e)

+ 2 - 1
net/src/main/java/com/drake/net/scope/PageCoroutineScope.kt

@@ -43,11 +43,12 @@ class PageCoroutineScope(
     }
 
     override fun start() {
-        isPreview = !page.loaded
+        previewEnabled = !page.loaded
         page.trigger()
     }
 
     override fun previewFinish(succeed: Boolean) {
+        super.previewFinish(succeed)
         if (succeed && previewBreakLoading) {
             page.showContent()
         }

+ 2 - 1
net/src/main/java/com/drake/net/scope/StateCoroutineScope.kt

@@ -43,11 +43,12 @@ class StateCoroutineScope(
     }
 
     override fun start() {
-        isPreview = !state.loaded
+        previewEnabled = !state.loaded
         state.trigger()
     }
 
     override fun previewFinish(succeed: Boolean) {
+        super.previewFinish(succeed)
         if (succeed) {
             state.showContent()
         }