flutter 无法将元素类型“Set〈FutureBuilder〈List< CameraDescription>>>”分配给列表类型“Widget”

ryhaxcpt  于 2023-03-13  发布在  Flutter
关注(0)|答案(3)|浏览(119)

当我尝试从Widget build函数返回以下内容时:

FutureBuilder(
        future: _future,
        builder: (context, snapshot){
          return Stack(
            children: [
              if (_isPermissionGranted){

                FutureBuilder<List<CameraDescription>>(
                  future: availableCameras(),
                  builder: (context, snapshot) {
                    if (snapshot.hasData) {
                      _initCameraController(snapshot.data!);
                      return Center(child: CameraPreview(_cameraController!));
                    } else {
                      return const LinearProgressIndicator();
                    }
                  },
                ),
              }
            ],
          );
        }
    );

显示以下错误:The element type 'Set<FutureBuilder<List<CameraDescription>>>' can't be assigned to the list type 'Widget'.
但是当我去掉条件if (_isPermissionGranted)后面的花括号时,错误就消失了。欢迎分享为什么会发生这种情况。

cqoc49vn

cqoc49vn1#

用花括号括起来是初始化Set的方式,这就是原因。这里使用的if不是普通的if,而是所谓的“集合if”,它总是不带花括号使用,并将花括号后面的内容视为单个对象。你可以在这里阅读更多关于这个“集合if”的信息:https://dart.dev/guides/language/language-tour#lists

w8f9ii69

w8f9ii692#

请尝试以下代码:

FutureBuilder(
  future: _future,
  builder: (context, snapshot) {
    return Stack(
      children: [
        if (_isPermissionGranted)
          FutureBuilder<List<CameraDescription>>(
            future: availableCameras(),
            builder: (context, snapshot) {
              if (snapshot.hasData) {
                _initCameraController(snapshot.data!);
                return Center(child: CameraPreview(_cameraController!));
              } else {
                return const LinearProgressIndicator();
              }
            },
          ),
      ],
    );
  },
);
pvcm50d1

pvcm50d13#

通过删除FutureBuilder小部件周围的花括号,您将返回单个小部件而不是一组小部件,这就是错误消失的原因。
要修复错误并保留花括号,只需通过调用Set:上的toList()方法将小部件集合转换为小部件列表即可。

return Stack(
  children: [
    if (_isPermissionGranted)
      {
        FutureBuilder<List<CameraDescription>>(
          future: availableCameras(),
          builder: (context, snapshot) {
            if (snapshot.hasData) {
              _initCameraController(snapshot.data!);
              return Center(child: CameraPreview(_cameraController!));
            } else {
              return const LinearProgressIndicator();
            }
          },
        ),
      }
  ].toList(),
);

相关问题