Flutter集成Agora UI Kit报错:实例成员widget无法在初始化器中访问
报错现象
集成Agora UI Kit开发过程中触发如下编译错误:
The instance member 'widget' can't be accessed in an initializer.(实例成员
widget无法在初始化器中访问)
触发场景:在State类中初始化AgoraClient实例,直接为channelName属性赋值widget.channelname时报错,问题代码如下:
import 'package:agora_uikit/agora_uikit.dart'; class LiveStream extends StatefulWidget { const LiveStream({ Key key, this.width, this.height, this.channelname, }) : super(key: key); final double width; final double height; final String channelname; @override _LiveStreamState createState() => _LiveStreamState(); } class _LiveStreamState extends State<LiveStream> { final AgoraClient client = AgoraClient( agoraConnectionData: AgoraConnectionData( appId: "--AppID--", channelName: widget.channelname, ), ); }
错误原因
Dart中State类的字段初始化流程早于State与对应Widget实例的绑定流程,字段初始化阶段widget属性还未完成赋值,不支持访问,因此直接在字段初始化位置读取widget的属性会触发编译报错。
修复方案
优先选择将AgoraClient的初始化逻辑移动到initState生命周期中执行。initState是State完成Widget绑定后执行的第一个生命周期方法,此时可正常访问widget上的所有属性,参考实现如下:
class _LiveStreamState extends State<LiveStream> { late final AgoraClient client; @override void initState() { super.initState(); client = AgoraClient( agoraConnectionData: AgoraConnectionData( appId: "--AppID--", channelName: widget.channelname, ), ); // 按照Agora UI Kit使用规范初始化音视频引擎 client.initialize(); } @override void dispose() { // 页面销毁时释放Agora资源,避免内存泄漏 client.release(); super.dispose(); } // build等其余原有业务逻辑保持不变 }
其他可选实现方式:
- 为
client字段加late修饰,通过闭包实现懒初始化,将实例创建逻辑延迟到client首次被访问时执行,此时State已完成挂载可正常访问widget属性,该方式需要确保首次访问client时组件已经完成初始化。 - 直接在
build方法中创建AgoraClient实例,该方式会在每次组件重建时重复创建client实例,性能损耗大,不推荐使用。
内容的提问来源于stack exchange,提问作者Aman Sharma
相关产品推荐
相关产品推荐

