There is no native InputAccessoryView bar above the keyboard when running a Flutter app on iOS (physical device) when using keyboardType=TextInputType.emailAddress,keyboardType=TextInputType.text or several other keyboard types with a TextField widget. Research indicates this should only be happening with a numeric keyboard type, and
the InputAccessoryBar with "Done" button should be appearing. Abbreviated code:
TextField(
decoration: InputDecoration(
labelText: "Email Address",
),
keyboardType: TextInputType.emailAddress,
textInputAction: TextInputAction.next,
),
How do I get the InputAccessoryView to appear with the Done button so a user can hide the keyboard? I don't want a Done button in the keyboard because that needs to be the Next button, and I hope I don't need a plugin or widget.
Flutter 3.3.10 • channel stable
I want to make android and IOS style.
I want to convert the code below into Cupertino, IOS style.
But I Can't Use Drawer Menu for IOS style. Why?
How can I use?
return Scaffold(
key: _scaffoldKey,
drawer: Drawer(),
appBar: AppBar(
leading: IconButton(
onPressed: () {
Navigator.pop(context);
},
icon: Icon(
Icons.arrow_back_ios,
color: MyColors.blue,
),
),
centerTitle: true,
title: Text('Test', style: MyTextStyles.appBarTitle(deviceType) ),
actions: <Widget>[
Builder(
builder: (BuildContext context) => PlatformIconButton(
onPressed: () {
Scaffold.of(context).openDrawer();
},
icon: Icon(
Icons.menu,
)))])
body: .........
The Drawer widget is a Material-exclusive widget, and you can't use it directly on iOS.
You could build your own "Drawer-like" widget for iOS by replicating the build construction of a Drawer widget, but I would not recommend that, because drawers don't have that iOS "look and feel". As an iOS user myself, I know some very influential apps like Twitter have something that looks like a Drawer, but I think that is not the way a native iOS app would handle that kind of navigation.
What you can do instead, is having a Drawer widget for Android, and a bottom tab bar for iOS, which is a component that is way more common in iOS-styled apps. You can use the Platform class to check if your code is being executed on Android or iOS, and choose the right widget based on that.
Here is one example of such a build logic that you might find useful. I am very sorry I can't paste the code directly, I had this screenshot from a presentation I made and I don't remember where did I place the code for this project, but I hope you find it useful.
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
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).
If you want to achieve the floating look, with the nice animation sliding up from the bottom, you can do it manually, with a some customizations to the standard SnackBar implementation, without having to edit the source code of 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);
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.
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:
Is there a way to change the overlay background color when using showModalBottomSheet?
Right now the color is always a gray color, but I want to use a different color like green as shown below.
Here is the code used in the demo for reference
showModalBottomSheet<void>(context: context, builder: (BuildContext context) {
return Container(
child: Padding(
padding: const EdgeInsets.all(32.0),
child: Text('This is the modal bottom sheet. Tap anywhere to dismiss.',
textAlign: TextAlign.center,
style: TextStyle(
color: Theme.of(context).accentColor,
fontSize: 24.0
)
)
)
);
});
New Flutter UPDATE allows you to change the barrierColor in showModalBottomSheet()
showModalBottomSheet(
barrierColor: Colors.yellow.withOpacity(0.5),
You can actually change this but in order to do so you have to create a copy of this widget file in order to customize it. (steps below are for vscode)
However, by doing this, the widget won't be automatically updated by Flutter because it'd no longer be part of the SDK.
Create A Copy of A Widget To Customize
Right-click widget and select Go to definition - this will bring you to the widget's original file
Copy all of the code and paste it into a new .dart file with the same name - you'll notice there will now be errors due to a lack of dependencies.
In the case of BottomSheet you just need to add import 'package:flutter/material.dart';
Now import it like so import 'package:projectname/bottom_sheet.dart' as my; - the as my allows it to use the same .dart file name
Now when referencing it just add my. prior like so
my.showModalBottomSheet(
context: (context),
isScrollControlled: false,...
Customize Background Overlay Color
Now in bottom_sheet.dart just search for barrierColor and change Colors.black54 to whatever color you want!
I hope this will help anyone in the future!
Related Question
How to change the background color of BottomSheet in Flutter?
Short answer : you can't.
The color is hardcoded into the _ModalBottomSheetRoute class (as linked by #pskink) and there is no way to change its value.
I am trying to style a TextField in Flutter using the InputDecoration class.
Here is the implementation-
new TextField(
decoration: new InputDecoration(
border: InputBorder.none, // The named parameter border isn't defined
hintText: 'Please enter a search term'
),
);
But this results in a red squiggly line underneath border property with message
The parameter border isn't defined
Rest properties are working fine. Here is the screenshot of same -
PS - I'm new to Flutter.
You're on v0.0.22 of Flutter which is many months old. I found this PR from around the same time which says:
What was called the "divider" is now a configurable border
So my guess is that maybe the version you're using didn't have border.
You should switch to the beta channel (flutter channel beta) to try again with more recent code.