在Flutter中显示SnackBar

问题描述:

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

我尝试在showSnackBar()方法中显示SnackBar。但它失败,'方法'showSnackBar'被调用为空'。

这段代码有什么问题?

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) 
    )); 
    } 
} 

SOLUTION:

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) 
    )); 
    } 
} 

有三个问题:如果你改变你的代码,你可以从build法显示小吃吧。首先是你没有任何地方的脚手架,脚手架小部件是知道如何显示小吃店的。第二个是你有一把钥匙来握住脚手架,但你已经把它放在垫子上(而Paddings没有任何小吃店的知识)。第三个是你在与它相关联的小部件之前使用过的密钥有机会被初始化,因为initState在构建之前被调用。

最简单的办法是在你的MyApp的小工具来改变home行:

home: new Scaffold(body: new MyHomePage()),

...然后去掉一个_scaffoldKey都不在话下,而使用Scaffold.of(context),你现在有_scaffoldKey.currentState

+0

用新的'Scaffold'封装我的StatefulWidget并使用'Scaffold.of(context)'代替'_scaffoldKey'引用帮助。谢谢! –

initStatebuild之前,我想_scaffoldKey.currentState当它调用尚未初始化被调用。

我不知道你是否可以从initState得到ScaffoldState

Scaffold.of(context).showSnackBar(new SnackBar(new Text(value))); 
+0

简单地将'showInSnackBar()'方法移动到build()不起作用。一方面你是对的 - 在build()方法之前调用initState(),但即使在initState()方法之后,Scaffold.of(context)和字段'_scaffoldKey.currentState'也是null。 –