【发布时间】:2018-02-16 21:13:15
【问题描述】:
我只想在页面显示时显示一次 SnackBar。 但是我们不能在 build 方法中调用 showSnackBar。
是否有在构建后调用的处理程序?
【问题讨论】:
标签: flutter
我只想在页面显示时显示一次 SnackBar。 但是我们不能在 build 方法中调用 showSnackBar。
是否有在构建后调用的处理程序?
【问题讨论】:
标签: flutter
您可以使用StatefulWidget 并在您的State 的initState 中调用showSnackBar。您需要在触发showSnackBar 之前添加一个短暂的延迟。这是一个代码示例。
import 'dart:async';
import 'package:flutter/material.dart';
void main() {
runApp(new MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
home: new HomePage(),
);
}
}
class HomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new Scaffold(
floatingActionButton: new FloatingActionButton(
child: new Icon(Icons.developer_board),
onPressed: () {
Navigator.of(context).push(
new MaterialPageRoute(builder: (_) => new MySecondPage()),
);
},
),
);
}
}
class MySecondPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text('Developer Mode'),
),
body: new MySecondPageBody(),
);
}
}
class MySecondPageBody extends StatefulWidget {
@override
State createState() => new MySecondPageBodyState();
}
class MySecondPageBodyState extends State<MySecondPageBody> {
@override
void initState() {
new Future<Null>.delayed(Duration.ZERO, () {
Scaffold.of(context).showSnackBar(
new SnackBar(content: new Text("You made it! Congrats.")),
);
});
super.initState();
}
@override
Widget build(BuildContext context) {
return new Center(
child: new Text('You are now a developer.'),
);
}
}
【讨论】:
initState 将在build 之前调用。 Scaffold还没发?
使用 StatelessWidget 和 scheduleMicrotask 你也可以实现它
import 'dart:async';
import 'package:flutter/material.dart';
class App extends StatelessWidget {
final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>();
App() {
scheduleMicrotask(() => _scaffoldKey.currentState.showSnackBar(SnackBar(
content: Text('Hey!'),
)));
}
@override
Widget build(BuildContext ctx) {
return Scaffold(
key: _scaffoldKey,
appBar: AppBar(
title: Text('Look mum!'),
),
body: Container());
}
}
【讨论】:
您也可以尝试附加到 addPostFrameCallback (https://api.flutter.dev/flutter/scheduler/SchedulerBinding/addPostFrameCallback.html)
SchedulerBinding.instance.addPostFrameCallback((_) {
//show snackbar here
});
【讨论】: