Hacktoberfest 2026:メンテナが10月に向けて印を付けた、オープンで初心者向けの issue。 Hacktoberfest の issue を見る

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

オープン
#6,965 コメント 0 件 リアクション 0 件 担当者 0 名 GitHub で見る

メンテナーはふだん 2 日以内に返信

関連するプルリクエストがすでにマージされています。

  • #6976 @RezaShamsipour による — マージ済み

評価

難易度
3/5
見積もり時間
半日
初心者へのやさしさ
65/100
issue の種類
バグ
明瞭さ
明確に書かれている
活発さ
活発
技術スタック
dart, python
領域
frontend, testing

調査の方向性

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.

索引モデルが issue の本文から書いたものです。

説明

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.

主要言語
Python
スター
17.4k
フォーク
728
平均マージ
1日 9時間
マージ済み PR(30日)
58

環境構築

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

flet-dev/flet のほかの issue

flet-dev/flet の issue をすべて見る

似ている issue

Python の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。