我尝试在 nullsafety 中进行完全迁移,但现在我的函数和 UI 中函数的调用之间出现错误
在升级之前,所有这些代码都运行良好。
这是我的旧功能:
void goToNewItemView() async {
final slider= await showDialog<String>(
context: context,
builder: (context) => NewTodo(),
).then((title){
if(title != null) {
addItem(Todo_bis(title: title));
_saveData();
}
}
);
}
这是我的用户界面
Align(
alignment: Alignment.bottomCenter,
child : new RawMaterialButton(
onPressed: () {
goToNewItemView();
},
child: new Icon(
Icons.add,
color: Color(0xffff9a7b),
size: 30.0,
),
shape: new CircleBorder(),
elevation: 4.0,
fillColor: Colors.white,
padding: const EdgeInsets.all(10.0),
),
)
这是函数
goToNewItemView()
和 showDialog
调用的有状态小部件:
class NewTodo extends StatefulWidget {
final Todo item;
NewTodo({this.item });
@override
_NewTodoState createState() => _NewTodoState();
}
class _NewTodoState extends State<NewTodo> {
...
}
flutter 升级后出现一些错误。
首先我添加
required this.item
以兼容 NewTodo 有状态小部件中的 nullsafety
在我的函数
goToNewItemView()
出现缺少参数错误后,我添加 goToNewItemView(item)
和 NewTodo(item:item)
。
但之后我在 UI 部分收到错误
goToNewItemView();
需要一个参数,但我不知道是什么?
如果我不带任何参数让
goToNewItemView();
我得到一个错误:
预期有 1 个位置参数,但找到了 0 个
我不知道添加什么参数,我试过了
goToNewItemView(item);
goToNewItemView(item: item);
但我总是遇到错误。
这是我升级后的功能
void goToNewItemView(item) async {
final slider= await showDialog<String>(
context: context,
builder: (context) => NewTodo(item:item),
).then((title){
if(title != null) {
addItem(Todo_bis(title: title));
_saveData();
}
}
);
}
这是我的用户界面
Align(
alignment: Alignment.bottomCenter,
child : new RawMaterialButton(
onPressed: () {
goToNewItemView();
},
child: new Icon(
Icons.add,
color: Color(0xffff9a7b),
size: 30.0,
),
shape: new CircleBorder(),
elevation: 4.0,
fillColor: Colors.white,
padding: const EdgeInsets.all(10.0),
),
)
这是函数
goToNewItemView(item)
和 showDialog
调用的有状态小部件
class NewTodo extends StatefulWidget {
final Todo item;
NewTodo({required this.item });
@override
_NewTodoState createState() => _NewTodoState();
}
class _NewTodoState extends State<NewTodo> {
...
}
我找到了解决方案,只需转换最终的 Todo 项目即可;到最后的 Todo?物品; 这样我就可以从必需的 this.item 中删除必需的,其余的都不需要参数
该错误与空安全无关。
该参数不是可选的,因此需要指定它:
goToNewItemView(the_item_to_pass)
如果不起作用,则存在另一个错误。 或者它可能指的是这些功能:
addItem(Todo_bis(title: title));
_saveData();