You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter Blue示例代码报错:List<dynamic>无法赋值给List<Widget>

Flutter Blue示例代码类型错误解决:List无法赋值给List

问题场景

运行Flutter Blue官方示例代码时,出现编译错误:

The argument type 'List' can't be assigned to the parameter type 'List'

涉及两段代码片段:

第一段报错代码

StreamBuilder<List<ScanResult>>(
        stream: FlutterBlue.instance.scanResults,
        initialData: [],
        builder: (c, snapshot) => Column(
          children: snapshot.data!
              .map(
                (r) => ScanResultTile(
                  result: r,
                  onTap: () => Navigator.of(context)
                      .push(MaterialPageRoute(builder: (context) {
                    r.device.connect();
                    return DeviceScreen(device: r.device);
                  })),
                ),
              )
              .toList(),
        ),
      )

第二段报错代码

List<Widget> _buildServiceTiles(List<BluetoothService> services) {
    return services
        .map(
          (s) => ServiceTile(
            service: s,
            characteristicTiles: s.characteristics
                .map(
                  (c) => CharacteristicTile(
                    characteristic: c,
                    onReadPressed: () => c.read(),
                    onWritePressed: () async {
                      await c.write(_getRandomBytes(), withoutResponse: true);
                      await c.read();
                    },
                    onNotificationPressed: () async {
                      await c.setNotifyValue(!c.isNotifying);
                      await c.read();
                    },
                    descriptorTiles: c.descriptors
                        .map(
                          (d) => DescriptorTile(
                            descriptor: d,
                            onReadPressed: () => d.read(),
                            onWritePressed: () => d.write(_getRandomBytes()),
                          ),
                        )
                        .toList(),
                  ),
                )
                .toList(),
          ),
        )
        .toList();
  }

错误原因

Dart中,map()方法未显式指定返回类型时,默认返回Iterable<dynamic>,调用toList()后得到的是List<dynamic>。而Flutter组件的children、characteristicTiles等属性要求传入List<Widget>类型,类型不匹配导致编译报错。

解决方法

在所有嵌套的map()操作中显式指定返回Widget类型,或者对生成的列表进行类型转换。

第一段代码修改方案

在map()后添加<Widget>指定类型:

StreamBuilder<List<ScanResult>>(
  stream: FlutterBlue.instance.scanResults,
  initialData: [],
  builder: (c, snapshot) => Column(
    children: snapshot.data!
        .map<Widget>(
          (r) => ScanResultTile(
            result: r,
            onTap: () => Navigator.of(context).push(MaterialPageRoute(builder: (context) {
              r.device.connect();
              return DeviceScreen(device: r.device);
            })),
          ),
        )
        .toList(),
  ),
)

也可以用cast<Widget>()转换列表类型:

children: snapshot.data!
    .map((r) => ScanResultTile(...))
    .toList()
    .cast<Widget>(),

第二段代码修改方案

在每一层嵌套的map()中都指定<Widget>类型:

List<Widget> _buildServiceTiles(List<BluetoothService> services) {
  return services
      .map<Widget>(
        (s) => ServiceTile(
          service: s,
          characteristicTiles: s.characteristics
              .map<Widget>(
                (c) => CharacteristicTile(
                  characteristic: c,
                  onReadPressed: () => c.read(),
                  onWritePressed: () async {
                    await c.write(_getRandomBytes(), withoutResponse: true);
                    await c.read();
                  },
                  onNotificationPressed: () async {
                    await c.setNotifyValue(!c.isNotifying);
                    await c.read();
                  },
                  descriptorTiles: c.descriptors
                      .map<Widget>(
                        (d) => DescriptorTile(
                          descriptor: d,
                          onReadPressed: () => d.read(),
                          onWritePressed: () => d.write(_getRandomBytes()),
                        ),
                      )
                      .toList(),
                ),
              )
              .toList(),
        ),
      )
      .toList();
}

这样修改后,map()会明确返回Iterable<Widget>,toList()生成的就是符合要求的List<Widget>,编译错误即可解决。

内容的提问来源于stack exchange,提问作者Mussab Mehboob

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 00:45:53