'a'
mh-two-thousand-and-two
2024-04-12 44d2c92345cd156a59fc327b3060292a282d2893
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
import {
  parseQuery
} from 'uni-shared'
 
import {
  ANI_CLOSE,
  ANI_DURATION
} from '../../constants'
 
import {
  showWebview,
  closeWebview
} from './util'
 
import {
  setStatusBarStyle,
  invoke
} from '../../bridge'
 
import {
  registerPage
} from '../../framework/page'
 
import {
  navigate
} from '../../framework/navigator'
 
import tabBar from '../../framework/tab-bar'
 
function _switchTab ({
  url,
  path,
  query,
  from
}, callbackId) {
  tabBar.switchTab(path.slice(1))
 
  const pages = getCurrentPages()
  const len = pages.length
 
  let callOnHide = false
  let callOnShow = false
 
  let currentPage
  if (len >= 1) { // 前一个页面是非 tabBar 页面
    currentPage = pages[len - 1]
    if (!currentPage.$page.meta.isTabBar) {
      // 前一个页面为非 tabBar 页面时,目标tabBar需要强制触发onShow
      // 该情况下目标页tabBarPage的visible是不对的
      // 除非每次路由跳转都处理一遍tabBarPage的visible,目前仅switchTab会处理
      // 简单起见,暂时直接判断该情况,执行onShow
      callOnShow = true
      pages.reverse().forEach(page => {
        if (!page.$page.meta.isTabBar && page !== currentPage) {
          page.$remove()
          closeWebview(page.$getAppWebview(), 'none')
        }
      })
      currentPage.$remove()
      // 延迟执行避免iOS应用退出
      setTimeout(() => {
        if (currentPage.$page.openType === 'redirect') {
          closeWebview(currentPage.$getAppWebview(), ANI_CLOSE, ANI_DURATION)
        } else {
          closeWebview(currentPage.$getAppWebview(), 'auto')
        }
      }, 100)
    } else {
      callOnHide = true
    }
  }
 
  let tabBarPage
  // 查找当前 tabBarPage,且设置 visible
  getCurrentPages(true).forEach(page => {
    if (('/' + page.route) === path) {
      if (!page.$page.meta.visible) { // 之前未显示
        callOnShow = true
      }
      page.$page.meta.visible = true
      tabBarPage = page
    } else {
      if (page.$page.meta.isTabBar) {
        page.$page.meta.visible = false
      }
    }
  })
  // 相同tabBar页面
  if (currentPage === tabBarPage) {
    callOnHide = false
  }
  if (currentPage && callOnHide) {
    currentPage.$vm.__call_hook('onHide')
  }
  if (tabBarPage) {
    const webview = tabBarPage.$getAppWebview()
    webview.show('none')
    // 等visible状态都切换完之后,再触发onShow,否则开发者在onShow里边 getCurrentPages 会不准确
    if (callOnShow && !webview.__preload__) {
      tabBarPage.$vm.__call_hook('onShow')
    }
  } else {
    return showWebview(registerPage({
      url,
      path,
      query,
      openType: 'switchTab'
    }), 'none', 0, () => {
      setStatusBarStyle()
      invoke(callbackId, {
        errMsg: 'switchTab:ok'
      })
    }, 70)
  }
 
  setStatusBarStyle()
  invoke(callbackId, {
    errMsg: 'switchTab:ok'
  })
}
 
export function switchTab ({
  url,
  from,
  openType
}, callbackId) {
  // 直达时,允许 tabBar 带参数
  const urls = url.split('?')
  const path = urls[0]
  const query = parseQuery(urls[1] || '')
  navigate(path, function () {
    _switchTab({
      url,
      path,
      query,
      from
    }, callbackId)
  }, openType === 'appLaunch')
}