簡體   English   中英

Flutter Bloc , Bloc state ,導航?

[英]Flutter Bloc , Bloc state , navigate?

我現在面臨的是在我按照其中一個教程實施 bloc 之后,我現在被困在那里,在我得到響應並且狀態改變后,我想導航到另一個小部件

@override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text(APP_TITLE),
        ),
        body: buildBody(context));
  }
}

BlocProvider<SignInBloc> buildBody(BuildContext context) {

  return BlocProvider(
    create: (_) => sl<SignInBloc>(),
    child: Center(
      child: Padding(
        padding: const EdgeInsets.all(16),
        child: Column(
          children: <Widget>[
            BlocBuilder<SignInBloc, SignInState>(
                builder: (context, state) {
                  if(state is Empty)
                    return MessageDisplay(message: 'Sign In please.',);
                  else if(state is Loaded)
                    return HomePage();
                  else
                    return MessageDisplay(message: 'Sign In please.',);
                }
            ),
            SignInControls(),
          ],
        ),
      ),
    ),
  );
}

在加載狀態下,我想導航到另一個小部件。 那么如何實現這一目標,最好的方法是什么?

在構建小部件時,您不能使用導航器或更改狀態(您的情況)。 有兩種方式

1.老式的方式

WidgetsBinding.instance.addPostFrameCallback((_){
  // Your code goes here
});

2. 由於您已經實現了 BLOC 庫,因此您可以通過使用BlocListener以更優雅的方式實現這一點 您可以在文檔中了解更多信息

希望我有所幫助!

導航可以像繼承的小部件一樣使用:

Navigator nav = Navigator.of(this.context);

那么你可以使用類似的東西:

nav.push(MaterialPageRoute(builder: (context) => YourSecondPage()))

在flutter中,您不能直接移動到某個頁面。 你應該使用路線。

我認為使用命名路由的最干凈方法。 這是一個例子:

// here you put a class of names to use later in all of your project.
class RouteNames{
    static String homepage = "/";
    static String otherPage= "/otherpage";
}
// in your main file , MyApp class
var routes = {
    RouteNames.homepage: (context)=> new MyHomePage(),
    RouteNames.otherPage: (context)=> new MyOtherPage()
};
// then use routes variable in your MaterialApp constructor 


// and later on in your project you can use this syntax: 
Navigator.of(context).pushNamed(RouteNames.otherPage);

我認為這種方式很干凈而且是集中的,如果你想向路由發送參數是很好的。

詳細了解導航:導航官方文檔很不錯

關於 Bloc 構建器和偵聽器的說明:

由於 BlocBuilder 將被多次調用。 它應該只包含小部件和小部件。 如果將導航代碼放入其中,則此代碼將被多次調用。

正如 Ayham Orfali 所說,您絕對應該為此使用 BlocListener。 在它里面你可以聽到狀態的變化。 這是一個例子

// some code
children: <Widget>[
            BlocListener(
                 bloc: BlocProvider.of<SignInBloc>(context),
                 listener: (context, state) {
                     if(state is Loaded){
                          Navigator.of(context).pushNamed("some other page");
                     }
                       // else do nothing!
                 }, 
                 child:// just bloc builder which contains widgets only.  ,
            SignInControls(),
          ]

// some other code

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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