0.自行封装了一个Toast(使用到SVProgressHUD)
struct Toast {
// 单例
static let `default` = Toast()
private init() {
// 初始化SV配置
SVProgressHUD.setDefaultStyle(.dark)
SVProgressHUD.setDefaultMaskType(.black)
SVProgressHUD.setMinimumDismissTimeInterval(0.35)
}
func addView(view: UIView) {
DispatchQueue.main.async {
SVProgressHUD.setViewForExtension(view)
}
}
}
extension Toast {
// toast消失
func dismiss() {
SVProgressHUD.dismiss()
}
// 成功
func success(message: String?) {
SVProgressHUD.showSuccess(withStatus: message)
}
// 错误
func error(message: String?) {
SVProgressHUD.showError(withStatus: message)
}
// 加载
func load(message: String?) {
SVProgressHUD.show(withStatus: message)
}
// 提示
func tip(message: String) {
SVProgressHUD.showInfo(withStatus: message)
}
}
1. iOS项目实现代码(swift)
这里用到了 pod 'SVProgressHUD',在Podfile中install
- 创建FlutterSVToastPlugin类
实现:
class FlutterSVToastPlugin: NSObject {
// 唯一通道标识
static let CHANNEL_NAME: String = "HongKit/FlutterSVToast"
var isKeyboardVisible: Bool = false
override init() {
super.init()
// 监听键盘
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: NSNotification.Name(rawValue: UIResponder.keyboardWillShowNotification.rawValue), object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name: NSNotification.Name(rawValue: UIResponder.keyboardWillHideNotification.rawValue), object: nil)
}
deinit {
NotificationCenter.default.removeObserver(self, name: NSNotification.Name(UIResponder.keyboardWillShowNotification.rawValue), object: nil)
NotificationCenter.default.removeObserver(self, name: NSNotification.Name(UIResponder.keyboardWillHideNotification.rawValue), object: nil)
}
}
extension FlutterSVToastPlugin {
@objc func keyboardWillShow() {
isKeyboardVisible = true
}
@objc func keyboardWillHide() {
isKeyboardVisible = false
}
func _readKeyWindow() -> UIWindow {
let windows = UIApplication.shared.windows
if isKeyboardVisible {
return windows.last ?? UIApplication.shared.keyWindow!
}
for window in windows {
if window.isKeyWindow {
return window
}
}
return UIApplication.shared.keyWindow!
}
}
extension FlutterSVToastPlugin: FlutterPlugin {
// 实现注册函数
static func register(with registrar: FlutterPluginRegistrar) {
// 方法的通道
let channel = FlutterMethodChannel(name: CHANNEL_NAME, binaryMessenger: registrar.messenger())
// 创建类对象
let svToast = FlutterSVToastPlugin()
// 添加注册
registrar.addMethodCallDelegate(svToast, channel: channel)
}
// 实现flutter调用
func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
var message: String?
if let args = call.arguments as? Dictionary<String, Any?> {
message = args["message"] as? String
}
if call.method == "dimiss" {
Toast.default.dismiss()
result(true)
} else if call.method == "success" {
Toast.default.success(message: message)
result(true)
} else if call.method == "error" {
Toast.default.error(message: message)
result(true)
} else if call.method == "load" {
Toast.default.load(message: message)
result(true)
} else if call.method == "tip" {
Toast.default.tip(message: message!)
result(true)
} else {
result(FlutterMethodNotImplemented)
}
Toast.default.addView(view: _readKeyWindow())
}
}
2. ⚠️ 需要注册自己写的 FlutterSVToastPlugin,在程序入口处
![](https://img.haomeiwen.com/i671602/2c4d6be8d804afb5.png)
3. Flutter项目中
- 创建类 class SVToast { }
实现:
class SVToast {
static const MethodChannel _channel = const MethodChannel('HongKit/FlutterSVToast');
// 消失
static Future<bool> dismiss() async {
bool res = await _channel.invokeMethod('dismiss');
return res;
}
// 成功
static Future<bool> success({String message}) async {
final Map<String, dynamic> params = {
"message": message
};
bool res = await _channel.invokeMethod('success', params);
return res;
}
// 错误
static Future<bool> error({String message}) async {
final Map<String, dynamic> params = {
"message": message
};
bool res = await _channel.invokeMethod('error', params);
return res;
}
// 加载
static Future<bool> load({String message}) async {
final Map<String, dynamic> params = {
"message": message
};
bool res = await _channel.invokeMethod('load', params);
return res;
}
// 提示
static Future<bool> tip(String message) async {
final Map<String, dynamic> params = {
"message": message
};
bool res = await _channel.invokeMethod('tip', params);
return res;
}
}
效果:
![](https://img.haomeiwen.com/i671602/455d0260995b2275.png)
![](https://img.haomeiwen.com/i671602/9e9c977aa70ca806.png)
网友评论