问题
I want to create a Snackbar, that looks like an image below, Google has created. Something like this:
I wanted to start creating one, but I don't have an idea about it, how should I start or how should I customize the Snackbar. I don't want to use flutter toast plugin. I want to create my own Snackbar. It would be great if somebody guides me on this
回答1:
First of all, based on your screenshot, maybe this is already supported by SnackBarBehavior, just pass the snackbar constructor behavior: SnackBarBehavior.floating, like this:
SnackBar(behavior: SnackBarBehavior.floating, content: ...)
If this is still not good enough, the best way to go about it is by starting with the SnackBar widget and customizing it. Though the widget's constructor parameters make the widget quite flexible, the SnackBar widget does not let you modify every little detail of it.
For example, I wanted to remove some padding in the snack bar and add some borders on the top, and at the time of this writing, this wasn't possible.
You should not modify directly the snack_bar.dart as it'll modify your local copy Flutter. Modifying snack_bar.dart directly has a couple of disadvantages:
- All your local Flutter projects will have these modifications.
- If you are in a team, nobody else will have these customizations.
- If you use a "standard" CI/CD pipeline -as you only modified your local copy of Flutter-, the built apps will not have these customizations, nor does the released apps, obviously.
- Upgrading Flutter (or changing channels) could be more difficult, as Flutter is using git (branches, commits) in the background for upgrading
The best solution for adding any complicated tweaks, implementing any customization to the SnackBar widget (apart from its public interface, of course) is to 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
}
This way, you can still use your custom BetterSnackBar widget like the original for example, for showing it using the scaffold: Scaffold.of(context).showSnackBar(betterSnackBar);.
This solution also leaves your local Flutter copy untouched (other projects won't be affected by it, you can easily switch between Flutter channels and upgrade your Flutter version on your computer), meaning you can version control your project's BetterSnackBar (CI works, co-workers will see the changes).
回答2:
This wouldn't be a snackbar but it can work the same.
1) Create a view using LinearLayout, Relative, or Constraint that looks like the snack bar insdie of the page you want it on.
2) set the Visibility to Gone, or Invisible.
3) add onCLickListener to a button to make the Snackbar(the layout you just made) visible when the button is clicked.
回答3:
EDIT: Warning!!!!!!! I check it and it change for all your projects, so I think it is not a really good option
Hello I have been trying doing the same as you, and the way that i found and can be helpful is edit the main snack_bar.dart file. You can access it by holding the control key and clicking on a Snackbar widget in the code.
After that just add this at the begining "import 'package:flutter/material.dart';" and change this:
child: Material(
elevation: 6.0,
color: _kSnackBackground,
child: Theme(
data: darkTheme,
child: mediaQueryData.accessibleNavigation ? snackbar : FadeTransition(
opacity: fadeAnimation,
child: snackbar,
),
),
),
for this:
child: Card(
elevation: 6.0,
color: _kSnackBackground,
child: Theme(
data: darkTheme,
child: mediaQueryData.accessibleNavigation ? snackbar : FadeTransition(
opacity: fadeAnimation,
child: snackbar,
),
),
),
And the result when you implement your snackbar going to be the next:
来源:https://stackoverflow.com/questions/53365785/flutter-create-own-snackbar-design