Как динамически изменить флаттер UiKitView (iOS Platform View)? - PullRequest
1 голос
/ 11 января 2020

Я пытаюсь размыть видео с помощью Flutter.

BackdropFilter работает на android, но не работает на устройстве ios, возможно, потому что само VideoView использует UiKitView. Поэтому я попытался создать собственный виджет размытия с помощью UiKitView, и он успешно размыл видео, , но теперь я хочу динамически изменить уровень размытия с помощью значения радиуса.

Я тестировал с помощью Slider и setState , но это не меняет уровень размытия. Есть ли способ перестроить UiKitView со стороны флаттера?

Это мой главный экран со стеком

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
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...