Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 1a46ad7

Browse files
author
Jonah Williams
authored
[iOS] leak a single overlay layer. (#54189)
Leave at least one overlay layer, to work around cases where scrolling platform views under an app bar continually adds and removes an overlay layer. This logic could be removed if flutter/flutter#150646 is fixed. Fixes flutter/flutter#152266
1 parent 6613428 commit 1a46ad7

File tree

2 files changed

+11
-3
lines changed

2 files changed

+11
-3
lines changed

shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,15 @@ static bool ClipRRectContainsPlatformViewBoundingRect(const SkRRect& clip_rrect,
158158
for (size_t i = available_layer_index_; i < layers_.size(); i++) {
159159
results.push_back(layers_[i]);
160160
}
161-
layers_.erase(layers_.begin() + available_layer_index_, layers_.end());
161+
// Leave at least one overlay layer, to work around cases where scrolling
162+
// platform views under an app bar continually adds and removes an
163+
// overlay layer. This logic could be removed if https://github.com/flutter/flutter/issues/150646
164+
// is fixed.
165+
static constexpr size_t kLeakLayerCount = 1;
166+
size_t erase_offset = std::max(available_layer_index_, kLeakLayerCount);
167+
if (erase_offset < layers_.size()) {
168+
layers_.erase(layers_.begin() + erase_offset, layers_.end());
169+
}
162170
return results;
163171
}
164172

shell/platform/darwin/ios/framework/Source/FlutterPlatformViewsTest.mm

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3335,10 +3335,10 @@ - (void)testLayerPool {
33353335
pool.RecycleLayers();
33363336
XCTAssertEqual(pool.size(), 2u);
33373337

3338-
// Free the unused layers.
3338+
// Free the unused layers. One should remain.
33393339
auto unused_layers = pool.RemoveUnusedLayers();
33403340
XCTAssertEqual(unused_layers.size(), 2u);
3341-
XCTAssertEqual(pool.size(), 0u);
3341+
XCTAssertEqual(pool.size(), 1u);
33423342
}
33433343

33443344
@end

0 commit comments

Comments
 (0)