Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dart 从自定义脚手架底座显示SnackBar_Dart_Flutter - Fatal编程技术网

Dart 从自定义脚手架底座显示SnackBar

Dart 从自定义脚手架底座显示SnackBar,dart,flutter,Dart,Flutter,我在尝试实现统一的Scaffold主题时遇到困难。我最初的想法是清理我的UI,并在整个应用程序中重用我的脚手架的可共享元素的代码。因此,现在我有了一个基本的Scaffold,它具有默认配置,任何构建MyScaffold的屏幕都会使用该配置。然而,当我开始实现错误处理时,我开始面临访问myscafold的上下文或状态的问题。因此,如果我有一个使用基本Scaffold的屏幕,它需要在某个点显示一个SnackBar,它将类似于: class LoginScreen extends StatelessW

我在尝试实现统一的
Scaffold
主题时遇到困难。我最初的想法是清理我的UI,并在整个应用程序中重用我的脚手架的可共享元素的代码。因此,现在我有了一个基本的
Scaffold
,它具有默认配置,任何构建
MyScaffold
的屏幕都会使用该配置。然而,当我开始实现错误处理时,我开始面临访问
myscafold
的上下文或状态的问题。因此,如果我有一个使用基本
Scaffold
的屏幕,它需要在某个点显示一个SnackBar,它将类似于:

class LoginScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MyScaffold(
      //custom configuration
    );


  }
  //Called somehwere
    void signIn() async{
      try{
        // await signIn
      }
      catch(e){
        // showSnackBar
      }
    }
}
但是,我无法显示
SnackBar
,因为
LoginScreen
的上下文和状态不包含真正的
Scaffold
,但是
MyScaffold
是处理显示
SnackBar
的正确小部件。这是可以实现的,还是我应该放弃我的基本
Scaffold
,重新编写公共配置部分。我所说的配置的一个例子是,我根据
平台
为我的
脚手架
设置不同的样式

我尝试过的一件事是使用
GlobalKey

final GlobalKey<ScaffoldState> _authScaffold =GlobalKey<ScaffoldState>();

 return MyScaffold(
      key:_authScaffold ,...
但我明白了

 NoSuchMethodError: The method 'showSnackBar' was called on null.
E/flutter ( 1337): Receiver: null

正如Rémi在评论中回答的那样,将小部件移动到MyScaffold下是最好的方法,因为这样您使用的构建上下文就是一个包含脚手架的上下文

如果需要,您可以使用
Builder
小部件在树的下方获取上下文,而无需创建新的小部件类


但是为了解释
GlobalKey
wan不为您工作的原因,我不得不猜一点,因为您没有为您的myscafold包含代码,但是由于您将
key
传递给您的myscafold,我假设您没有进一步传递它,因为有状态和无状态小部件都有
key
参数。您应该做的是传递一个不同的值,即
scaffoldKey
,然后在MyWidget的构建函数中,将scaffoldKey传递给
Scaffold(key:scaffoldKey)
。但是使用globalkeys通常是可以避免的,不推荐使用。

MyScaffold
内部是否有
Scaffold
?如果是,您可以使用GlobalKey或使用不同的
上下文。如果没有,您必须重新实现snackbar布局。是的,它确实有一个
脚手架
,我尝试传递一个
GlobalKey
,并调用
currentState
,但它的工作方式就好像密钥未初始化一样(调用null)我尝试使用
GlobalKey
更新了帖子,你应该将该逻辑移到
MyScaffold
的子对象中,这样你就可以使用
Scaffold.of(context)
是的,这很有效,谢谢雷米。
 NoSuchMethodError: The method 'showSnackBar' was called on null.
E/flutter ( 1337): Receiver: null