如何动态更改UiKitView(iOS平台视图)Flutter?

时间:2020-01-11 09:20:42

标签: ios swift flutter dart flutter-layout

我正在尝试使用Flutter来模糊视频。

BackdropFilter在android上工作,但在ios设备上不工作,也许是因为videoView本身使用UiKitView。因此,我尝试使用UiKitView制作自己的模糊小部件,并成功地模糊了视频,但是现在我想使用“半径”值动态更改模糊级别。

我使用Slider和setState进行了测试,但它不会更改模糊级别。有什么办法可以从Flutter方面重建UiKitView?

这是我使用Stack的主屏幕

child: Stack(
          children: <Widget>[
            videoView(),
            blurView(),
            radiusSlider(),
          ],
        ),

T 他是动态更改半径值的滑块

  Widget radiusSlider() {
    return Slider(
      activeColor: Colors.indigoAccent,
      min: 0.0,
      max: 30.0,
      onChanged: (newVal) {
        setState(() => radius = newVal.toInt());
      },
      value: radius.toDouble(),
    );
  }

这是具有平台视图的模糊小部件。我想用半径值动态更改此小部件

  Widget blurView() {
    if (radius <= 15) {
      return Positioned.fill(
        child: Container(
          child: UiKitView(
            viewType: 'BlurVideo',
            creationParams: <String, dynamic>{
              "radius": 10,
            },
            creationParamsCodec: StandardMessageCodec(),
          ),
        ),
      );
    } else {
      return Positioned.fill(
        child: Container(
          child: UiKitView(
            viewType: 'BlurVideo',
            creationParams: <String, dynamic>{
              "radius": 30,
            },
            creationParamsCodec: StandardMessageCodec(),
          ),
        ),
      );
    }
  }

这是我的AppDelegate.swift文件

import UIKit
import Flutter
import VisualEffectView

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
    let viewFactory = BlurViewFactory()
    registrar(forPlugin: "Blur").register(viewFactory, withId: "BlurVideo" )

    GeneratedPluginRegistrant.register(with: self)
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }
}

public class BlurViewFactory: NSObject, FlutterPlatformViewFactory {
    public func createArgsCodec() -> FlutterMessageCodec & NSObjectProtocol {
        return FlutterStandardMessageCodec.sharedInstance()
    }
    public func create(
        withFrame frame: CGRect,
        viewIdentifier viewId: Int64,
        arguments args: Any?
        ) -> FlutterPlatformView {
        return BlurView(frame, viewId: viewId, args: args)
    }
}

public class BlurView : NSObject, FlutterPlatformView {
    let frame: CGRect
    let viewId: Int64
    let radius: CGFloat

    init(_ frame: CGRect, viewId: Int64, args: Any?) {
        self.frame = frame
        self.viewId = viewId
        let params = args as! NSDictionary
        self.radius = params["radius"] as! CGFloat
    }

    public func view() -> UIView {
        let view = UIView()
        let visualEffectView = VisualEffectView(frame: view.bounds)
        visualEffectView.blurRadius = self.radius
        visualEffectView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
        view.addSubview(visualEffectView)
        return view
    }
}

0 个答案:

没有答案
相关问题