美文网首页
关于Swift与Flutter交互

关于Swift与Flutter交互

作者: 91阿生 | 来源:发表于2021-04-16 16:16 被阅读0次
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,在程序入口处
image.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;
  }
}

效果:


image.png
image.png

相关文章

网友评论

      本文标题:关于Swift与Flutter交互

      本文链接:https://www.haomeiwen.com/subject/yxmelltx.html