屏幕initState上的Flutter Snackbar
Posted
技术标签:
【中文标题】屏幕initState上的Flutter Snackbar【英文标题】:Flutter Snackbar on screen initState 【发布时间】:2021-04-06 17:01:03 【问题描述】:三个问题:
-
如何在 initState 或应用程序加载初始屏幕时在 Flutter 中加载快餐栏?我有下面的代码,但它会引发错误并且不会加载屏幕文本。
class HomeScreen extends StatefulWidget
@override
_HomeScreenState createState() => _HomeScreenState();
class _HomeScreenState extends State<HomeScreen>
@override
void initState()
print('In Init State Stream Builder');
_showSnackbar(context);
super.initState();
@override
Widget build(BuildContext context)
return Scaffold(
body: Center(
child: Text("Hello World"),
),
);
void _showSnackbar(BuildContext ctx)
Scaffold.of(ctx).showSnackBar(
SnackBar(
content: ListTile(
onTap: ()
Scaffold.of(ctx).hideCurrentSnackBar();
,
subtitle: Text("and i'm a subtitle"),
trailing: Icon(Icons.check),
),
duration: Duration(
days: 1,
),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)),
behavior: SnackBarBehavior.floating,
),
);
上面的代码在加载的时候会报错。
【问题讨论】:
您好,感谢您加入 *** 并提出您的第一个问题!在***,你应该总是在每篇文章中问一个问题。否则,您的问题可能会被关闭。 【参考方案1】:要在 initState() 上初始化 Snackbar,您可以延迟或在布局构建后执行一个函数,如下所示:
void initState()
super.initState();
WidgetsBinding.instance
.addPostFrameCallback((_) => _scaffoldKey.currentState.showSnackBar(SnackBar(content: Text("Your message here..")));
【讨论】:
【参考方案2】:我将在这里回答第一个问题。你有两个问题。
在 Flutter 中,您不能在 build 方法中具有 Scaffold 的小部件内调用 Scaffold.of(context)
。 Scaffold.of(context)
必须始终从以 Scaffold
作为其祖先的上下文中调用。
如果你想在 initState 中调用showSnackbar
,你必须在延迟函数中调用它。持续时间可以为 0。
我这里有一个简单的例子来展示一个
class HomePage extends StatelessWidget
@override
Widget build(BuildContext context)
return Scaffold(
body: ChildWidget(),
);
class ChildWidget extends StatefulWidget
@override
_ChildWidgetState createState() => _ChildWidgetState();
class _ChildWidgetState extends State<ChildWidget>
@override
Widget build(BuildContext context)
return Container();
@override
void initState()
Future<Null>.delayed(Duration.zero, ()
_showSnackbar();
);
super.initState();
void _showSnackbar()
Scaffold.of(context).showSnackBar(SnackBar(content: Text('content')));
【讨论】:
【参考方案3】:在 Flutter 中 context
仅在构建完成后可用,您可以使用 Future
或 WidgetsBinding.instance.addPostFrameCallback
或 SchedulerBinding.instance.addPostFrameCallback
。
但我希望如果你像这样将_showSnackbar(context);
移动到build
方法,你会得到相同的结果。
@override
Widget build(BuildContext context)
_showSnackbar(context);
return Scaffold(
body: Center(
child: Text("Hello World"),
),
);
【讨论】:
【参考方案4】:而不是将其放在 initState() 中,而是将其放在 didChangeDependencies() 中
@override
void didChangeDependencies ()
print('In Init State Stream Builder');
_showSnackbar(context);
super.didChangeDependencies();
【讨论】:
以上是关于屏幕initState上的Flutter Snackbar的主要内容,如果未能解决你的问题,请参考以下文章