gaaclarke 4226470eb6
[Reland2] Implements UISceneDelegate dynamically w/ FlutterLaunchEngine (#169276)
## **BREAKING CHANGE**

Adopting Apple's UISceneDelegate protocol shifts the initialization
order of apps. For the common cases we've made sure they will work
without change. The one case that will require a change is any app that
in `-[UIApplicateDelegate didFinishLaunchingWithOptions:]` assumes that
`UIApplicationDelegate.window.rootViewController` is a
`FlutterViewController` instance. This is sometimes done to register
platform channels directly on the `FlutterViewController`. Instead users
should use the `FlutterPluginRegistry` API's to create platform channels
in `-[UIApplicateDelegate didFinishLaunchingWithOptions:]`, like
`FlutterPlugin`s do.

An example can be seen here:

https://github.com/flutter/flutter/pull/168914/files#diff-9f59c5248b58124beca7e290a57646023cda3ca024607092c6c6932606ce16ee

In extreme cases, like bespoke test harnesses, the startup logic can be
moved to `-[FlutterViewController awakeFromNib]` in a
FlutterViewController subclass.

An example can be seen here:

https://github.com/flutter/flutter/pull/169276/files#diff-dbe39c23a0a380447b90b7559a878dae8564616e0875c4ef0d9e99e02b91adac

## Changes since revert
I changed the init in `//dev/integration_tests/external_textures` from
the UIApplicationDelegate to the FlutterViewController's awakeFromNib.
This is a more appropriate place for initialization post-UISceneDelegate
since it avoids the launch engine altogether. I tried avoiding to make
the big change to prove we could do a small change to migrate that
project. I don't think this big refactor is indicative of what users
will experience. There was a timing assumption in the integration test
that required not using the launch engine at all.

## Description
fixes: https://github.com/flutter/flutter/issues/167267

design doc:


https://docs.google.com/document/d/1ZfcQOs-UKRa9jsFG84-MTFeibZTLKCvPQLxF2eskx44/edit?tab=t.0

relands https://github.com/flutter/flutter/pull/168396
relands https://github.com/flutter/flutter/pull/168914

## Pre-launch Checklist

- [x] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [x] I read the [Tree Hygiene] wiki page, which explains my
responsibilities.
- [x] I read and followed the [Flutter Style Guide], including [Features
we expect every widget to implement].
- [x] I signed the [CLA].
- [x] I listed at least one issue that this PR fixes in the description
above.
- [x] I updated/added relevant documentation (doc comments with `///`).
- [x] I added new tests to check the change I am making, or this PR is
[test-exempt].
- [x] I followed the [breaking change policy] and added [Data Driven
Fixes] where supported.
- [x] All existing and new tests are passing.
2025-05-23 00:44:55 +00:00
..
2024-12-19 20:06:21 +00:00

external_textures

Tests external texture rendering between a native1 platform and Flutter.

Part of Flutter's API for plugins includes passing external textures, or textures created outside of Flutter, to Flutter, typically using the Texture widget. This is useful for plugins that render video, or for plugins that interact with the camera.

For example:

Because external textures are created outside of Flutter, there is often subtle translation that needs to happen between the native platform and Flutter, which is hard to observe. These integration tests are designed to help catch these subtle translation issues.

How it works

  • Each lib/*_main.dart file is a Flutter app instrumenting a test case.
  • There is a corresponding test_driver/*_test.dart that runs assertions.

To run the test cases locally, use flutter drive2:

flutter drive lib/frame_rate_main.dart --driver test_driver/frame_rate_test.dart

Tip

On CI, the test cases are run within our device lab.

See devicelab/lib/tasks/integration_tests.dart and search for createExternalUiFrameRateIntegrationTest.

The actual tests are run by task runners:


  1. Only iOS and Android. ↩︎

  2. Unfortunately documentation is quite limited. See #142021. ↩︎