Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

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

Abierto
#6,965 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 2 días

Ya se ha fusionado un pull request relacionado.

  • #6976 de @RezaShamsipour — fusionado

Evaluación

Dificultad
3/5
Tiempo estimado
Medio día
Aptitud para principiantes
65/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Activo
Stack tecnológico
dart, python
Área
frontend, testing

Línea de trabajo

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.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

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.

Lenguaje dominante
Python
Estrellas
17.4k
Forks
728
Merge medio
1 d 9 h
PR fusionados (30 d)
58

Preparar el entorno

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de flet-dev/flet

Todos los issues de flet-dev/flet

Issues similares

Más issues de Python

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.