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) } }