首页 > 解决方案 > 异步方法返回响应后如何导航不同的页面

问题描述

我有一个屏幕应用程序,其中我有 MaterialApp 的 onGenerateRoute 属性。在路由方法中,我进行了 api 调用,一旦我得到响应,我想让用户导航到登录屏幕

我尝试在 .then() 函数中调用我的小部件登录

class App extends StatelessWidget {
  Widget build(BuildContext context) {
    return AppBlocProvider(
      child: LoginBlocProvider(
        child: MaterialApp(
          onGenerateRoute: routes,
        ),
      ),
    );
  }

  Route routes(RouteSettings settings) {
    print(settings.name);
    switch (settings.name) {
      case '/':
        return MaterialPageRoute(builder: (context) {
          //HERE I AM MAKING API CALL
          final appBloc = AppBlocProvider.of(context);
          appBloc.verifyUser().then((response) {
            //HERE ONCE I GET THE RESPONSE I WANT TO NAVIGATE USER TO 
            //lOGIN ACTIVITY
            print('called');
            return Login();
          });
          return AppBlocProvider(
            child: Center(child: CircularProgressIndicator()),
          );
        });
        break;
      case '/Login':
        return MaterialPageRoute(builder: (BuildContext context) {
          return Login();
        });
        break;
      case '/HomeScreen':
        return MaterialPageRoute(builder: (BuildContext context) {
          return Home();
        });
        break;
    }
    return MaterialPageRoute(builder: (context) {
      print('returned null');
    });
  }

api 调用成功,甚至 .then() 方法执行但登录屏幕没有出现

标签: dartflutter

解决方案


没有做任何事情的原因return Login();是因为已经执行了另一个返回:return AppBlocProvider(child: Widget());

与此示例类似,由于已经进行了退货,因此其他退货不会做任何事情。示例打印“bar”,而“foo”从未使用print(bar());.

void main() {
  print(bar());
}

Future<String> foo() async{
  await Future.delayed(Duration(seconds: 5));
  return 'foo';
}

String bar(){
  String txt = 'bar';
  foo().then((String value){
    print('Future finished: $value');
    // Since print already got a String return,
    // returning this value won't do anything
    return value; // 'foo' won't be printed on main()
  });
  return txt;
}

您可能需要考虑在 Login 中移动导航并在那里显示 CircularProgressIndicator()。


推荐阅读