【发布时间】:2017-03-27 13:36:31
【问题描述】:
我想在 Flutter 的有状态小部件中显示一个简单的 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)
));
}
}
解决方案:
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)
));
}
}
【问题讨论】:
-
我宁愿建议所有 Flutter 用户使用 flushbar 插件。你可以看看这个答案为什么你应该使用flushbar插件而不是直接使用snackbar。去看看这个答案。 stackoverflow.com/a/51261864/7940500
-
只需使用异步函数来调用你的snackbar,如果你把你的函数放在build而不是initstate中,每次有setstate时你都会弹出snackbar
-
如果您很困惑,这里有一个关于如何使 SnackBar 小部件可用于任何页面的教程视频:youtu.be/u9KoFtu0HEY
-
Scaffold.of()已被弃用以显示 SnackBars,请改用 ScaffoldMessenger。
标签: dart android-snackbar snackbar flutter