如何解决Flutter/Dart加载本地HTML时出现的‘Non-nullable instance field '_controller' must be initialized’错误?
解决Dart空安全下
Non-nullable instance field '_controller' must be initialized错误 这个错误是Dart空安全机制在起作用——你声明的_controller是非可空类型的WebViewController,但没有在声明时或者构造函数里给它初始化值,编译器无法保证它在使用前会被赋值,所以抛出了这个错误。
针对你的代码场景,最简洁的修复方式是给_controller加上late关键字,具体如下:
修改后的完整代码
class HelpScreen extends StatefulWidget { const HelpScreen({Key? key}) : super(key: key); @override State<HelpScreen> createState() => _HelpScreenState(); } class _HelpScreenState extends State<HelpScreen> { // 添加late关键字,告诉编译器该变量会在首次使用前完成初始化 late WebViewController _controller; @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text('Help')), body: WebView( initialUrl: 'about:blank', onWebViewCreated: (WebViewController webViewController) { _controller = webViewController; _loadHtmlFromAssets(); }, ), ); } _loadHtmlFromAssets() async { String fileText = await rootBundle.loadString('assets/Privacy Policy.html'); _controller.loadUrl( Uri.dataFromString( fileText, mimeType: 'text/html', encoding: Encoding.getByName('utf-8') ).toString()); } }
为什么这样修复?
late关键字的作用是告诉Dart编译器:这个非空变量不会在声明时初始化,但会在第一次被使用之前完成赋值。在你的代码里,_controller会在onWebViewCreated回调中被赋值,之后才会在_loadHtmlFromAssets里被调用,完全符合late的使用场景,编译器就不会再报错了。
其他可选方案(如果你不想用late)
你也可以把_controller声明为可空类型,然后在使用时做空安全检查:
WebViewController? _controller; // ... _loadHtmlFromAssets() async { String fileText = await rootBundle.loadString('assets/Privacy Policy.html'); // 使用?操作符确保_controller不为空时才调用方法 _controller?.loadUrl( Uri.dataFromString( fileText, mimeType: 'text/html', encoding: Encoding.getByName('utf-8') ).toString()); }
不过这种方式不如late简洁,因为你明确知道_controller会在使用前被初始化,所以late是更贴合你场景的选择。
内容的提问来源于stack exchange,提问作者Texter
相关产品推荐
相关产品推荐

