Dart 在颤振中显示SnackBar
我想在flatter的有状态小部件中显示一个简单的SnackBar。我的应用程序使用名为MyHomePage的有状态小部件创建MaterialApp的新实例 我尝试在showSnackBar()方法中显示SnackBar。但由于“方法”showSnackBar“在null上被调用”而失败 这个代码怎么了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
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);