FutureBuilder运行两次

时间:2019-11-01 18:43:14

标签: flutter dart

我从FutureBuilder开始两次遇到问题。 首先,它正确地获取了数据,返回了我的StartScreen,然后几秒钟后,StartScreen重新生成,我注意到FutureBuilder再次启动。

这是我的代码,它很简单,所以我想知道问题可能出在哪里?!?

class MyApp extends StatefulWidget {

  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  FirebaseUser user;

 @override
  void initState() {
    // TODO: implement initState
    super.initState();
    getNewestlocation();
  }

  @override
  void dispose() {
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'APP',
      theme: buildTheme(),

      home: FutureBuilder<FirebaseUser>(future: Provider.of<AuthService>(context).getUser(),
      builder: (context, AsyncSnapshot<FirebaseUser> snapshot) {
    if (snapshot.connectionState == ConnectionState.done) {
    if (snapshot.error != null) {
    print('error');
    return Text(snapshot.error.toString());
    }
    user = snapshot.data;
    print('user here $user');
    return snapshot.hasData ? StartScreen(user) : LoginScreen();
    } else {
    return LoadingCircle();
    }
    },
      ));
  }
}

有人可以帮我吗?

3 个答案:

答案 0 :(得分:0)

我认为您的代码中有一些不好的地方,也许这不是问题,但可以纠正: 第一:不建议您在主文件中执行此操作,您应该有类似启动页面的内容来进行处理。 第二:您应该使用块,而不要在视图(UI)的同一位置上编写逻辑代码

答案 1 :(得分:0)

将来又要激发了,因为您正在与FutureBuilder同时在build方法中创建它。

来自FutureBuilder docs

  

将来一定要早一些,例如在State.initState,State.didUpdateConfig或State.didChangeDependencies中。构造FutureBuilder时,不得在State.build或StatelessWidget.build方法调用期间创建它。如果Future是与FutureBuilder同时创建的,则每次FutureBuilder的父代重建时,异步任务都将重新启动。

因此,要防止其触发,您必须执行以下操作:

    class _MyAppState extends State<MyApp> {
      Future<String> _myString;

      @override
      void initState() {
        super.initState();
        _myString = _fetchString();
      }

      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: FutureBuilder(
            future: _myString,
            builder: (context, snapshot) {
              // build page stuff...
            },
          ),
        );
      }
    }

    Future<String> _fetchString() async {
      print('running future function');
      await Future.delayed(Duration(seconds: 3));
      return 'potatoes';
    }

请注意,要访问initState()中的提供程序,您必须将listen设置为false,如this答案中所述。

答案 2 :(得分:0)

如果您使用的是android studio,请尝试从终端运行,以解决此问题。运行按钮附加了调试服务,然后强制重新构建整个应用程序