C#ATIA

↑タイトル詐欺 主にFusion360API 偶にCATIA V5 VBA(絶賛ネタ切れ中)

ルーティングを行いたい1

あまり複雑にはしたくなかったのですが、どうしても1画面では
無理そうなため、ルーティングを行う事にします。

幸い以前にルーティングのサンプルを読んでいたので、こちらを
お借りしました。
Fletを試す(3) - 画面遷移(ルーティング)の調査 - Qiita

理解が出来ないので、サンプル(パターン2の方)を試すとこの様な
動作でした。(gifアニメを良くいていなかった・・・)

・view1が表示されテキストフィールドは"view1"が入力済み。
 ここを変更し、ボタンでview2へ移動。
・view2はそのままで、再度ボタンでview1へ移動。
・view1のテキストフィールドが初期値に戻っている。
ちょっと望んでいる動作ではありませんでした。
(AppBarの矢印で戻ると変更したテキストフィールドは維持されます)


公式サイトのこちらにルーティングのサンプルが有りました。
Navigation and routing | Flet
こちらはテキストフィールドが無い為、元のviewを維持している
ものかどうかの確認が出来なかった為、テキストフィールドを
追加し試したところ、こちらも変更は維持されませんでした・・・。


無い知恵絞ってroute_changeイベントハンドラーを見ると、両方共
毎回新規にviewを作成させて表示しています。

単に該当するviewを変数に突っ込み、表示を切り替えれば良いのでは?
と思い付いたのがこちらです。

# python using-flet
import flet as ft

def main(page: ft.Page):

    view1: ft.View = ft.View(
        "/view1",
         [
            ft.AppBar(title=ft.Text("view1"),
                      bgcolor=ft.colors.BLUE),
            ft.TextField(value="view1"),
            ft.ElevatedButton(
                "Go to view2", on_click=lambda _: page.go("/view2")),
        ]
    )

    view2: ft.View = ft.View(
        "/view2", 
        [
            ft.AppBar(title=ft.Text("view2"),
                      bgcolor=ft.colors.RED),
            ft.TextField(value="view2"),
            ft.ElevatedButton(
                "Go to view1", on_click=lambda _: page.go("/view1")),
        ]
    )

    def route_change(handler):
        page.views.clear()
        page.views.append(view1)
        if page.route == "/view2":
            page.views.append(view2)
        page.update()

    def view_pop(handler):
        page.views.pop()
        page.go("/back")


    page.on_route_change = route_change
    page.on_view_pop = view_pop

    page.title = "Navigation and routing"
    page.views.clear()
    page.go("/view1")


if __name__ == "__main__":
    ft.app(target=main)

ボタンで切り替えてもテキストフィールドの変更は維持されました。
"たったそれだけの事じゃん" とは後で思います・・・。

公式のサンプルの様にpage.routeを使った方が良いかな?