无法在“ScaffoldState”上调用方法“showBottomSheet”?因为它可能为空

问题描述 投票:0回答:3

您好,当我尝试运行代码时遇到此错误

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 flutter-layout dart-null-safety null-safety
3个回答
1
投票

所以问题是,正如你可能已经发现的那样,flutter 不知道当前状态变量是否为 null,在某些情况下它是 null,因此,它不会让你调用它,这是明显的解决方案:

if (scaffoldKey.currentState != null) {
  scaffoldKey.currentState!.showBottomSheet(...);
}

注意

!
后面的
currentState
,当你将
!
放在可能为空值之后时,你是在告诉flutter,“相信我,这个值不为空”,这意味着如果它为空,它将抛出错误,但它不会抱怨否则。

也许更好的解决方案是按照错误代码的建议进行操作:

无法在“ScaffoldState”上调用方法“showBottomSheet”?因为它可能为空。 尝试使用 ?. 进行呼叫。 脚手架Key.currentState.showBottomSheet(

像这样:

scaffoldKey.currentState?.showBottomSheet(...);

使用

?.
时,您有条件地调用可能为空值的方法或成员变量

所以上面这行的意思是,“如果

currentState
不为 null,则调用它的
showBottomSheet
方法,否则,不执行任何操作”。


0
投票

我从 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(...);

0
投票

我尝试过这个答案,但没有人适合我。 这就是我所做的

 showModalBottomSheet(
                  context: context,
                  builder: (context)=> ExpenseCategoryBottomSheet(),
                );
© www.soinside.com 2019 - 2024. All rights reserved.