屏幕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 仅在构建完成后可用,您可以使用 FutureWidgetsBinding.instance.addPostFrameCallbackSchedulerBinding.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的主要内容,如果未能解决你的问题,请参考以下文章

Flutter控制屏幕旋转

Flutter 在 initState 方法中获取上下文

flutter 路由监听友盟页面统计方案

Flutter:异步任务在“initState()”中无法按预期工作

如何将值从initstate传递给flutter中的小部件

Flutter中的Firestore快照侦听器数据重复问题