Dart 在颤振中显示SnackBar

Dart 在颤振中显示SnackBar,dart,android-snackbar,snackbar,flutter,Dart,Android Snackbar,Snackbar,Flutter,我想在flatter的有状态小部件中显示一个简单的SnackBar。我的应用程序使用名为MyHomePage的有状态小部件创建MaterialApp的新实例 我尝试在showSnackBar()方法中显示SnackBar。但由于“方法”showSnackBar“在null上被调用”而失败 这个代码怎么了 class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { retu

我想在flatter的有状态小部件中显示一个简单的SnackBar。我的应用程序使用名为MyHomePage的有状态小部件创建MaterialApp的新实例

我尝试在showSnackBar()方法中显示SnackBar。但由于“方法”showSnackBar“在null上被调用”而失败

这个代码怎么了

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'Flutter',
      theme: new ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: new MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key}) : super(key: key);

  @override
  _MyHomePageState createState() => new _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {

  final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>();

  @override
  void initState() {
    super.initState();
    showInSnackBar("Some text");
  }

  @override
  Widget build(BuildContext context) {
    return new Padding(
            key: _scaffoldKey,
            padding: const EdgeInsets.all(16.0),
            child: new Text("Simple Text")
    );
  }

  void showInSnackBar(String value) {
    _scaffoldKey.currentState.showSnackBar(new SnackBar(
        content: new Text(value)
    ));
  }
}
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回新材料PP(
标题:"颤振",,
主题:新主题数据(
主样本:颜色。蓝色,
),
主页:新建MyHomePage(),
);
}
}
类MyHomePage扩展StatefulWidget{
MyHomePage({Key}):超级(Key:Key);
@凌驾
_MyHomePageState createState()=>new_MyHomePageState();
}
类_MyHomePageState扩展状态{
最终GlobalKey _scaffoldKey=新的GlobalKey();
@凌驾
void initState(){
super.initState();
showinsnakbar(“一些文本”);
}
@凌驾
小部件构建(构建上下文){
返回新的填充(
钥匙:_scaffoldKey,
填充:常数边集全部(16.0),
子项:新文本(“简单文本”)
);
}
void showinsnakbar(字符串值){
_scaffoldKey.currentState.showSnackBar(新SnackBar(
内容:新文本(值)
));
}
}
解决方案:

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
        title: 'Flutter',
        theme: new ThemeData(
            primarySwatch: Colors.blue,
        ),
        home: new Scaffold(body: new MyHomePage()),
      );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key}) : super(key: key);

  @override
  _MyHomePageState createState() => new _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {

  @override
  void initState() {
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    showInSnackBar("Some text");
    return new Padding(
        padding: const EdgeInsets.all(16.0),
        child: new Scaffold(
          body: new Text("Simple Text")
        )
    );
  }

  void showInSnackBar(String value) {
    Scaffold.of(context).showSnackBar(new SnackBar(
        content: new Text(value)
    ));
  }
}
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回新材料PP(
标题:"颤振",,
主题:新主题数据(
主样本:颜色。蓝色,
),
主页:新脚手架(正文:new MyHomePage()),
);
}
}
类MyHomePage扩展StatefulWidget{
MyHomePage({Key}):超级(Key:Key);
@凌驾
_MyHomePageState createState()=>new_MyHomePageState();
}
类_MyHomePageState扩展状态{
@凌驾
void initState(){
super.initState();
}
@凌驾
小部件构建(构建上下文){
showinsnakbar(“一些文本”);
返回新的填充(
填充:常数边集全部(16.0),
儿童:新脚手架(
正文:新文本(“简单文本”)
)
);
}
void showinsnakbar(字符串值){
Scaffold.of(上下文).showSnackBar(新的SnackBar(
内容:新文本(值)
));
}
}

initState
build
之前被调用,我想
\u scaffoldKey.currentState
在调用时还没有被初始化

我不知道您是否可以从
initState
获取
ScaffoldState
。如果更改代码,可以通过以下方法显示
build
方法中的snackbar:

Scaffold.of(context).showSnackBar(SnackBar(Text(value)));

有三个问题。首先,你没有脚手架,脚手架小部件是一个知道如何显示快餐店的小部件。第二,你有一把抓住脚手架的钥匙,但你把它放在了垫子上(垫子对快餐店一无所知)。第三个问题是,在与之关联的小部件有机会初始化之前,您已经使用了该键,因为initState是在构建之前调用的

最简单的解决方案是将MyApp小部件中的
home
行更改为:

home:newscaffold(主体:newmyhomepage()),


…然后删除所有对
\u scaffoldKey
的提及,改为使用
Scaffold.of(context)
,您当前拥有
\u scaffoldKey.currentState
在我的情况下,我拥有类似这样的代码(在类状态下)


snackbar开始工作:)

有一种更好更干净的方法可以在颤振中显示snackbar。我发现分享的方式很难,所以可能对其他人有帮助

无需更改应用程序的主要部分

class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
  return new MaterialApp(
    title: 'MyApp',
    theme: new ThemeData(
    primarySwatch: Colors.orange),
    home: new MainPage());
  }
}
页面状态代码是变化的地方。

final _globalKey = GlobalKey<ScaffoldMessengerState>();

@override
Widget build(BuildContext context) {
  return ScaffoldMessenger(
    key: _globalKey,
    child: Scaffold(
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            var snackBar = SnackBar(content: Text('Hello World'));
            _globalKey.currentState.showSnackBar(snackBar);
          },
          child: Text('Show SnackBar'),
        ),
      ),
    ),
  );
}
我们知道颤振提供了
Scaffold.of(context.showSnackBar
。但是,上下文应该是脚手架的后代的上下文,而不是包含脚手架的上下文。为了避免错误,我们需要为脚手架主体使用BuildContext,并将其存储在变量中,如下所示

class MainPageState extends State<MainPage> {                                                                         
BuildContext scaffoldContext;                                                                                                                                                                                                

@override                                                                                                           
Widget build(BuildContext context) {                                                                                

return new Scaffold(                                                                                              
    backgroundColor: Colors.grey,                                                                                 
    appBar: new AppBar(                                                                                           
      title: const Text(APP_TITLE),                                                                               
    ),                                                                                                             
    body: new Builder(builder: (BuildContext context) {                                                           
      scaffoldContext = context;                                                                                  
      return new Center(
           child: new Text('Hello World', style: new TextStyle(fontSize: 32.0)),
         );                                                                                
    }));                                                                                                           
}                                                                                                                   


void createSnackBar(String message) {                                                                               
  final snackBar = new SnackBar(content: new Text(message),                                                         
  backgroundColor: Colors.red);                                                                                      

  // Find the Scaffold in the Widget tree and use it to show a SnackBar!                                            
  Scaffold.of(scaffoldContext).showSnackBar(snackBar);                                                              
  }                                                                                                                   
}     
class MainPageState扩展状态{
BuildContext-scaffoldContext;
@凌驾
小部件生成(BuildContext上下文){
归还新脚手架(
背景颜色:颜色。灰色,
应用程序栏:新的应用程序栏(
标题:常量文本(应用程序标题),
),                                                                                                             
正文:新生成器(生成器:(BuildContext上下文){
脚手架上下文=上下文;
返回新中心(
子级:新文本('Hello World',样式:新文本样式(fontSize:32.0)),
);                                                                                
}));                                                                                                           
}                                                                                                                   
void createSnackBar(字符串消息){
class MainPageState extends State<MainPage> {                                                                         
BuildContext scaffoldContext;                                                                                                                                                                                                

@override                                                                                                           
Widget build(BuildContext context) {                                                                                

return new Scaffold(                                                                                              
    backgroundColor: Colors.grey,                                                                                 
    appBar: new AppBar(                                                                                           
      title: const Text(APP_TITLE),                                                                               
    ),                                                                                                             
    body: new Builder(builder: (BuildContext context) {                                                           
      scaffoldContext = context;                                                                                  
      return new Center(
           child: new Text('Hello World', style: new TextStyle(fontSize: 32.0)),
         );                                                                                
    }));                                                                                                           
}                                                                                                                   


void createSnackBar(String message) {                                                                               
  final snackBar = new SnackBar(content: new Text(message),                                                         
  backgroundColor: Colors.red);                                                                                      

  // Find the Scaffold in the Widget tree and use it to show a SnackBar!                                            
  Scaffold.of(scaffoldContext).showSnackBar(snackBar);                                                              
  }                                                                                                                   
}     
void initState() {
  super.initState();
  Future.delayed(Duration(seconds: 1)).then(
    (_) => _displaySnackbar
  );
}

// Display Snackbar
void get _displaySnackbar {
  _scaffoldKey.currentState.showSnackBar(SnackBar(
    duration: Duration(minutes: 1),
    content: Text('Your snackbar message')
  ));
}
@override
Widget build(BuildContext context) {
  return new Scaffold(
    appBar: new AppBar(
      title: new Text('Demo')
    ),
    body: new Builder(
      // Create an inner BuildContext so that the onPressed methods
      // can refer to the Scaffold with Scaffold.of().
      builder: (BuildContext context) {
        return new Center(
          child: new RaisedButton(
            child: new Text('SHOW A SNACKBAR'),
            onPressed: () {
              Scaffold.of(context).showSnackBar(new SnackBar(
                content: new Text('Hello!'),
              ));
            },
          ),
        );
      },
    ),
  );
}
void initState() {
super.initState();
WidgetsBinding.instance
    .addPostFrameCallback((_) => _scaffoldKey.currentState.showSnackBar(SnackBar(content: Text("Your message here..")));}
Scaffold.of(context).showSnackBar(
     SnackBar(content: Text("Thanks for using snackbar",
     textAlign: TextAlign.center, style: TextStyle(fontSize: 16.0, fontWeight: 
     FontWeight.bold),), duration: Duration(seconds: 2), backgroundColor: Colors.red,)
);
final _scaffoldKey = GlobalKey<ScaffoldState>();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      key: _scaffoldKey,
      appBar: AppBar(


    ),
  }
}
_scaffoldKey.currentState.showSnackBar(
       new SnackBar(
          content: new Text('Hello this is snackbar!')
       )
);
final _scaffoldKey = GlobalKey<ScaffoldState>();
key:_scaffoldKey,
final snackBar=SnackBar(
                      content: Text('Your password has been changed successfully'),
                    );
                    _scaffoldKey.currentState.showSnackBar(snackBar);
import 'package:flutter/material.dart';

class PageWrapper extends StatelessWidget {

  Widget page;

  WPage(this.page);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.white,
      body: page
    );
  }
}
import 'package:flutter/material.dart';
void main() => runApp(MaterialApp(
  initialRoute: '/login',
  routes: {
    '/login': (context) => PageWrapper(Login()),
    '/home': (context) => PageWrapper(Home())
  }
));
Scaffold.of(context).showSnackBar(SnackBar(content: Text("Hello from snackbar")));
final _globalKey = GlobalKey<ScaffoldMessengerState>();

@override
Widget build(BuildContext context) {
  return ScaffoldMessenger(
    key: _globalKey,
    child: Scaffold(
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            var snackBar = SnackBar(content: Text('Hello World'));
            _globalKey.currentState.showSnackBar(snackBar);
          },
          child: Text('Show SnackBar'),
        ),
      ),
    ),
  );
}
    var snackBar = SnackBar(content: Text('Hello World'));

    ScaffoldMessenger.of(_scaffoldKey.currentContext)
    .showSnackBar(snackBar );
final snackBar = SnackBar(content: Text('Yay! A SnackBar!'));

ScaffoldMessenger.of(context).showSnackBar(snackBar);