Saltar al contenido principal

splashScreenView de iOS FlutterViewController ahora admite nulos

El splashScreenView de FlutterViewController cambió de nonnull a nullable.

Resumen

#

La propiedad splashScreenView de FlutterViewController ha sido cambiada de nonnull a nullable.

Declaración antigua de splashScreenView:

objc
@property(strong, nonatomic) UIView* splashScreenView;

Nueva declaración de splashScreenView:

objc
@property(strong, nonatomic, nullable) UIView* splashScreenView;

Contexto

#

Antes de este cambio, en iOS la propiedad splashScreenView devolvía nil cuando no se establecía ninguna vista de pantalla de inicio (splash screen), y establecer la propiedad en nil eliminaba la vista de pantalla de inicio. Sin embargo, la API splashScreenView estaba marcada incorrectamente como nonnull. Esta propiedad se utiliza con mayor frecuencia al realizar la transición a vistas de Flutter en escenarios de integración add-to-app en iOS.

Descripción del cambio

#

Aunque en Objective-C era posible solucionar temporalmente la anotación incorrecta nonnull estableciendo splashScreenView en una UIView nil, en Swift esto causaba un error de compilación:

error build: Value of optional type 'UIView?' must be unwrapped to a value of type 'UIView'

La PR #34743 actualiza el atributo de la propiedad a nullable. Puede devolver nil y se puede establecer en nil para eliminar la vista tanto en Objective-C como en Swift.

Guía de migración

#

Si splashScreenView se almacena en una variable UIView en Swift, actualízala a un tipo opcional UIView?.

Código antes de la migración:

swift
  var splashScreenView = UIView()
  var flutterEngine = FlutterEngine(name: "my flutter engine")
  let flutterViewController = FlutterViewController(engine: flutterEngine, nibName: nil, bundle: nil)
  splashScreenView = flutterViewController.splashScreenView // compilation error: Value of optional type 'UIView?' must be unwrapped to a value of type 'UIView'

Código después de la migración:

swift
  var splashScreenView : UIView? = UIView()
  var flutterEngine = FlutterEngine(name: "my flutter engine")
  let flutterViewController = FlutterViewController(engine: flutterEngine, nibName: nil, bundle: nil)
  let splashScreenView = flutterViewController.splashScreenView // compiles successfully
  if let splashScreenView = splashScreenView {
  }

Timeline

#

En versión estable: 3.7

Referencias

#

PR relevante: