Android Studio运行Flutter应用出现空安全参数报错如何解决
报错原因
这是Flutter 2.0及以上版本开启空安全(Null Safety)后的常见语法适配错误,问题出在TaskItem的构造函数定义不符合空安全校验规则:
- 构造函数的命名可选参数如果没有手动指定默认值,隐式默认值为
null。原代码里Key key声明key是非空类型,无法接收隐式的null默认值,触发类型校验错误。 - 空安全环境下旧版本的
@required注解不再生效,必须使用内置的required关键字标记必填参数。原代码里this.label是非空String类型,没有标记必填的话同样会因为隐式null默认值触发类型错误。
修复方案
仅需要修改TaskItem类的构造函数即可,修改点共两处:
- 将
Key key改为Key? key,显式标记key为可空类型,适配不传key时的null默认值 - 删除
@required注解,在this.label前添加required关键字,标记label为必填的非空参数
修改后完整可运行代码
import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build (BuildContext context) { return MaterialApp( title: 'Exploration!', theme: ThemeData(primarySwatch: Colors.lightGreen), home: MyHomePage(), ); } } class MyHomePage extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: Text("Space Exploration Planner")), body: Column( children: [ Progress(), TaskList() ], ), ); } } class Progress extends StatelessWidget { @override Widget build(BuildContext context) { return Column( children: [ Text('You are this far away exploring the whole universe'), LinearProgressIndicator(value: 0.0), ], ); } } class TaskList extends StatelessWidget { @override Widget build(BuildContext context) { return Column( children: [ TaskItem(label: "Load Rocket with Supplies"), TaskItem(label: "Launch Rocket"), TaskItem(label: "Circle the home planet"), TaskItem(label: "Head out to the first moon"), TaskItem(label: "Launch moon lander #1"), ], ); } } class TaskItem extends StatelessWidget { final String label; // 仅修改了这行构造函数 const TaskItem({ Key? key, required this.label}) : super(key: key); @override Widget build(BuildContext context) { return Row( children: [ Checkbox(value: false, onChanged: null), Text(label), ], ); } }
补充:当前修改已经完全解决编译报错,代码可以直接运行。如果后续要实现复选框点击交互的效果,把
TaskItem从无状态组件改为有状态组件管理勾选状态即可。
内容的提问来源于stack exchange,提问作者Viraj Jagdale
相关产品推荐
相关产品推荐

