# 代理方法
小程序的部分功能,需要原生端去实现才能调用,比如转发和获取主体App的用户信息等。
另外,也有一些功能可以开放给App开发者自定义,比如自定义更多面板、自定义菜单项等。
# 1.设置代理方法实现类
首先,创建一个继承自AppletHandler的实现类。
class MyAppletHandler extends AppletHandler {
Future<void> appletDidOpen(String appId) async {
print("appletDidOpen appId:$appId");
}
void forwardApplet(Map<String, dynamic> appletInfo) {
print("forwardApplet ---");
}
bool customCapsuleMoreButtonClick(String appId) {
// 返回true,代表要自定义更多视图;返回false,代表使用默认的更多视图
// 注意该代理方法仅针对iOS端生效,安卓端见常见问题列表。
return true;
}
Future<List<CustomMenu>> getCustomMenus(String appId) {
List<CustomMenu> customMenus = [];
return Future.value(customMenus);
}
Future<void> getMobileNumber(Function(dynamic params) param0) {
// TODO: implement getMobileNumber
throw UnimplementedError();
}
Future<Map<String, dynamic>> getUserInfo() {
// TODO: implement getUserInfo
throw UnimplementedError();
}
Future<void> onCustomMenuClick(String appId, String path, String menuId, String appInfo) {
// TODO: implement onCustomMenuClick
throw UnimplementedError();
}
}
然后,设置代理方法的实现对象:
Mop.instance.registerAppletHandler(MyAppletHandler());
# 2.代理方法
# 2.1 转发
更多菜单里的转发按钮的行为,需要由app来实现,否则点击了也无响应。 实现转发功能,实现如下代理方法即可
void forwardApplet(Map<String, dynamic> appletInfo)
appletInfo中包含小程序信息(小程序id、小程序名称、logo等)、转发的页面信息(页面路径、页面参数)。
使用示例:
Future<void> forwardApplet(Map<String, dynamic> map) async {
globalMap = map;
Map<String, dynamic> appletInfo =
Map<String, dynamic>.from(map["appletInfo"]);
print("forwardApplet:$appletInfo");
String appId = appletInfo["appId"];
// 取出appletInfo里的其他参数执行分享逻辑。
}
# 2.2 用户信息
调用获取用户信息API(getUserInfo) 或者 点击open-type属性为getUserInfo的Button时触发该代理事件
/**
返回值可参考如下格式:
{
nickName = "昵称"
avatarUrl = “头像地址”
gender = "性别"
province = "省份"
city = "城市"
country = "国家"
}
*/
Future<Map<String, dynamic>> getUserInfo()
实现的示例:
Future<Map<String, dynamic>> getUserInfo() async {
return {
"nickName": "昵称",
"avatarUrl": "头像",
"gender": "性别",
"province": "省份",
"city": "城市",
"country": "国家",
};
}
# 2.3 获取手机号
当小程序里使用open-type为getPhoneNumber的button控件,点击这个button时,会触发该代理事件。
Future<void> getMobileNumber(Function(dynamic params) param0)
实现示例:
Future<void> getMobileNumber(
Function(dynamic params) getMobileNumberCallback,
) async {
getMobileNumberCallback.call({"phone": "12345678901"});
return Future.value(null);
}
# 2.4 胶囊...点击事件
可在该事件中弹出自己设计的更多视图。 返回true,代表您要自己自定义更多面板视图,您可以在改放中展示自行设计的更多面板视图 返回false,代表使用SDK默认的更多面板视图。
bool customCapsuleMoreButtonClick(String appId);
示例代码
customCapsuleMoreButtonClick(String appId) {
// 首先展示自定义的更多视图
// 然后,返回true
return true;
}
bool
# 2.5 自定义菜单项
如果,您只是想在更多面板里添加一些自定义的菜单项,并且使用默认的更多视图。 那么,可以实现下面这个代理方法。
/// 获取自定义菜单
Future<List<CustomMenu>> getCustomMenus(String appId);
实现示例:
@override
Future<List<CustomMenu>> getCustomMenus(String appId) {
List<CustomMenu> customMenus = [
CustomMenu('ShareSinaWeibo', 'weibo_icon', '新浪微博', 'onMiniProgram'),
CustomMenu('ShareQQFirends', 'qq_icon', 'QQ', 'common'),
];
return Future.value(customMenus);
}
# 2.6 实现自定义菜单项点击事件
注入的自定义菜单项,那么菜单项的点击事件在以下代理方法中实现即可
///自定义菜单点击处理
Future<void> onCustomMenuClick(
String appId, String path, String menuId, String appInfo);
实现示例:
Future<void> onCustomMenuClick(
String appId, String path, String menuId, String appInfo) async {
Applet.instance.onCustomMenuClick(
appId,
path,
menuId,
appInfo,
);
return Future.value(null);
}
# 2.7 小程序打开的代理事件
当小程序打开后,会触发以下代理事件。可以在该事件里做一些记录之类的事情。
///打开小程序
Future<void> appletDidOpen(String appId);
实现示例:
Future<void> appletDidOpen(String appId) async {
print("appletDidOpen appId:$appId");
//记录打开过的小程序id
}