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

Flutter中给final变量传参及const构造器、实例成员访问报错如何处理

错误原因

  • 实例成员访问报错:Dart类的字段初始化阶段早于构造器执行阶段,你在初始化uppersection字段时,device实例成员还未完成初始化,无法被访问。
  • const构造器报错:const构造器要求类的所有字段都必须是编译时常量,你初始化的uppersection是运行时生成的容器实例,不属于常量,同时device是外部传入的动态实例,也不满足const构造器的要求。

修正方案

把uppersection的定义从类字段转移到build方法内,同时移除构造器的const关键字即可,修正后的代码如下:

import 'package:flutter/material.dart';
// 按需引入你实际使用的蓝牙库
import 'package:flutter_blue_plus/flutter_blue_plus.dart';

class DeviceData extends StatelessWidget {
  // 移除const关键字,因为device是动态传入的实例,无法满足常量要求
  DeviceData({Key? key, required this.device}) : super(key: key);
  final BluetoothDevice device;

  @override
  Widget build(BuildContext context) {
    // 将uppersection移到build方法内定义,此时device已经完成初始化,可以正常访问
    final uppersection = Container(
      child: Row(
        children: <Widget>[
          StreamBuilder<BluetoothDeviceState>(
            stream: device.state,
            initialData: BluetoothDeviceState.connecting,
            builder: (c, snapshot) => ListTile(
              leading: (snapshot.data == BluetoothDeviceState.connected)
                  ? const Icon(Icons.bluetooth_connected)
                  : const Icon(Icons.bluetooth_disabled),
              title: Text('Device is ${snapshot.data.toString().split('.')[0]}.'),
              subtitle: Text('${device.id}'),
              trailing: StreamBuilder<bool>(
                // 流用于根据服务发现状态切换显示刷新按钮/加载进度
                stream: device.isDiscoveringServices,
                initialData: false,
                builder: (c, snapshot) => IndexedStack(
                  // 原代码索引固定为0无法切换,此处按需求修正为动态索引
                  index: snapshot.data ? 1 : 0,
                  children: <Widget>[
                    IconButton(
                      icon: const Icon(Icons.refresh),
                      onPressed: () => device.discoverServices(),
                    ),
                    IconButton(
                      icon: SizedBox(
                        child: CircularProgressIndicator(
                          valueColor: AlwaysStoppedAnimation(Colors.grey),
                        ),
                        width: 17.0,
                        height: 17.0,
                      ),
                      onPressed: null,
                    ),
                  ],
                ),
              ),
            ),
          ),
        ],
      ),
    );
    
    return Container(
      child: Column(
        children: <Widget>[
          uppersection,
        ],
      ),
    );
  }
}

内容的提问来源于stack exchange,提问作者Ahmad Zaklouta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 16:06:03