• LongCatIsLooong's avatar
    Make `TextSpan` hit testing precise. (#139717) · ea5b9728
    LongCatIsLooong authored
    Fixes https://github.com/flutter/flutter/issues/131435, #104594, #43400
    Needs https://github.com/flutter/engine/pull/48774 (to fix the web test failure).
    
    Currently the method we use for text span hit testing `TextPainter.getPositionForOffset` always returns the closest `TextPosition`, even when the given offset is far away from the text. 
    
    The new TextPaintes method tells you the layout bounds (`width =  letterspacing / 2 + x_advance + letterspacing / 2`, `height = font ascent + font descent`) of a character, the PR changes the hit testing implementation such that a TextSpan is only considered hit if the point-down event landed in one of it's character's layout bounds.
    
    Potential issues:
    
    1. In theory since the text is baseline aligned, we should use the max ascent and max descent of each character to calculate the height of the text span's hit-test region, in case some characters in the span have to fall back to a different font, but that will be slower and it typically doesn't make a huge difference. 
    
    This is a breaking change. It also introduces a new finder and a new method `WidgetTester.tapOnText`: `await tester.tapOnText('string to match')` for ease of migration.
    ea5b9728
Name
Last commit
Last update
..
_binding_io.dart Loading commit data...
_binding_web.dart Loading commit data...
_goldens_io.dart Loading commit data...
_goldens_web.dart Loading commit data...
_matchers_io.dart Loading commit data...
_matchers_web.dart Loading commit data...
accessibility.dart Loading commit data...
animation_sheet.dart Loading commit data...
binding.dart Loading commit data...
controller.dart Loading commit data...
deprecated.dart Loading commit data...
event_simulation.dart Loading commit data...
finders.dart Loading commit data...
frame_timing_summarizer.dart Loading commit data...
goldens.dart Loading commit data...
image.dart Loading commit data...
matchers.dart Loading commit data...
mock_canvas.dart Loading commit data...
mock_event_channel.dart Loading commit data...
nonconst.dart Loading commit data...
platform.dart Loading commit data...
recording_canvas.dart Loading commit data...
restoration.dart Loading commit data...
stack_manipulation.dart Loading commit data...
test_async_utils.dart Loading commit data...
test_compat.dart Loading commit data...
test_default_binary_messenger.dart Loading commit data...
test_exception_reporter.dart Loading commit data...
test_pointer.dart Loading commit data...
test_text_input.dart Loading commit data...
test_text_input_key_handler.dart Loading commit data...
test_vsync.dart Loading commit data...
tree_traversal.dart Loading commit data...
widget_tester.dart Loading commit data...
window.dart Loading commit data...