Flutter -创建自己的小吃店设计

ttcibm8c  于 2023-06-07  发布在  Flutter
关注(0)|答案(5)|浏览(324)

我想创建一个Snackbar,看起来像下面的图像,谷歌已经创建。像这样的东西:

我想开始创建一个,但我没有一个想法,我应该如何开始或我应该如何自定义Snackbar。我不想使用flutter吐司插件。我想创建自己的Snackbar。如果有人在这方面指导我就太好了

doinxwow

doinxwow1#

首先,根据你的截图,也许这已经被SnackBarBehavior支持了,只要传递snackbar构造函数behavior: SnackBarBehavior.floating,就像这样:

SnackBar(behavior: SnackBarBehavior.floating, content: ...)

如果这仍然不够好,最好的方法是从SnackBar小部件开始并对其进行定制。虽然小部件的构造器参数使小部件非常灵活,但SnackBar小部件不允许您修改它的每个小细节。
例如,我想删除一些填充在小吃店和添加一些边界上的顶部,并在撰写本文时,这是不可能的。
你不应该直接修改snack_bar.dart,因为它会修改你的本地副本Flutter。直接修改snack_bar.dart有几个缺点
1.你所有的本地Flutter项目都会有这些修改。
1.如果你在一个团队中,没有其他人会有这些自定义。
1.如果您使用“标准”CI/CD管道(因为您只修改了Flutter的本地副本),则构建的应用程序将不会有这些自定义,发布的应用程序也不会有这些自定义。
1.升级Flutter(或更换频道)可能会更困难,因为Flutter在后台使用git(分支,提交)进行升级

添加任何复杂的调整,实现对SnackBar小部件的任何自定义(当然除了其公共接口)的最佳解决方案是implement it

class BetterSnackBar extends StatelessWidget implements SnackBar {
  Widget build(BuildContext context) {
     // Tweak the build method for maximum customization
  }

  // rest of the class, you can just copy-paste it
  // from SnackBar, if you want to make sure you support
  // everything the original snack bar supports
}

这样,您仍然可以像使用原始的BetterSnackBar小部件一样使用自定义小部件,例如使用scaffold来显示它:Scaffold.of(context).showSnackBar(betterSnackBar);
这个解决方案也不会影响你的本地Flutter副本(其他项目不会受到影响,你可以轻松地在Flutter频道之间切换,并在你的计算机上升级你的Flutter版本),这意味着你可以版本控制你的项目的BetterSnackBar(CI工作,同事会看到变化)。

kqlmhetl

kqlmhetl2#

如果你想实现浮动的外观,从底部向上滑动漂亮的动画,你可以手动完成,对标准SnackBar实现进行一些自定义,而不必编辑Flutter的源代码:

final snackBar = SnackBar(
  backgroundColor: Colors.transparent,
  elevation: 0,
  content: Container(
      padding: const EdgeInsets.all(8),
      decoration: BoxDecoration(
        color: Colors.greenAccent,
        border: Border.all(color: Colors.green, width: 3),
        boxShadow: const [
          BoxShadow(
            color: Color(0x19000000),
            spreadRadius: 2.0,
            blurRadius: 8.0,
            offset: Offset(2, 4),
          )
        ],
        borderRadius: BorderRadius.circular(4),
      ),
      child: Row(
        children: [
          const Icon(Icons.favorite, color: Colors.green ),
          const Padding(
            padding: EdgeInsets.only(left: 8.0),
            child: Text('Yay! A SnackBar!\nYou did great!', style: TextStyle(color: Colors.green)),
          ),
          const Spacer(),
          TextButton(onPressed: () => debugPrint("Undid"), child: Text("Undo"))
        ],
      )
  ),
);
ScaffoldMessenger.of(context).showSnackBar(snackBar);
bqjvbblv

bqjvbblv3#

这不会是一个小吃店,但它可以工作一样。
1)使用LinearLayout、Relative或Constraint创建一个视图,该视图看起来像您要在其上显示的页面中的快餐栏。
2)将可见性设置为“消失”或“不可见”。
3)将onCLickListener添加到按钮,以使Snackbar(您刚刚创建的布局)在单击按钮时可见。

de90aj5v

de90aj5v4#

编辑:警告!!!!!!!我检查它,它为您的所有项目更改,所以我认为这不是一个真正的好选择
你好,我一直在尝试做同样的你,和方式,我发现,可以帮助是编辑的主要snack_bar.dart文件。您可以通过按住control键并单击代码中的Snackbar小部件来访问它。
在那之后,只需要在开头加上这个“import 'package:flutter/material. dart”;”并更改此:

child: Material(
      elevation: 6.0,
      color: _kSnackBackground,
      child: Theme(
        data: darkTheme,
        child: mediaQueryData.accessibleNavigation ? snackbar : FadeTransition(
          opacity: fadeAnimation,
          child: snackbar,
        ),
      ),
    ),

为此:

child: Card(
      elevation: 6.0,
      color: _kSnackBackground,
      child: Theme(
        data: darkTheme,
        child: mediaQueryData.accessibleNavigation ? snackbar : FadeTransition(
          opacity: fadeAnimation,
          child: snackbar,
        ),
      ),
    ),

当你实现你的snackbar时,结果将是下一个:

4jb9z9bj

4jb9z9bj5#

如果你想展示一个完全定制的snackBar,那么我希望我的这个答案能帮助你。
1:将此包添加到pubspec.yaml文件(smart_snackbars:^1.0.0
2:import 'package:smart_snackbars/smart_snackbars.dart';在您所需的文件中。
比如说,
你想在按钮点击时显示一个snackBar,然后在你的回调函数中粘贴以下代码

callback: () {
            SmartSnackBars.showCustomSnackBar(
                context: context,
              duration: const Duration(milliseconds: 1000),
              animateFrom: AnimateFrom.fromTop,
              distanceToTravel: 0.0,
              outerPadding: const EdgeInsets.all(0),
              child: Container(
                margin: EdgeInsets.symmetric(horizontal: 10.w,vertical: 10.h),
                padding: EdgeInsets.fromLTRB(16.w, 10.h, 23.w, 10.h),
                decoration: BoxDecoration(
                  color: const Color.fromRGBO(0, 23, 90, 1),
                  borderRadius: BorderRadius.circular(10.r)
                ),
                child: Row(
                  mainAxisAlignment: MainAxisAlignment.spaceBetween,
                  children: [
                    Row(
                      children: [
                        Image.asset("assets/images/success2.png", height: 16.h,),
                        8.horizontalSpace,
                        LabelTextWidget(
                            text: "Your changes have been saved",
                            fontWeight: FontWeight.w400,
                            fontSize: 12.sp,
                            textColor: Colors.white,
                        ),
                      ],
                    ),
                    LabelTextWidget(
                      text: "Close",
                      fontWeight: FontWeight.w600,
                      fontSize: 12.sp,
                      textColor: Colors.white,
                    ),

                  ],
                ),
              ),
            );
          },

结果:

这就是如何制作完全定制的snackBar

相关问题