我在尝试实现统一的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
并重新编写通用配置部分。我所说的配置的一个示例是,我根据Scaffold
对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
答案 0 :(得分:1)
Rémi在评论中回答,将小部件移动到MyScaffold下是最好的方法,因为您正在使用的BuildContext是包含支架的上下文。
如果需要,您可以使用Builder
小部件来在树中获取一个较低的上下文,而不必创建新的小部件类。
但是要解决GlobalKey
对您不起作用的原因-我不得不猜测一下,因为您没有包含MyScaffold的代码,但是由于您要将key
传递给您MyScaffold,我假设您没有进一步传递它,因为有状态和无状态小部件都具有一个key
参数。您应该做的是传递一个不同的值,即scaffoldKey
,然后在MyWidget的build函数中,将scaffoldKey传递给Scaffold(key: scaffoldKey)
。但是通常避免使用全局密钥,因此不建议这样做。