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

时间:2018-10-23 17:13:26

标签: dart flutter

我在尝试实现统一的Scaffold主题时遇到困难。我最初的想法是清理我的UI,并在整个应用程序中重复使用脚手架中可共享元素的代码。因此,现在我有了一个基础Scaffold,其默认配置可用于构建MyScaffold的任何屏幕。但是,当我开始实现错误处理时,我开始面临访问上下文或MyScaffold状态的问题。因此,如果我有一个使用基础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,因为conext和LoginScreen的状态不包含真实的Scaffold,但是MyScaffold是要处理的正确小部件显示SnackBar。这是可以实现的,还是我应该删除基础Scaffold并重新编写通用配置部分。我所说的配置的一个示例是,我根据ScaffoldPlatform进行样式设置。

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

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

 return MyScaffold(
      key:_authScaffold ,...

在我称为

的同一小部件​​上
 _authScaffold.currentState.showSnackBar(SnackBar(content:Text(message)));

但我知道

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

1 个答案:

答案 0 :(得分:1)

Rémi在评论中回答,将小部件移动到MyScaffold下是最好的方法,因为您正在使用的BuildContext是包含支架的上下文。

如果需要,您可以使用Builder小部件来在树中获取一个较低的上下文,而不必创建新的小部件类。

但是要解决GlobalKey对您不起作用的原因-我不得不猜测一下,因为您没有包含MyScaffold的代码,但是由于您要将key传递给您MyScaffold,我假设您没有进一步传递它,因为有状态和无状态小部件都具有一个key参数。您应该做的是传递一个不同的值,即scaffoldKey,然后在MyWidget的build函数中,将scaffoldKey传递给Scaffold(key: scaffoldKey)。但是通常避免使用全局密钥,因此不建议这样做。