mh-two-thousand-and-two
2024-04-12 3d2ec2fd0578d3ba0a414b0cc4e4a2ae60878596
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
import {
  preloadWebview,
  createPreloadWebview,
  registerWebviewReady
} from './webview'
 
let todoNavigator = false
 
function setTodoNavigator (path, callback, msg) {
  todoNavigator = {
    path: path,
    nvue: __uniRoutes.find(route => route.path === path).meta.isNVue,
    navigate: callback
  }
  if (process.env.NODE_ENV !== 'production') {
    console.log(`todoNavigator:${todoNavigator.path} ${msg}`)
  }
}
 
export function navigate (path, callback, isAppLaunch) {
  if (__PLATFORM__ === 'app-plus') {
    if (isAppLaunch && __uniConfig.splashscreen && __uniConfig.splashscreen.autoclose && (!__uniConfig.splashscreen.alwaysShowBeforeRender)) {
      plus.navigator.closeSplashscreen()
    }
    if (!isAppLaunch && todoNavigator) {
      return console.error(`Waiting to navigate to: ${todoNavigator.path}, do not operate continuously: ${path}.`)
    }
    if (__uniConfig.renderer === 'native') { // 纯原生无需wait逻辑
      // 如果是首页还未初始化,需要等一等,其他无需等待
      if (getCurrentPages().length === 0) {
        return setTodoNavigator(path, callback, 'waitForReady')
      }
      return callback()
    }
    // 未创建 preloadWebview 或 preloadWebview 已被使用
    const waitPreloadWebview = !preloadWebview || (preloadWebview && preloadWebview.__uniapp_route)
    // 已创建未 loaded
    const waitPreloadWebviewReady = preloadWebview && !preloadWebview.loaded
 
    if (waitPreloadWebview || waitPreloadWebviewReady) {
      setTodoNavigator(path, callback, waitPreloadWebview ? 'waitForCreate' : 'waitForReady')
    } else {
      callback()
    }
    if (waitPreloadWebviewReady) {
      registerWebviewReady(preloadWebview.id, todoNavigate)
    }
  }
}
 
function todoNavigate () {
  if (!todoNavigator) {
    return
  }
  const {
    navigate
  } = todoNavigator
  if (process.env.NODE_ENV !== 'production') {
    console.log(`todoNavigate:${todoNavigator.path}`)
  }
  todoNavigator = false
  return navigate()
}
 
export function navigateFinish () {
  if (__PLATFORM__ === 'app-plus') {
    if (__uniConfig.renderer === 'native') {
      if (!todoNavigator) {
        return
      }
      if (todoNavigator.nvue) {
        return todoNavigate()
      }
      return
    }
    // 创建预加载
    const preloadWebview = createPreloadWebview()
    if (process.env.NODE_ENV !== 'production') {
      console.log(`navigateFinish.preloadWebview:${preloadWebview.id}`)
    }
    if (!todoNavigator) {
      return
    }
    if (todoNavigator.nvue) {
      return todoNavigate()
    }
    preloadWebview.loaded
      ? todoNavigator.navigate()
      : registerWebviewReady(preloadWebview.id, todoNavigate)
  }
}