Hacktoberfest 2026: le issue che i maintainer hanno segnato per ottobre, aperte e adatte ai principianti. Sfoglia le issue Hacktoberfest

bug: find_by_key() does not find Tab or PopupMenuItem controls by key

Aperta
#6,965 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 2 giorni

@RezaShamsipour ci sta già lavorando.

Dal 15/10/2026.

  • #6976 di @RezaShamsipour — aperta

Valutazione

Difficoltà
3/5
Tempo stimato
Mezza giornata
Idoneità per principianti
65/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Attiva
Stack tecnologico
dart, python
Ambito
frontend, testing

Direzione di ricerca

Start with TabControl._keyFromControl in controls/tabs.dart and buildPopupMenuEntries in utils/popup_menu.dart; the typed-key logic in control_widget.dart shows the pattern to reuse. Reproduce with the tests/test_keys.py sample via flet test linux --verbose. Done when find_by_key returns a count of 1 for tab-second and menu-item, and the existing button lookup still passes.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

bug
Duplicate Check
Describe the bug

In integration tests, Tester.find_by_key() returns no match for a key set on ft.Tab or ft.PopupMenuItem. Keys set on other controls, for example ft.Button, are found as expected.

Code sample
Code
# src/main.py
import flet as ft


def main(page: ft.Page):
    page.add(
        ft.Tabs(
            length=2,
            content=ft.TabBar(
                tabs=[
                    ft.Tab(label="First", key="tab-first"),
                    ft.Tab(label="Second", key="tab-second"),
                ]
            ),
        ),
        ft.PopupMenuButton(
            key="menu",
            items=[ft.PopupMenuItem(content="Item", key="menu-item")],
        ),
        ft.Button("Button", key="button"),
    )


ft.run(main)


# tests/test_keys.py
import flet.testing as ftt


async def test_tab_key(flet_app: ftt.FletTestApp):
    tester = flet_app.tester
    await tester.pump_and_settle()
    assert (await tester.find_by_key("button")).count == 1  # passes
    assert (await tester.find_by_key("tab-second")).count == 1  # fails: 0


async def test_popup_menu_item_key(flet_app: ftt.FletTestApp):
    tester = flet_app.tester
    await tester.pump_and_settle()
    await tester.tap(await tester.find_by_key("menu"))
    await tester.pump_and_settle()
    assert (await tester.find_by_key("menu-item")).count == 1  # fails: 0
To reproduce
  1. Create a project with src/main.py and tests/test_keys.py from the code sample.
  2. Run flet test linux --verbose.
  3. In test_tab_key, the button key is found, but find_by_key("tab-second") returns a count of 0.
  4. In test_popup_menu_item_key, after opening the menu, find_by_key("menu-item") returns a count of 0.
Expected behavior

find_by_key() finds Tab and PopupMenuItem controls by their key, the same way it finds other controls.

Screenshots / Videos
Captures

[Upload media here]

Operating System

Linux

Operating system details

Ubuntu 24.04 on WSL2

Flet version

1.0.4

Regression

I'm not sure / I don't know

Suggestions

controls/tabs.dart: TabControl._keyFromControl returns ValueKey(controlKey.value). Because controlKey.value is typed as Object, this creates a ValueKey<Object>, which is not equal to the ValueKey<String> used by find_by_key(). ControlWidget already handles this by creating a typed key (see the comment in control_widget.dart), but TabControl does not use that logic.

utils/popup_menu.dart: buildPopupMenuEntries does not pass the item's key to the Flutter PopupMenuItem or CheckedPopupMenuItem.

Reusing the typed-key logic from ControlWidget in both places should fix this. This is still the case on the main branch.

Logs
Logs
=================================== FAILURES ===================================
_________________________________ test_tab_key _________________________________

flet_app = <flet.testing.flet_test_app.FletTestApp object at 0x7f575f1ad400>

    async def test_tab_key(flet_app: ftt.FletTestApp):
        tester = flet_app.tester
        await tester.pump_and_settle()
        assert (await tester.find_by_key("button")).count == 1  # passes
>       assert (await tester.find_by_key("tab-second")).count == 1  # fails: 0
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
E       assert 0 == 1
E        +  where 0 = Finder(id=1, count=0, index=0).count

tests/test_keys.py:8: AssertionError
___________________________ test_popup_menu_item_key ___________________________

flet_app = <flet.testing.flet_test_app.FletTestApp object at 0x7f575f1b5a90>

    async def test_popup_menu_item_key(flet_app: ftt.FletTestApp):
        tester = flet_app.tester
        await tester.pump_and_settle()
        await tester.tap(await tester.find_by_key("menu"))
        await tester.pump_and_settle()
>       assert (await tester.find_by_key("menu-item")).count == 1  # fails: 0
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
E       assert 0 == 1
E        +  where 0 = Finder(id=1, count=0, index=0).count

tests/test_keys.py:16: AssertionError
=========================== short test summary info ============================
FAILED tests/test_keys.py::test_tab_key - assert 0 == 1
FAILED tests/test_keys.py::test_popup_menu_item_key - assert 0 == 1
========================= 2 failed in 73.11s (0:01:13) =========================
Additional details

Workaround: set the key on a Text control used as the label or content, for example ft.Tab(label=ft.Text("Second", key="tab-second")) or ft.PopupMenuItem(content=ft.Text("Item", key="menu-item")). find_by_key() then finds the control and tapping it works.

Unrelated side note: Python 3.15.0 was released on October 9, 2026, but flet build and flet test in Flet 1.0.4 only support Python 3.12 to 3.14 (python-build release 20260921). Projects with requires-python >= 3.15 cannot be built or tested yet. Support for 3.15 would be appreciated.

Lingua principale
Python
Stelle
17.4k
Fork
728
Merge medio
1g 11h
PR unite (30g)
56

Preparare l'ambiente

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di flet-dev/flet

Tutte le issue di flet-dev/flet

Issue simili

Altre issue su Python

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.