Skip to content

Commit 518dcb5

Browse files
committed
router updates for video2
1 parent 16a340b commit 518dcb5

File tree

11 files changed

+170
-52
lines changed

11 files changed

+170
-52
lines changed

README.md

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,11 @@
11
# Flet Routing Tutorial
2-
A video on how to use Flet's routing system
2+
3+
A video on how I use Flet's routing system
4+
5+
## Main Branch
6+
7+
This shows the current example which is up to date with the tutorial explaining how to persist data accross views [coming soon](https://youtube.com/@codingjq)
8+
9+
## Video1 Branch
10+
11+
This branch shows the code after the first video [Routing in Flet with Python in 3 Min](https://www.youtube.com/watch?v=tvysK9zWbIM)

State.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
class GlobalState:
2+
def __init__(self):
3+
self._state = dict()
4+
5+
def register_state(self, state):
6+
self._state[state.get_key()] = state
7+
8+
def get_state_by_key(self, key: str):
9+
return self._state.get(key)
10+
11+
global_state = GlobalState()
12+
13+
class State:
14+
def __init__(self, key: str, value=None):
15+
self._global_state = global_state
16+
self._key = key
17+
self._value = value
18+
self.register_with_global()
19+
20+
def register_with_global(self):
21+
self._global_state.register_state(self)
22+
23+
def get_key(self):
24+
return self._key
25+
26+
def get_state(self):
27+
return self._value

main.py

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,15 @@
11
import flet as ft
2-
3-
from views.FletRouter import Router
2+
from views.routes import router
43
from user_controls.app_bar import NavBar
54

65
def main(page: ft.Page):
76

87
page.theme_mode = "dark"
9-
108
page.appbar = NavBar(page)
11-
myRouter = Router(page)
12-
13-
page.on_route_change = myRouter.route_change
14-
9+
page.on_route_change = router.route_change
1510
page.add(
16-
myRouter.body
11+
router.body
1712
)
18-
1913
page.go('/')
2014

21-
2215
ft.app(target=main, assets_dir="assets")

requirements.txt

1.34 KB
Binary file not shown.

views/FletRouter.py

Lines changed: 0 additions & 25 deletions
This file was deleted.

views/Router.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
from typing import Callable, Any
2+
import flet as ft
3+
from enum import Enum
4+
5+
class DataStrategyEnum(Enum):
6+
QUERY = 0
7+
ROUTER_DATA = 1
8+
CLIENT_STORAGE = 2
9+
STATE = 3
10+
11+
class Router:
12+
def __init__(self, data_strategy=DataStrategyEnum.QUERY):
13+
self.data_strategy = data_strategy
14+
self.data = dict()
15+
self.routes = {}
16+
self.body = ft.Container()
17+
18+
def set_route(self, stub: str, view: Callable[[ft.Page, Any], ft.Control]):
19+
self.routes[stub] = view
20+
21+
def set_routes(self, route_dictionary: dict):
22+
"""Sets multiple routes at once. Ex: {"/": IndexView }"""
23+
self.routes.update(route_dictionary)
24+
25+
def route_change(self, route):
26+
_page = route.route.split("?")[0]
27+
queries = route.route.split("?")[1:]
28+
29+
for item in queries:
30+
key = item.split("=")[0]
31+
value = item.split("=")[1]
32+
self.data[key] = value
33+
34+
self.body.content = self.routes[_page](self)
35+
self.body.update()
36+
37+
def get_query(self, key):
38+
return self.data.get(key)
39+

views/data_view.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
from typing import Union
2+
import flet as ft
3+
from views.Router import Router, DataStrategyEnum
4+
from State import global_state
5+
6+
def DataView(router_data: Union[Router, str, None] = None):
7+
text = ft.Text("")
8+
9+
if router_data and router_data.data_strategy == DataStrategyEnum.QUERY:
10+
text = ft.Text("Query Data: " + router_data.get_query("data"))
11+
elif router_data and router_data.data_strategy == DataStrategyEnum.ROUTER_DATA:
12+
text = ft.Text("Router Data: " + router_data.data.get("data"))
13+
elif router_data and router_data.data_strategy == DataStrategyEnum.CLIENT_STORAGE:
14+
text = ft.Text("Client Storage: " + ft.Page().client_storage.get("data"))
15+
elif router_data and router_data.data_strategy == DataStrategyEnum.STATE:
16+
text = ft.Text("State: " + global_state.get_state_by_key("data").get_state())
17+
18+
content = ft.Column(
19+
[
20+
ft.Row(
21+
[
22+
ft.Text(
23+
"Data View",
24+
size=50),
25+
],
26+
alignment=ft.MainAxisAlignment.CENTER
27+
),
28+
ft.Row(
29+
[
30+
text,
31+
],
32+
alignment=ft.MainAxisAlignment.CENTER
33+
)
34+
]
35+
)
36+
return content
37+

views/index_view.py

Lines changed: 36 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,50 @@
1-
1+
from typing import Union
22
import flet as ft
3+
from views.Router import Router, DataStrategyEnum
4+
from State import global_state, State
35

4-
def IndexView(page):
5-
6+
def IndexView(router_data: Union[Router, str, None] = None):
7+
8+
def send_data(e: ft.ControlEvent):
9+
if text_field.value == "":
10+
return
11+
if router_data and router_data.data_strategy == DataStrategyEnum.QUERY:
12+
e.page.go("/data", data=text_field.value)
13+
elif router_data and router_data.data_strategy == DataStrategyEnum.ROUTER_DATA:
14+
router_data.data["data"] = "router_data: " + text_field.value
15+
e.page.go("/data", data=text_field.value)
16+
elif router_data and router_data.data_strategy == DataStrategyEnum.CLIENT_STORAGE:
17+
e.page.client_storage.set("data", "client_storage :" + text_field.value)
18+
e.page.go("/data")
19+
elif router_data and router_data.data_strategy == DataStrategyEnum.STATE:
20+
state = State("data", text_field.value)
21+
e.page.go("/data")
22+
else:
23+
e.page.go("/data")
24+
25+
text_field = ft.TextField()
26+
send_button = ft.ElevatedButton("Send")
27+
send_button.on_click = send_data
628
content = ft.Column(
7-
829
[
930
ft.Row(
1031
[
1132
ft.Text(
1233
"Welcome to my Flet Router Tutorial",
13-
size=50)
34+
size=50),
1435
],
1536
alignment=ft.MainAxisAlignment.CENTER
16-
)
37+
),
38+
ft.Row(
39+
[
40+
text_field,
41+
send_button
42+
],
43+
alignment=ft.MainAxisAlignment.CENTER
44+
)
1745
]
18-
19-
)
20-
21-
22-
23-
24-
25-
46+
)
2647

2748
return content
2849

50+

views/profile_view.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11

22
import flet as ft
33

4-
def ProfileView(page):
4+
def ProfileView(*args):
55

66
content = ft.Column(
77

views/routes.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
from views.Router import Router
2+
from views.index_view import IndexView
3+
from views.profile_view import ProfileView
4+
from views.settings_view import SettingsView
5+
from views.data_view import DataView
6+
7+
router = Router()
8+
9+
router.routes = {
10+
"/": IndexView,
11+
"/profile": ProfileView,
12+
"/settings": SettingsView,
13+
"/data": DataView
14+
}

0 commit comments

Comments
 (0)