[英]Where the best place to manage pages?
Flutter Docs 案例中記錄的頁面導航非常簡單:
SomeButton(
...
onPressed:()=>Navigator.push(...),
...
)
在更現實的情況下,應用程序必須在推送某些頁面之前做一些工作。 例如,身份驗證檢查。 所以,真正的 onPresses 回調應該是這樣的:
SomeButton(
...
onPressed:()=>signIn(),
...
)
...
//somewhere
void signIn() async{
final bool isAuthed = await _auth.checkAuth(...);
if (isAuthed){
Navigator.pushNamed(context, homePageName);
} else {
//for FutureBuilder.hasError
throw NotAuthedException();
}
}
在這個地方, UseCases
和View
(widgets) 職責被合並了。 checkAuth
絕對是UseCases
的責任。 但是推頁面...
一方面, Navigator
需要context
。 BuildContext
絕對是View
的責任。 它不應該在UseCases
中占有一席之地。 但是頁面導航到應用程序絕對是UseCases
的責任。
如何明確分擔責任?
我認為回調checkAuth
應該從關閉中獲取BuildContext
:
onPressed: ()=> context.watch<...>().signIn(context);
並且在UseCases
(通過ViewModel
)上下文中將使用如下:
class UseCases {
...
Future<void> signIn(BuildContext context) async{
try{
final bool isAuthed = await _auth.checkAuth(...);
if (isAuthed){
Navigator.pushNamed(context, homePageName);
} else {
throw NotAuthedException(); //for some FutureBuilder.hasError
}
} catch(e,s){
ExceptionHandler.handle(e,s); //for app logic
rethrow; //for some FutureBuilder.hasError. i.e view building
}
}
...
}
因此, context
不是用UseCases
。 它只存在於signIn
中。
這是一個好的決定嗎?
有沒有更干凈的決定?
我遵循的模式是有一個處理邏輯的塊,在您的示例中,這將是 Auth 檢查。 if (isAuthed)
通過,在該集團中,我會發出一個新的 state,比如一個名為 Authed 的 state。
在視圖中,您可以有一個 BlocListener 觸發 state 更改為 Authed 並在那里進行路由或顯示 Snackbar 或類似內容。
這樣您就不必將視圖操作與真正不需要視圖信息的邏輯混合在一起。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.