あまり複雑にはしたくなかったのですが、どうしても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を使った方が良いかな?