Я пытаюсь размыть видео с помощью 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
}
}