【问题标题】:initState called multiple times多次调用 initState
【发布时间】:2019-01-23 01:41:49
【问题描述】:

在我的应用中,我有一个登录屏幕和一个主屏幕。从登录导航到主屏幕时,我从 .txt 文件中读取数据并显示 4 个随机数据点。我从我的 initState 中的文件中获取数据,以便在状态更改时不会多次调用它,然后与未来的构建器一起等待它...

class _HomeScreenState extends State<HomeScreen> {
  Future<bool> _future;

  @override
  initState() {
    super.initState();
    print('in initState about to call _getData');
    _future = _getData();
  }

  @override
  Widget build(BuildContext context) {
    var futureBuilder = new FutureBuilder(
      future: _future,
      builder: (BuildContext context, AsyncSnapshot snapshot) {
        switch (snapshot.connectionState) {
          case ConnectionState.none:
          case ConnectionState.active:
          case ConnectionState.waiting:
            return new Center(
              child: new CircularProgressIndicator(),
            );
          case ConnectionState.done:
            if (snapshot.hasError) {
              return new Center(
                child: Text('Error'),
              );
            } else {
              return new ListView(
                children: <Widget>[
                  //my view
                ],
              );
            }
          }
        }
    );
    return MaterialApp(
        home: WillPopScope(
          onWillPop: () async {
            return Navigator.pop(context);
          },
          child: Scaffold(
            body: futureBuilder,
          ),
        )
    );

现在,当我使用返回按钮导航回登录屏幕然后返回主屏幕时,initState 将多次关闭(这可以从我留下的打印语句中看到)。当您在这两个屏幕(弹出主屏幕、推送主屏幕)之间来回切换时,initState 将被调用多次。我很困惑,感谢任何帮助!

编辑:登录和主屏幕的完整代码可以在https://github.com/ViscousOx/Flutter-Stuff找到

【问题讨论】:

  • 你能显示完整的小部件(有状态的类)+它的潜在父级吗?
  • @RémiRousselet 我将两个小部件都上传到了github.com/ViscousOx/Flutter-Stuff的github
  • 你找到答案了吗?我也面临同样的问题,我正在使用provider 包。
  • @RémiRousselet:我正在使用provider 包并遇到相同的情况。

标签: android ios flutter


【解决方案1】:

试试看:行得通 使用带有 ConnectionState.waiting 的默认语句。

class _HomeScreenState extends State<HomeScreen> {
  Future<bool> _future;

  @override
  initState() {
    super.initState();
    print('in initState about to call _getData');
    _future = _getData();
  }

  @override
  Widget build(BuildContext context) {
    var futureBuilder = new FutureBuilder(
      future: _future,
      builder: (BuildContext context, AsyncSnapshot snapshot) {
        switch (snapshot.connectionState) {
          case ConnectionState.waiting:
            return new Center(
              child: new CircularProgressIndicator(),
            );
          default:
            if (snapshot.hasError) {
              return new Center(
                child: Text('Error'),
              );
            } else {
              return new ListView(
                children: <Widget>[
                  //my view
                ],
              );
            }
          }
        }
    );
    return MaterialApp(
        home: WillPopScope(
          onWillPop: () async {
            return Navigator.pop(context);
          },
          child: Scaffold(
            body: futureBuilder,
          ),
        )
    );

【讨论】:

    【解决方案2】:

    可以避免连接等待状态。我用作:

    FutureBuilder(future: _isUserLoggedIn(),
                         builder: (ctx, loginSnapshot) => 
                          loginSnapshot.data == true ?  AppLandingScreen() : SignUpScreen()
                    ),
    

    【讨论】:

      猜你喜欢
      • 2019-08-30
      • 2019-10-02
      • 2021-08-13
      • 2021-06-10
      • 1970-01-01
      • 2021-05-22
      • 2021-10-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多