您好,当我尝试运行代码时遇到此错误
lib/layout/home_layout.dart:54:36: Error: Method 'showBottomSheet' cannot be called on 'ScaffoldState?' because it is potentially null.
- 'ScaffoldState' is from 'package:flutter/src/material/scaffold.dart' ('/C:/src/flutter/packages/flutter/lib/src/material/scaffold.dart').
Try calling using ?. instead.
scaffoldKey.currentState.showBottomSheet(
^^^^^^^^^^^^^^^
我定义了一个变量:
var scaffoldKey = GlobalKey<ScaffoldState>();
在这里,我尝试在单击浮动操作按钮时构建一个底表
floatingActionButton: FloatingActionButton(
onPressed: () {
scaffoldKey.currentState.showBottomSheet(
(context) => Container(
width: double.infinity,
height: 120.0,
color: Colors.red
),
);
},
child: const Icon(
Icons.add
),
),
请问有人可以告诉我哪里出错了吗?
所以问题是,正如你可能已经发现的那样,flutter 不知道当前状态变量是否为 null,在某些情况下它是 null,因此,它不会让你调用它,这是明显的解决方案:
if (scaffoldKey.currentState != null) {
scaffoldKey.currentState!.showBottomSheet(...);
}
注意
!
后面的currentState
,当你将!
放在可能为空值之后时,你是在告诉flutter,“相信我,这个值不为空”,这意味着如果它为空,它将抛出错误,但它不会抱怨否则。
也许更好的解决方案是按照错误代码的建议进行操作:
无法在“ScaffoldState”上调用方法“showBottomSheet”?因为它可能为空。 尝试使用 ?. 进行呼叫。 脚手架Key.currentState.showBottomSheet(
像这样:
scaffoldKey.currentState?.showBottomSheet(...);
使用
?.
时,您有条件地调用可能为空值的方法或成员变量
所以上面这行的意思是,“如果
currentState
不为 null,则调用它的 showBottomSheet
方法,否则,不执行任何操作”。
我从 Udemy 的 Abdullah Mansour 的完整 2022 Flutter & Dart 开发课程 [阿拉伯语] 中了解到这个示例。 h8moss的答案非常好,并抱怨颤振中零安全概念的一部分,尤其是在您的情况下,但它并没有帮助您显示我认为的BottomSheet。 所以,我发现实际上是 GlobalKey 返回了 null 状态。问题是为什么?
您需要将密钥传递到脚手架小部件中,然后将设置上下文和状态。
class _HomeLayoutState extends State<HomeLayout> { GlobalKey<ScaffoldState> scaffoldKey = new GlobalKey(); //so we can call snackbar from anywhere
...
Widget build(BuildContext context) {
return Scaffold(
key: scaffoldKey, //set state and context
最后,请注意 currentState 之后的 !,当你将 ! 放在可能为空值之后时,你就是在告诉 flutter,“相信我,这个值不为空”:
scaffoldKey.currentState!.showBottomSheet(...);
我尝试过这个答案,但没有人适合我。 这就是我所做的
showModalBottomSheet(
context: context,
builder: (context)=> ExpenseCategoryBottomSheet(),
);