未来结束时移至新屏幕的最佳方法

时间:2019-06-29 14:40:51

标签: flutter dart

我有一个启动屏幕,可以从api获取数据。我希望在获取数据时该屏幕处于活动状态(它包含一个进度进度小部件),但是一旦获取数据,我就必须推送一条新的路径才能转到下一个屏幕。

我一直在与futurebuilder玩耍,但这似乎不是正确的小部件,因为在获取数据时我不想构建任何东西(至少在此屏幕中如此)。我只想将其保留为全局状态数据并继续前进。

在颤抖中完成此操作的最佳方法是什么?

这就是我现在拥有的:

class SplashScreen extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text("Guid Template test"),
        ),
        body: Container(
          child: Center(
              child: FutureBuilder(
                future: getMenuConfiguration(),
                builder: (builderContext, snapShot) {
                  //Here I would like to move to next screen, but this seems off because this is a builder method. Doesn't seem best option just a hack.
                  return Container();
                },

              )
          ),
        ));
  }

  Future<String> getMenuConfiguration() async
  {
    String url = "https://...";
    http.Response response = await http.get(url);

    if (response.statusCode == 200) {
      var m = json.decode(response.body);
      MenuModel.fromJson(m);
    }
    else {
      throw Exception('Failed to load post');
    }
  }

}

2 个答案:

答案 0 :(得分:1)

尝试一下

首先将您的课程设为 StateFulWidget

@override
void initState() {
  onStart();
}

void onStart() async {
  await getMenuConfiguration();  //load your data here
  Navigator.push();  //push to next screen
}

答案 1 :(得分:1)

事实上,为简单起见,您只需要使用一个有状态的小部件[futurebuilder这是一个有状态的小部件]。

我有一个看起来像这样的加载屏幕

class LoadingScreen extends StatefulWidget {
  @override
  _LoadingScreenState createState() => _LoadingScreenState();
}

class _LoadingScreenState extends State<LoadingScreen> {
   @override
  void initState() {
    super.initState();
    Future.delayed(Duration.zero, () {
      checkCredentials(context);


  }

  checkCredentials(context) async {
  var test = await yourFunction();
  Navigator.of(context).pushReplacementNamed('/Page.Tabs');
  }
  @override
  Widget build(BuildContext context) {
    return SizedBox();
  }
}

我使用Future.delayed(Duration.zero,因为由于某些原因,如果checkCredentials是sync; _;哦,并且initState可以访问上下文:D

,它会崩溃