【问题标题】:Flutter SnackBar not showingFlutter SnackBar 未显示
【发布时间】:2019-12-05 06:37:08
【问题描述】:

我已经实现了表单提交的功能。我希望在提交后有 SnackBar 警报。我试过了,还是不行。我加了SnackBar之后路由也不行。

addTicket() async {
if (_formKey.currentState.validate()) {
  _formKey.currentState.save();

  try{
    DocumentReference ref = await db.collection('CostalLineTicketDetails').
    document(ticketCato).collection("Tickets").add(
        {
          'startStation':startStation,
          'endStation':endStation,
          'price':price,
          'ticketType':ticketCato,
          'contactNo':contactNo,
          'dateTime':dateTime,
        });
    setState(() => id = ref.documentID);
    Navigator.push(context, new MaterialPageRoute(builder: (context) => CostalLine()));

    Scaffold.of(context).showSnackBar(SnackBar(content: Text('Ticket Added Sucessfully')));

  }catch(e){
    print(e);
  }
}

} }

【问题讨论】:

    标签: android flutter


    【解决方案1】:
    1. 您无法在转到另一个屏幕后在同一页面上显示showSnackBar
    2. 您可以像这样声明_scaffoldKey 并将其传递给Scaffold
    final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>();
    
    Scaffold(
          key: _scaffoldKey,
    

    然后像这样打开小吃店

    _scaffoldKey.currentState.showSnackBar(SnackBar(
            content: Text(
             'Welcome',
            ),
            duration: Duration(seconds: 2),
          ));
    

    输出:


    编辑

    你也可以使用flash,不需要每次都传递_scaffoldKey

    示例:

       void _showBasicsFlash({
        Duration? duration,
        flashStyle = FlashBehavior.floating,
      }) {
        showFlash(
          context: context,
          duration: duration,
          builder: (context, controller) {
            return Flash(
              controller: controller,
              behavior: flashStyle,
              position: FlashPosition.bottom,
              boxShadows: kElevationToShadow[4],
              horizontalDismissDirection: HorizontalDismissDirection.horizontal,
              child: FlashBar(
                content: Text('This is a basic flash'),
              ),
            );
          },
        );
      }
    

    【讨论】:

    • FlushBar 不能以健全的空安全运行
    • @ALIHUSSEIN 是的 FLushBar 已停产,但有一些不错的选择,例如 Flash
    • FlushBar 现已发布,具有良好的 null 安全性。
    【解决方案2】:

    试试这个,

    addTicket() async {
    if (_formKey.currentState.validate()) {
      _formKey.currentState.save();
    
      try{
        DocumentReference ref = await 
        db.collection('CostalLineTicketDetails').
        document(ticketCato).collection("Tickets").add(
            {
              'startStation':startStation,
              'endStation':endStation,
              'price':price,
              'ticketType':ticketCato,
              'contactNo':contactNo,
              'dateTime':dateTime,
            });
        setState(() => id = ref.documentID);
       // Navigator.push(context, new MaterialPageRoute(builder: (context) => CostalLine()));
    
        Scaffold.of(context).showSnackBar(SnackBar(content: 
        Text('Ticket Added Sucessfully')));
    
      }catch(e){
        print(e);
       }
       }
       }
       } 
    

    【讨论】:

    • 你在脚手架中定义了key吗?它显示错误吗?如果是,则发布错误
    • 不,没有任何错误。正如我提到的,添加 Snackbar 后路由也不起作用
    • 我更新后的答案不会带您到 下一页,但如果它显示快餐栏,那么您必须在推送到 **costalLine() 之前 显示快餐栏 活动 您可以在 costalLine() 活动中显示小吃吧
    【解决方案3】:

    在任何一个通用的 dart 文件中定义这个代码,你可以在任何地方调用这个函数,并且会显示一个通用类型的脚手架。

    import 'package:flutter/material.dart';
    
    void showWarningSnackBar(BuildContext context, String message) {
    // Find the Scaffold in the widget tree and use it to show a SnackBar.
      ScaffoldFeatureController<Widget, dynamic> _scaffold;
    
      // Find the Scaffold in the widget tree and use it to show a SnackBar.
      _scaffold = Scaffold.of(context).showSnackBar(SnackBar(
        content: InkWell(
          onTap: () {
            _scaffold.close();
          },
          child: Row(
            mainAxisAlignment: MainAxisAlignment.start,
            children: <Widget>[
              AppImage.asset(
                  assetName: YOUR_IMAGE_NAME,
                  fit: BoxFit.contain,
                  width: 20,
                  color: COLOR),
              const SizedBox(
                width: 10,
              ),
              Text(
                '$message',
                maxLines: 2,
              ),
            ],
          ),
        ),
        duration: const Duration(seconds: 10),
        backgroundColor: COLOR,
      ));
    }
    

    【讨论】:

      猜你喜欢
      • 2020-04-23
      • 2017-03-27
      • 2019-12-15
      • 2020-09-24
      • 1970-01-01
      • 1970-01-01
      • 2019-08-28
      • 2019-05-24
      • 2021-10-21
      相关资源
      最近更新 更多