在FutureBuilder的builder函数内的if / else语句中呈现相同的小部件时遇到问题

时间:2019-06-26 22:22:01

标签: flutter

也许我没有正确理解小部件重建的工作原理,但是例如在这段代码中。因为初始值为false,然后流程进入 else 块并在该块中创建MultiProvider小部件,所以一切正常。然后,在将来完成后,它返回true,因此会使用 if 块,但不会再次重新创建MultiProvider,并且我放置的属性不会反映在嵌套的小部件上,例如我要附加在provider中的Stream参数。另外,我使用断点进行了调试,实际上,该程序未调用someProviderOfStream.streamWithAcceptedPermissions()函数。所以我的问题是这实际上如何工作,以及如何重新创建MultiProvider Object。

return FutureBuilder(
    initialData: false,
    future: someObj.fetchHasPermission(), // true or false
    builder: (context, snapshot) {
      if (!snapshot.hasData) return Text('no data');
      bool hasPermission = snapshot.data;
      if (hasPermission) {
        return MultiProvider(
          providers: [
            StreamProvider<String>(builder: (context) => someProviderOfStream.streamWithAcceptedPermissions()),
            ChangeNotifierProvider<SomeProvider>.value(value: _someProvider),
          ],
          child: SomeWidget()
        );
      } else {
        return MultiProvider(
          providers: [
            StreamProvider<String>(builder: (context) => someProviderOfStream.emptyStream()),
            ChangeNotifierProvider<SomeProvider>.value(value: _someProvider),
          ],
          child: SomeWidget()
        );
      }
    }
  );

我还测试了在 else 块中返回不同的Widget,例如Text()Widget,并且程序可以正常工作。似乎Flutter优化了构建功能,并避免在创建之前重新创建Same-Type Widget,但是我不确定。

return FutureBuilder(
    initialData: false,
    future: someObj.fetchHasPermission(), // true or false
    builder: (context, snapshot) {
      if (!snapshot.hasData) return Text('no data');
      bool hasPermission = snapshot.data;
      if (hasPermission) {
        return MultiProvider(
          providers: [
            StreamProvider<String>(builder: (context) => someProviderOfStream.streamWithAcceptedPermissions()),
            ChangeNotifierProvider<SomeProvider>.value(value: _someProvider),
          ],
          child: SomeWidget()
        );
      } else {
        return Text('has no Permission');
      }
    }
  );

1 个答案:

答案 0 :(得分:0)

我忘记了在小部件上使用键。这样,Flutter知道应该使用在MultiProvider对象上所做的更改来重新创建窗口小部件。感谢rrousselGit记住了小部件的关键属性。