Flutter方法“ showSnackBar”在null上被调用

时间:2020-04-19 09:35:57

标签: flutter

我在显示SnackBar时遇到问题。我尝试了GlobalKey,将小部件拆分为另一个类和生成器。

我遇到了一个例外,这里将对此进行更多的讨论

NoSuchMethodError: The method 'showSnackBar' was called on null.

但是没有什么能解决我的问题。

这是我的课程

class LoginScreen extends StatelessWidget {
final _scaffoldKey = GlobalKey<ScaffoldState>();

@override
  Widget build(BuildContext context) {
    final provider = Provider.of<LoginProvider>(context);
    final bloc = Provider.of<LoginBloc>(context);

    return Scaffold(
      key: _scaffoldKey,
      body: provider.loginStatus == LoginStatus.Authorizing
        ? Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              CircularProgressIndicator(),
              const Text('Signing in...')
            ],
          ),
        )
      : Padding(
          padding: const EdgeInsets.all(16.0),
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              RaisedButton(
                child: Text(
                  Constants.loginButton,
                  style: TextStyle(fontSize: 16.0),
                ),
                onPressed: () {
                  var loginValues = bloc.loginValues();
                  print(loginValues);
                  provider.signIn(loginValues).then(
                    (value) {
                      if (value != null) {
                        Navigator.pushReplacementNamed(
                            context, MainScreen.routeName);
                      }
                    },
                  ).catchError(
                    (error) {
                      _scaffoldKey.currentState.showSnackBar(
                        SnackBar(
                          content: Text(error.toString()),
                        ),
                      );
                    },
                  );
                },
              ),
            ],
          ),
        ),
);

} }

显示SnackBar在onCatch()中执行。我发现,当我的LoginScreen类是有状态的小部件不是无状态的时,同样的代码也可以工作。但是我不知道为什么。

谢谢大家。

1 个答案:

答案 0 :(得分:0)

用于在支架下显示小吃栏:

  1. 创建小吃店
final snackBar = SnackBar(
        content: Text(e.message),
      );
  1. 显示小吃店
Scaffold.of(context).showSnackBar(snackBar);
catchError((e) {
  final snackBar = SnackBar(
    content: Text(e.message),
  );
  Scaffold.of(context).showSnackBar(snackBar);
});

已更新:

使用Builder小部件包装中心小部件并传递BuildContext