Transición de las interfaces de prueba de canales de plataforma al paquete flutter_test
Las APIs relacionadas con el método setMockMessageHandler se han movido de package:flutter a package:flutter_test
Resumen
#Los siguientes métodos han sido reemplazados por APIs
en el paquete flutter_test:
BinaryMessenger.checkMessageHandlerBinaryMessenger.setMockMessageHandlerBinaryMessenger.checkMockMessageHandlerBasicMessageChannel.setMockMessageHandlerMethodChannel.checkMethodCallHandlerMethodChannel.setMockMethodCallHandlerMethodChannel.checkMockMethodCallHandler
El callback onPlatformMessage ya no es utilizado
por el framework de Flutter.
Contexto
#Como parte de una refactorización de la arquitectura de comunicación
de complementos de bajo nivel, nos hemos movido de la
lógica anterior de onPlatformMessage/handlePlatformMessage
a un sistema de almacenamiento en búfer por canal implementado en
el motor en la clase ChannelBuffers.
Para mantener la compatibilidad con el código existente,
la API existente BinaryMessenger.setMessageHandler
ha sido refactorizada para usar la nueva API de ChannelBuffers.
Una diferencia entre la API de ChannelBuffers y la
API anterior es que la nueva API es más consistente en
su enfoque de la asincronía. Como efecto secundario,
las APIs en torno al paso de mensajes son ahora completamente asíncronas.
Esto planteó un problema para la implementación de las APIs de prueba
heredadas que, por razones históricas,
se encontraban anteriormente en el paquete flutter.
Dado que dependían de que la lógica subyacente fuera parcialmente síncrona,
requerían una refactorización.
Para evitar añadir aún más lógica de prueba en el paquete flutter,
se tomó la decisión de mover esta lógica al paquete flutter_test.
Descripción del cambio
#Específicamente, se vieron afectadas las siguientes APIs:
BinaryMessenger.checkMessageHandler: Obsoleto.BinaryMessenger.setMockMessageHandler: Reemplazado porTestDefaultBinaryMessenger.setMockMessageHandler.BinaryMessenger.checkMockMessageHandler: Reemplazado porTestDefaultBinaryMessenger.checkMockMessageHandler.BasicMessageChannel.setMockMessageHandler: Reemplazado porTestDefaultBinaryMessenger.setMockDecodedMessageHandler.MethodChannel.checkMethodCallHandler: Obsoleto.MethodChannel.setMockMethodCallHandler: Reemplazado porTestDefaultBinaryMessenger.setMockMethodCallHandler.MethodChannel.checkMockMethodCallHandler: Reemplazado porTestDefaultBinaryMessenger.checkMockMessageHandler.
Estos reemplazos solo están disponibles para el código que utiliza el
nuevo TestDefaultBinaryMessengerBinding
(como cualquier código que use testWidgets en una prueba de flutter_test).
No existe un reemplazo para el código de producción que utilizaba
estas APIs, ya que no estaban destinadas al uso en código de producción.
Las pruebas que usan checkMessageHandler no tienen equivalente en la
nueva API, ya que el registro del manejador de mensajes se gestiona
directamente por el objeto ChannelBuffers, el cual no
expone el oyente actualmente registrado para un canal.
(Las pruebas que verifican el registro de manejadores parecen ser raras).
El código que necesita migración puede experimentar errores como los siguientes:
error - The method 'setMockMessageHandler' isn't defined for the type 'BinaryMessenger' at test/sensors_test.dart:64:8 - (undefined_method)
error • The method 'setMockMethodCallHandler' isn't defined for the type 'MethodChannel' • test/widgets/editable_text_test.dart:5623:30 • undefined_method
[error] The method 'setMockMessageHandler' isn't defined for the type 'BasicMessageChannel' (test/material/feedback_test.dart:37:36)
Además, el callback onPlatformMessage,
que anteriormente era interceptado por el framework para
recibir mensajes de los complementos, ya no se utiliza
(y se eliminará a su debido tiempo). Como resultado,
llamar a este callback para inyectar mensajes en el
framework ya no tiene ningún efecto.
Guía de migración
#El paquete flutter_test proporciona algunos shims para que
los usos de los métodos obsoletos setMock... y checkMock...
sigan funcionando.
Las pruebas que anteriormente no importaban
package:flutter_test/flutter_test.dart pueden
hacerlo para habilitar estos shims;
esto debería ser suficiente para migrar la mayor parte del código.
Sin embargo, estas APIs de shim están obsoletas. En su lugar,
en el código que utiliza WidgetTester (por ejemplo, usando testWidgets),
se recomienda utilizar los siguientes patrones para
reemplazar las llamadas a esos métodos
(donde tester es la instancia de WidgetTester):
// old code
ServicesBinding.defaultBinaryMessenger.setMockMessageHandler(...);
ServicesBinding.defaultBinaryMessenger.checkMockMessageHandler(...);
// new code
tester.binding.defaultBinaryMessenger.setMockMessageHandler(...);
tester.binding.defaultBinaryMessenger.checkMockMessageHandler(...);
// old code
myChannel.setMockMessageHandler(...);
myChannel.checkMockMessageHandler(...);
// new code
tester.binding.defaultBinaryMessenger.setMockDecodedMessageHandler(myChannel, ...);
tester.binding.defaultBinaryMessenger.checkMockMessageHandler(myChannel, ...);
// old code
myMethodChannel.setMockMethodCallHandler(...);
myMethodChannel.checkMockMethodCallHandler(...);
// new code
tester.binding.defaultBinaryMessenger.setMockMethodCallHandler(myMethodChannel, ...);
tester.binding.defaultBinaryMessenger.checkMockMessageHandler(myMethodChannel, ...);
Las pruebas que usan package:test y test()
se pueden cambiar para usar package:flutter_test y testWidgets()
para obtener acceso a un WidgetTester.
El código que no tiene acceso a un WidgetTester puede hacer referencia a
TestDefaultBinaryMessengerBinding.instance!.defaultBinaryMessenger
en lugar de tester.binding.defaultBinaryMessenger.
Las pruebas que no utilizan la vinculación de widgets de prueba predeterminada
(AutomatedTestWidgetsFlutterBinding,
que se inicializa mediante testWidgets) pueden mezclar el
mixin TestDefaultBinaryMessengerBinding en su
vinculación para obtener los mismos resultados.
Las pruebas que manipulan onPlatformMessage ya no
funcionarán como se diseñaron. Para enviar mensajes simulados al framework,
considera usar ChannelBuffers.push.
No existe un mecanismo para interceptar mensajes de los complementos
y reenviarlos al framework en la nueva API.
Si tu caso de uso requiere dicho mecanismo, por favor presenta un reporte de error.
Timeline
#Introducido en la versión: 2.3.0-17.0.pre.1
En la versión estable: 2.5
Referencias
#Documentación de la API:
PR relevante:
A menos que se indique lo contrario, la documentación de este sitio refleja Flutter 3.44.0. Página actualizada por última vez el 2026-05-05. Ver código fuente oreportar un problema.