![](/img/trans.png)
[英]Refreshing a view after context.pop() with go_router and bloc
[英]Unable to access BLoC in go_router v5.0 redirect method, BLoC is not injected in the context
我正在使用flutter_bloc
和go_router
。
這是一個多頁表單的實現,對於這個演示,它只有 2 頁。 我使用ShellRoute
為 2 條路線提供MultiFormBloc
,這樣兩條路線都可以訪問同一個MultiFormBloc
實例。
在第 2 步路由中的重定向方法中,我想根據用戶是否完成第 1 步有條件地將用戶重定向回第 1 步(因為用戶有可能直接請求第 2 步頁面而無需完成第 1 步,例如在瀏覽器的搜索欄中輸入/step2
)
但是,似乎MultiFormBloc
沒有注入到重定向方法中提供的BuildContext
中。
如何在重定向方法中訪問注入樹深處的 bloc(不是main.dart
的頂層)? 或者有沒有更好的方法來做這個條件邏輯?
...
ShellRoute(
builder: (context, state, child) {
// Use [ShellRoute] for the sole purpose of providing [MultiFormBloc] to
// 2 routes. So that the 2 routes have access to the same bloc instance.
return BlocProvider(
create: (context) => MultiFormBloc(),
child: child,
);
},
routes: [
GoRoute(
name: 'step1',
path: 'step1',
builder: (context, state) => Step1(),
routes: [
GoRoute(
name: 'step2',
path: 'step2',
builder: (context, state) => Step2(),
redirect: (context, state) {
// If user haven't completed form 1, redirect user to form 1 page.
// Error accessing [MultiFormBloc], bloc not injected in context.
if (context.read<MultiFormBloc>().state.step1Value == null) {
return '/step1';
}
return null;
},
),
],
),
],
),
...
如果您想將相同的塊傳遞給獨立的死記硬背,則必須改為傳遞它的值。 您首先創建您的 bloc final myBloc = MyBloc()
。 然后,將其值傳遞給每個路由。
// When you want to navigate to Step1()
BlocProvider.value(
value: myBloc,
child: Step1(),
)
// When you want to navigate to Step2()
BlocProvider.value(
value: myBloc,
child: Step2(),
)
現在,Step1() 和 Step2() 路由共享同一個 bloc 實例並且可以訪問同一個 state。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.