簡體   English   中英

go_router v5.0重定向方法中無法訪問BLoC,BLoC未注入上下文

[英]Unable to access BLoC in go_router v5.0 redirect method, BLoC is not injected in the context

我正在使用flutter_blocgo_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.

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