簡體   English   中英

管理頁面的最佳位置在哪里?

[英]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(); 
  }
}

在這個地方, UseCasesView (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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM