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
相关产品推荐
相关产品推荐

