代码之家  ›  专栏  ›  技术社区  ›  Shady Aziza

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

  •  0
  • Shady Aziza  · 技术社区  · 6 年前

    Scaffold 主题。我最初的想法是清理我的UI,并在整个应用程序中重用脚手架中可共享元素的代码。所以现在我有了一个基础 使用任何生成的屏幕使用的默认配置 MyScaffold MyScaffold公司 它需要在某个时刻显示一个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 不包含真正的 脚手架 但是 是处理显示 小吃条 脚手架 脚手架 根据不同的 Platform

    我试过的一件事是使用 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 回复  |  直到 6 年前
        1
  •  1
  •   rmtmckenzie    6 年前

    正如Rmi在评论中所回答的,将小部件移动到MyScaffold下是最好的方法,因为这样您使用的BuildContext就是一个包含scaffold的上下文。

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

    GlobalKey 我不为你工作-我不得不猜一点,因为你没有为你的MyScaffold包括代码,但因为你是通过 key 对于您的MyScaffold,我假设您没有进一步传递它,因为有状态和无状态小部件都有一个 钥匙 scaffoldKey ,然后在MyWidget的构建函数中,将scaffoldKey传递给 Scaffold(key: scaffoldKey) . 但使用globalkeys通常是可以避免的,不建议使用。