提交 69cd3d0d 编写于 作者: fxy060608's avatar fxy060608

feat(v3): native event

上级 e8a49402
...@@ -201,7 +201,9 @@ const third = [ ...@@ -201,7 +201,9 @@ const third = [
'restoreGlobal', 'restoreGlobal',
'getSubNVueById', 'getSubNVueById',
'getCurrentSubNVue', 'getCurrentSubNVue',
'setPageMeta' 'setPageMeta',
'onNativeEventReceive',
'sendNativeEvent'
] ]
const ad = [ const ad = [
......
...@@ -212,7 +212,9 @@ var serviceContext = (function () { ...@@ -212,7 +212,9 @@ var serviceContext = (function () {
'restoreGlobal', 'restoreGlobal',
'getSubNVueById', 'getSubNVueById',
'getCurrentSubNVue', 'getCurrentSubNVue',
'setPageMeta' 'setPageMeta',
'onNativeEventReceive',
'sendNativeEvent'
]; ];
const ad = [ const ad = [
...@@ -639,7 +641,7 @@ var serviceContext = (function () { ...@@ -639,7 +641,7 @@ var serviceContext = (function () {
}; };
const SYNC_API_RE = const SYNC_API_RE =
/^\$|restoreGlobal|getCurrentSubNVue|getMenuButtonBoundingClientRect|^report|interceptors|Interceptor$|getSubNVueById|requireNativePlugin|upx2px|hideKeyboard|canIUse|^create|Sync$|Manager$|base64ToArrayBuffer|arrayBufferToBase64/; /^\$|sendNativeEvent|restoreGlobal|getCurrentSubNVue|getMenuButtonBoundingClientRect|^report|interceptors|Interceptor$|getSubNVueById|requireNativePlugin|upx2px|hideKeyboard|canIUse|^create|Sync$|Manager$|base64ToArrayBuffer|arrayBufferToBase64/;
const CONTEXT_API_RE = /^create|Manager$/; const CONTEXT_API_RE = /^create|Manager$/;
...@@ -1948,6 +1950,9 @@ var serviceContext = (function () { ...@@ -1948,6 +1950,9 @@ var serviceContext = (function () {
visible: { visible: {
type: Boolean, type: Boolean,
default: true default: true
},
popover: {
type: Object
} }
}; };
...@@ -7332,6 +7337,23 @@ var serviceContext = (function () { ...@@ -7332,6 +7337,23 @@ var serviceContext = (function () {
return getSubNVueById(plus.webview.currentWebview().id) return getSubNVueById(plus.webview.currentWebview().id)
} }
const callbacks$3 = [];
function onNativeEventReceive (callback) {
isFn(callback) &&
callbacks$3.indexOf(callback) === -1 &&
callbacks$3.push(callback);
}
function consumeNativeEvent (event, data) {
callbacks$3.forEach(callback => callback(event, data));
}
function sendNativeEvent (event, data, callback) {
// 实时获取weex module(weex可能会变化,比如首页nvue加速显示时)
return weex.requireModule('plus').sendNativeEvent(event, data, callback)
}
let firstBackTime = 0; let firstBackTime = 0;
function quit () { function quit () {
...@@ -7477,6 +7499,9 @@ var serviceContext = (function () { ...@@ -7477,6 +7499,9 @@ var serviceContext = (function () {
( (
windowOptions.navigationStyle === 'custom' && windowOptions.navigationStyle === 'custom' &&
!isPlainObject(titleNView) !isPlainObject(titleNView)
) || (
windowOptions.transparentTitle === 'always' &&
!isPlainObject(titleNView)
) )
) { ) {
return false return false
...@@ -7495,7 +7520,7 @@ var serviceContext = (function () { ...@@ -7495,7 +7520,7 @@ var serviceContext = (function () {
titleText: titleImage === '' ? windowOptions.navigationBarTitleText || '' : '', titleText: titleImage === '' ? windowOptions.navigationBarTitleText || '' : '',
titleColor: windowOptions.navigationBarTextStyle === 'black' ? '#000000' : '#ffffff', titleColor: windowOptions.navigationBarTextStyle === 'black' ? '#000000' : '#ffffff',
type: titleNViewTypeList[transparentTitle], type: titleNViewTypeList[transparentTitle],
backgroundColor: transparentTitle !== 'always' ? windowOptions.navigationBarBackgroundColor || '#000000' : 'rgba(0,0,0,0)', backgroundColor: windowOptions.navigationBarBackgroundColor || '#f8f8f8',
tags: titleImage === '' ? [] : [{ tags: titleImage === '' ? [] : [{
'tag': 'img', 'tag': 'img',
'src': titleImage, 'src': titleImage,
...@@ -8938,11 +8963,12 @@ var serviceContext = (function () { ...@@ -8938,11 +8963,12 @@ var serviceContext = (function () {
function showActionSheet$1 ({ function showActionSheet$1 ({
itemList = [], itemList = [],
itemColor = '#000000', itemColor = '#000000',
title = '' title = '',
popover
}, callbackId) { }, callbackId) {
const options = { const options = {
buttons: itemList.map(item => ({ buttons: itemList.map(item => ({
title: item, title: item,
color: itemColor color: itemColor
})) }))
}; };
...@@ -8954,7 +8980,7 @@ var serviceContext = (function () { ...@@ -8954,7 +8980,7 @@ var serviceContext = (function () {
options.cancel = '取消'; options.cancel = '取消';
} }
plus.nativeUI.actionSheet(options, (e) => { plus.nativeUI.actionSheet(Object.assign(options, { popover }), (e) => {
if (e.index > 0) { if (e.index > 0) {
invoke$1(callbackId, { invoke$1(callbackId, {
errMsg: 'showActionSheet:ok', errMsg: 'showActionSheet:ok',
...@@ -9103,16 +9129,16 @@ var serviceContext = (function () { ...@@ -9103,16 +9129,16 @@ var serviceContext = (function () {
} }
} }
const callbacks$3 = {}; const callbacks$4 = {};
function createCallbacks (namespace) { function createCallbacks (namespace) {
let scopedCallbacks = callbacks$3[namespace]; let scopedCallbacks = callbacks$4[namespace];
if (!scopedCallbacks) { if (!scopedCallbacks) {
scopedCallbacks = { scopedCallbacks = {
id: 1, id: 1,
callbacks: Object.create(null) callbacks: Object.create(null)
}; };
callbacks$3[namespace] = scopedCallbacks; callbacks$4[namespace] = scopedCallbacks;
} }
return { return {
get (id) { get (id) {
...@@ -9426,6 +9452,9 @@ var serviceContext = (function () { ...@@ -9426,6 +9452,9 @@ var serviceContext = (function () {
restoreGlobal: restoreGlobal, restoreGlobal: restoreGlobal,
getSubNVueById: getSubNVueById, getSubNVueById: getSubNVueById,
getCurrentSubNVue: getCurrentSubNVue, getCurrentSubNVue: getCurrentSubNVue,
onNativeEventReceive: onNativeEventReceive,
consumeNativeEvent: consumeNativeEvent,
sendNativeEvent: sendNativeEvent,
navigateBack: navigateBack$1, navigateBack: navigateBack$1,
navigateTo: navigateTo$1, navigateTo: navigateTo$1,
reLaunch: reLaunch$1, reLaunch: reLaunch$1,
...@@ -9691,9 +9720,9 @@ var serviceContext = (function () { ...@@ -9691,9 +9720,9 @@ var serviceContext = (function () {
'error', 'error',
'waiting' 'waiting'
]; ];
const callbacks$4 = {}; const callbacks$5 = {};
eventNames$2.forEach(name => { eventNames$2.forEach(name => {
callbacks$4[name] = []; callbacks$5[name] = [];
}); });
const props$1 = [ const props$1 = [
...@@ -9757,7 +9786,7 @@ var serviceContext = (function () { ...@@ -9757,7 +9786,7 @@ var serviceContext = (function () {
errMsg, errMsg,
errCode errCode
}) => { }) => {
callbacks$4[state].forEach(callback => { callbacks$5[state].forEach(callback => {
if (typeof callback === 'function') { if (typeof callback === 'function') {
callback(state === 'error' ? { callback(state === 'error' ? {
errMsg, errMsg,
...@@ -9809,7 +9838,7 @@ var serviceContext = (function () { ...@@ -9809,7 +9838,7 @@ var serviceContext = (function () {
eventNames$2.forEach(item => { eventNames$2.forEach(item => {
const name = item[0].toUpperCase() + item.substr(1); const name = item[0].toUpperCase() + item.substr(1);
BackgroundAudioManager.prototype[`on${name}`] = function (callback) { BackgroundAudioManager.prototype[`on${name}`] = function (callback) {
callbacks$4[item].push(callback); callbacks$5[item].push(callback);
}; };
}); });
...@@ -10849,10 +10878,10 @@ var serviceContext = (function () { ...@@ -10849,10 +10878,10 @@ var serviceContext = (function () {
EditorContext: EditorContext EditorContext: EditorContext
}); });
const callbacks$5 = []; const callbacks$6 = [];
onMethod('onAccelerometerChange', function (res) { onMethod('onAccelerometerChange', function (res) {
callbacks$5.forEach(callbackId => { callbacks$6.forEach(callbackId => {
invoke$1(callbackId, res); invoke$1(callbackId, res);
}); });
}); });
...@@ -10864,7 +10893,7 @@ var serviceContext = (function () { ...@@ -10864,7 +10893,7 @@ var serviceContext = (function () {
*/ */
function onAccelerometerChange (callbackId) { function onAccelerometerChange (callbackId) {
// TODO 当没有 start 时,添加 on 需要主动 start? // TODO 当没有 start 时,添加 on 需要主动 start?
callbacks$5.push(callbackId); callbacks$6.push(callbackId);
if (!isEnable) { if (!isEnable) {
startAccelerometer(); startAccelerometer();
} }
...@@ -10921,10 +10950,10 @@ var serviceContext = (function () { ...@@ -10921,10 +10950,10 @@ var serviceContext = (function () {
onBLECharacteristicValueChange: onBLECharacteristicValueChange$1 onBLECharacteristicValueChange: onBLECharacteristicValueChange$1
}); });
const callbacks$6 = []; const callbacks$7 = [];
onMethod('onCompassChange', function (res) { onMethod('onCompassChange', function (res) {
callbacks$6.forEach(callbackId => { callbacks$7.forEach(callbackId => {
invoke$1(callbackId, res); invoke$1(callbackId, res);
}); });
}); });
...@@ -10936,7 +10965,7 @@ var serviceContext = (function () { ...@@ -10936,7 +10965,7 @@ var serviceContext = (function () {
*/ */
function onCompassChange (callbackId) { function onCompassChange (callbackId) {
// TODO 当没有 start 时,添加 on 需要主动 start? // TODO 当没有 start 时,添加 on 需要主动 start?
callbacks$6.push(callbackId); callbacks$7.push(callbackId);
if (!isEnable$1) { if (!isEnable$1) {
startCompass(); startCompass();
} }
...@@ -10968,16 +10997,16 @@ var serviceContext = (function () { ...@@ -10968,16 +10997,16 @@ var serviceContext = (function () {
stopCompass: stopCompass stopCompass: stopCompass
}); });
const callbacks$7 = []; const callbacks$8 = [];
onMethod('onNetworkStatusChange', res => { onMethod('onNetworkStatusChange', res => {
callbacks$7.forEach(callbackId => { callbacks$8.forEach(callbackId => {
invoke$1(callbackId, res); invoke$1(callbackId, res);
}); });
}); });
function onNetworkStatusChange (callbackId) { function onNetworkStatusChange (callbackId) {
callbacks$7.push(callbackId); callbacks$8.push(callbackId);
} }
var require_context_module_1_13 = /*#__PURE__*/Object.freeze({ var require_context_module_1_13 = /*#__PURE__*/Object.freeze({
...@@ -10985,16 +11014,16 @@ var serviceContext = (function () { ...@@ -10985,16 +11014,16 @@ var serviceContext = (function () {
onNetworkStatusChange: onNetworkStatusChange onNetworkStatusChange: onNetworkStatusChange
}); });
const callbacks$8 = []; const callbacks$9 = [];
onMethod('onUIStyleChange', function (res) { onMethod('onUIStyleChange', function (res) {
callbacks$8.forEach(callbackId => { callbacks$9.forEach(callbackId => {
invoke$1(callbackId, res); invoke$1(callbackId, res);
}); });
}); });
function onUIStyleChange (callbackId) { function onUIStyleChange (callbackId) {
callbacks$8.push(callbackId); callbacks$9.push(callbackId);
} }
var require_context_module_1_14 = /*#__PURE__*/Object.freeze({ var require_context_module_1_14 = /*#__PURE__*/Object.freeze({
...@@ -11030,7 +11059,7 @@ var serviceContext = (function () { ...@@ -11030,7 +11059,7 @@ var serviceContext = (function () {
previewImage: previewImage$1 previewImage: previewImage$1
}); });
const callbacks$9 = { const callbacks$a = {
pause: [], pause: [],
resume: [], resume: [],
start: [], start: [],
...@@ -11044,7 +11073,7 @@ var serviceContext = (function () { ...@@ -11044,7 +11073,7 @@ var serviceContext = (function () {
const state = res.state; const state = res.state;
delete res.state; delete res.state;
delete res.errMsg; delete res.errMsg;
callbacks$9[state].forEach(callback => { callbacks$a[state].forEach(callback => {
if (typeof callback === 'function') { if (typeof callback === 'function') {
callback(res); callback(res);
} }
...@@ -11052,7 +11081,7 @@ var serviceContext = (function () { ...@@ -11052,7 +11081,7 @@ var serviceContext = (function () {
}); });
} }
onError (callback) { onError (callback) {
callbacks$9.error.push(callback); callbacks$a.error.push(callback);
} }
onFrameRecorded (callback) { onFrameRecorded (callback) {
...@@ -11064,16 +11093,16 @@ var serviceContext = (function () { ...@@ -11064,16 +11093,16 @@ var serviceContext = (function () {
} }
onPause (callback) { onPause (callback) {
callbacks$9.pause.push(callback); callbacks$a.pause.push(callback);
} }
onResume (callback) { onResume (callback) {
callbacks$9.resume.push(callback); callbacks$a.resume.push(callback);
} }
onStart (callback) { onStart (callback) {
callbacks$9.start.push(callback); callbacks$a.start.push(callback);
} }
onStop (callback) { onStop (callback) {
callbacks$9.stop.push(callback); callbacks$a.stop.push(callback);
} }
pause () { pause () {
invokeMethod('operateRecorder', { invokeMethod('operateRecorder', {
...@@ -11387,7 +11416,7 @@ var serviceContext = (function () { ...@@ -11387,7 +11416,7 @@ var serviceContext = (function () {
const socketTasks$1 = Object.create(null); const socketTasks$1 = Object.create(null);
const socketTasksArray = []; const socketTasksArray = [];
const callbacks$a = Object.create(null); const callbacks$b = Object.create(null);
onMethod('onSocketTaskStateChange', ({ onMethod('onSocketTaskStateChange', ({
socketTaskId, socketTaskId,
state, state,
...@@ -11401,8 +11430,8 @@ var serviceContext = (function () { ...@@ -11401,8 +11430,8 @@ var serviceContext = (function () {
if (state === 'open') { if (state === 'open') {
socketTask.readyState = socketTask.OPEN; socketTask.readyState = socketTask.OPEN;
} }
if (socketTask === socketTasksArray[0] && callbacks$a[state]) { if (socketTask === socketTasksArray[0] && callbacks$b[state]) {
invoke$1(callbacks$a[state], state === 'message' ? { invoke$1(callbacks$b[state], state === 'message' ? {
data data
} : {}); } : {});
} }
...@@ -11468,19 +11497,19 @@ var serviceContext = (function () { ...@@ -11468,19 +11497,19 @@ var serviceContext = (function () {
} }
function onSocketOpen (callbackId) { function onSocketOpen (callbackId) {
callbacks$a.open = callbackId; callbacks$b.open = callbackId;
} }
function onSocketError (callbackId) { function onSocketError (callbackId) {
callbacks$a.error = callbackId; callbacks$b.error = callbackId;
} }
function onSocketMessage (callbackId) { function onSocketMessage (callbackId) {
callbacks$a.message = callbackId; callbacks$b.message = callbackId;
} }
function onSocketClose (callbackId) { function onSocketClose (callbackId) {
callbacks$a.close = callbackId; callbacks$b.close = callbackId;
} }
var require_context_module_1_19 = /*#__PURE__*/Object.freeze({ var require_context_module_1_19 = /*#__PURE__*/Object.freeze({
...@@ -11872,16 +11901,16 @@ var serviceContext = (function () { ...@@ -11872,16 +11901,16 @@ var serviceContext = (function () {
createSelectorQuery: createSelectorQuery createSelectorQuery: createSelectorQuery
}); });
const callbacks$b = []; const callbacks$c = [];
onMethod('onKeyboardHeightChange', res => { onMethod('onKeyboardHeightChange', res => {
callbacks$b.forEach(callbackId => { callbacks$c.forEach(callbackId => {
invoke$1(callbackId, res); invoke$1(callbackId, res);
}); });
}); });
function onKeyboardHeightChange (callbackId) { function onKeyboardHeightChange (callbackId) {
callbacks$b.push(callbackId); callbacks$c.push(callbackId);
} }
var require_context_module_1_24 = /*#__PURE__*/Object.freeze({ var require_context_module_1_24 = /*#__PURE__*/Object.freeze({
...@@ -11960,16 +11989,16 @@ var serviceContext = (function () { ...@@ -11960,16 +11989,16 @@ var serviceContext = (function () {
const hideTabBarRedDot$1 = removeTabBarBadge$1; const hideTabBarRedDot$1 = removeTabBarBadge$1;
const callbacks$c = []; const callbacks$d = [];
onMethod('onTabBarMidButtonTap', res => { onMethod('onTabBarMidButtonTap', res => {
callbacks$c.forEach(callbackId => { callbacks$d.forEach(callbackId => {
invoke$1(callbackId, res); invoke$1(callbackId, res);
}); });
}); });
function onTabBarMidButtonTap (callbackId) { function onTabBarMidButtonTap (callbackId) {
callbacks$c.push(callbackId); callbacks$d.push(callbackId);
} }
var require_context_module_1_28 = /*#__PURE__*/Object.freeze({ var require_context_module_1_28 = /*#__PURE__*/Object.freeze({
...@@ -11980,22 +12009,22 @@ var serviceContext = (function () { ...@@ -11980,22 +12009,22 @@ var serviceContext = (function () {
onTabBarMidButtonTap: onTabBarMidButtonTap onTabBarMidButtonTap: onTabBarMidButtonTap
}); });
const callbacks$d = []; const callbacks$e = [];
onMethod('onViewDidResize', res => { onMethod('onViewDidResize', res => {
callbacks$d.forEach(callbackId => { callbacks$e.forEach(callbackId => {
invoke$1(callbackId, res); invoke$1(callbackId, res);
}); });
}); });
function onWindowResize (callbackId) { function onWindowResize (callbackId) {
callbacks$d.push(callbackId); callbacks$e.push(callbackId);
} }
function offWindowResize (callbackId) { function offWindowResize (callbackId) {
// TODO 目前 on 和 off 即使传入同一个 function,获取到的 callbackId 也不会一致,导致不能 off 掉指定 // TODO 目前 on 和 off 即使传入同一个 function,获取到的 callbackId 也不会一致,导致不能 off 掉指定
// 后续修复 // 后续修复
// 此处和微信平台一致查询不到去掉最后一个 // 此处和微信平台一致查询不到去掉最后一个
callbacks$d.splice(callbacks$d.indexOf(callbackId), 1); callbacks$e.splice(callbacks$e.indexOf(callbackId), 1);
} }
var require_context_module_1_29 = /*#__PURE__*/Object.freeze({ var require_context_module_1_29 = /*#__PURE__*/Object.freeze({
...@@ -12469,7 +12498,7 @@ var serviceContext = (function () { ...@@ -12469,7 +12498,7 @@ var serviceContext = (function () {
); );
} }
function initGlobalListeners () { function initGlobalListeners () {
const globalEvent = requireNativePlugin('globalEvent'); const globalEvent = requireNativePlugin('globalEvent');
const emit = UniServiceJSBridge.emit; const emit = UniServiceJSBridge.emit;
...@@ -12498,13 +12527,20 @@ var serviceContext = (function () { ...@@ -12498,13 +12527,20 @@ var serviceContext = (function () {
publish('onKeyboardHeightChange', { publish('onKeyboardHeightChange', {
height: event.height height: event.height
}); });
}); });
globalEvent.addEventListener('uistylechange', function (event) { globalEvent.addEventListener('uistylechange', function (event) {
publish('onUIStyleChange', { publish('onUIStyleChange', {
style: event.uistyle style: event.uistyle
}); });
}); });
globalEvent.addEventListener('uniMPNativeEvent', function ({
event,
data
}) {
consumeNativeEvent(event, data);
});
plus.globalEvent.addEventListener('plusMessage', onPlusMessage$1); plus.globalEvent.addEventListener('plusMessage', onPlusMessage$1);
......
...@@ -8,7 +8,7 @@ import { ...@@ -8,7 +8,7 @@ import {
} from './interceptor' } from './interceptor'
const SYNC_API_RE = const SYNC_API_RE =
/^\$|restoreGlobal|getCurrentSubNVue|getMenuButtonBoundingClientRect|^report|interceptors|Interceptor$|getSubNVueById|requireNativePlugin|upx2px|hideKeyboard|canIUse|^create|Sync$|Manager$|base64ToArrayBuffer|arrayBufferToBase64/ /^\$|sendNativeEvent|restoreGlobal|getCurrentSubNVue|getMenuButtonBoundingClientRect|^report|interceptors|Interceptor$|getSubNVueById|requireNativePlugin|upx2px|hideKeyboard|canIUse|^create|Sync$|Manager$|base64ToArrayBuffer|arrayBufferToBase64/
const CONTEXT_API_RE = /^create|Manager$/ const CONTEXT_API_RE = /^create|Manager$/
......
...@@ -50,6 +50,8 @@ export * from './plugin/require-native-plugin' ...@@ -50,6 +50,8 @@ export * from './plugin/require-native-plugin'
export * from './plugin/share' export * from './plugin/share'
export * from './plugin/restore-global' export * from './plugin/restore-global'
export * from './plugin/sub-nvue' export * from './plugin/sub-nvue'
export * from './plugin/on-native-event-receive'
export * from './plugin/send-native-event'
export * from './route/navigate-back' export * from './route/navigate-back'
export * from './route/navigate-to' export * from './route/navigate-to'
......
import {
isFn
}
from 'uni-shared'
const callbacks = []
export function onNativeEventReceive (callback) {
isFn(callback) &&
callbacks.indexOf(callback) === -1 &&
callbacks.push(callback)
}
export function consumeNativeEvent (event, data) {
callbacks.forEach(callback => callback(event, data))
}
export function sendNativeEvent (event, data, callback) {
// 实时获取weex module(weex可能会变化,比如首页nvue加速显示时)
return weex.requireModule('plus').sendNativeEvent(event, data, callback)
}
...@@ -2,7 +2,7 @@ import { ...@@ -2,7 +2,7 @@ import {
callAppHook callAppHook
} from 'uni-core/service/plugins/util' } from 'uni-core/service/plugins/util'
import initOn from 'uni-core/service/bridge/on' import initOn from 'uni-core/service/bridge/on'
import { import {
NETWORK_TYPES NETWORK_TYPES
...@@ -35,6 +35,10 @@ import { ...@@ -35,6 +35,10 @@ import {
backbuttonListener backbuttonListener
} from './backbutton' } from './backbutton'
import {
consumeNativeEvent
} from '../api/plugin/on-native-event-receive'
let appCtx let appCtx
const defaultApp = { const defaultApp = {
...@@ -55,7 +59,7 @@ export function getApp ({ ...@@ -55,7 +59,7 @@ export function getApp ({
) )
} }
function initGlobalListeners () { function initGlobalListeners () {
const globalEvent = requireNativePlugin('globalEvent') const globalEvent = requireNativePlugin('globalEvent')
const emit = UniServiceJSBridge.emit const emit = UniServiceJSBridge.emit
...@@ -84,13 +88,20 @@ function initGlobalListeners () { ...@@ -84,13 +88,20 @@ function initGlobalListeners () {
publish('onKeyboardHeightChange', { publish('onKeyboardHeightChange', {
height: event.height height: event.height
}) })
}) })
globalEvent.addEventListener('uistylechange', function (event) { globalEvent.addEventListener('uistylechange', function (event) {
publish('onUIStyleChange', { publish('onUIStyleChange', {
style: event.uistyle style: event.uistyle
}) })
}) })
globalEvent.addEventListener('uniMPNativeEvent', function ({
event,
data
}) {
consumeNativeEvent(event, data)
})
plus.globalEvent.addEventListener('plusMessage', onPlusMessage) plus.globalEvent.addEventListener('plusMessage', onPlusMessage)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册