Flutter Button is not cooparates with simple code - flutter

my goal is to define width of ElevatedButton, i tried to include Button in SizedBox as in Container, now its in ConstrainedBox and its still not working, its streched on entire length of app and i want him to have width: 100.0 Thx in advance
ConstrainedBox(
constraints: const BoxConstraints.tightFor(
width: 60.0,
height: 60.0,
),
child: ElevatedButton(
child: const Text("Blabla"),
onPressed: () {
print("Yup");
},
),
),```
[1]: https://i.stack.imgur.com/wmgj5.png

Use Padding()to define the desired width :
ElevatedButton(
onPressed: () {
print("Je suis une coquine");
},
child: Padding(
padding: const EdgeInsets.only(
left: 16.0, top: 4.0, right: 16.0, bottom: 4.0),
child: Text("blabla"),
),
)

Related

Flutter: Increase tap area of button (InkResponse)

I have an SVG icon and I struggle to make the tap area of it bigger, without making the icon bigger itself.
The icon is pretty small and so the tap area is small as well. But for UI reasons I do not want to make the icon bigger, is there any solution to increasing the tap area for this?
Here is my code snippet:
Container(
margin: EdgeInsets.only(right: 55),
child: InkResponse(
onTap: () {},
child: SvgPicture.asset("assets/svg/regular/bell.svg",
alignment: Alignment.centerRight, height: 24.w, width: 24.w),
),
)
you can just wrap the SvgPicture with another widget that can expand padding or size.
A better approach is the Padding widget :
Container(
margin: EdgeInsets.only(right: 55.w),
child: InkResponse(
onTap: () {},
child: Padding(
padding: const EdgeInsets.all(10),
child: SvgPicture.asset("assets/svg/regular/bell.svg",
alignment: Alignment.centerRight, height: 24.w, width: 24.w),
),
),
),
or with sizedBox :
Container(
margin: EdgeInsets.only(right: 55.w),
child: InkResponse(
onTap: () {},
child: SizedBox(
width: 100,
height: 100,
child: SvgPicture.asset("assets/svg/regular/bell.svg",
alignment: Alignment.centerRight, height: 24.w, width: 24.w),
),
),
),

change popupmenubutton size(width and height)

could you plz tell me how to change the size of popupMenu, like to make it wider and bigger, here is my code, thank you a lot. I didnt find some useful info from stack overflow or google...
Widget _threeItemPopup() => PopupMenuButton(
icon: Icon(
Icons.more_horiz,
size: 24,
color: Colors.white,
),
onSelected: (value) {
value();
},
itemBuilder: (context) => [
PopupMenuItem(
child: Container(
width: 100.0,
child: Text('Settings')),
value: () {
debugPrint('open Settings');
},
),
PopupMenuItem(
child: Container(
width: 100.0,
child: Text('Flutter.io')),
value: () {
debugPrint('goto Flutter.io');
},
),
],
);
You can set any size of the popup menu, for example 500x1000 (no larger than the screen size), but you lose the automatic calculation of its height and now you have to keep track of it yourself.
PopupMenuButton(
...
constraints: const BoxConstraints.expand(width: 500, height: 1000),
itemBuilder:...
You can play with fontSize & padding (top/bottom) to make it bigger.
Widget _threeItemPopup() => PopupMenuButton(
padding: const EdgeInsets.only(
top: 100, bottom: 100), // option 1 : padding on PopupMenuButton
icon: const Icon(
Icons.more_horiz,
size: 24,
color: Colors.black,
),
onSelected: (value) {
value();
},
itemBuilder: (context) => [
PopupMenuItem(
padding: const EdgeInsets.only(
top: 20, bottom: 20), // option 2 : padding on PopupMenuItem
child: const SizedBox(
child: Padding(
padding: EdgeInsets.only(
top: 20, bottom: 20), // option 3 : padding on Text
child: Text(
'Settings',
style: TextStyle(fontSize: 50), // option 4 : play with fontSize
),
)),
value: () {
debugPrint('open Settings');
},
),
PopupMenuItem(
padding: const EdgeInsets.only(top: 20, bottom: 20),
child: const SizedBox(
child: Padding(
padding: EdgeInsets.only(top: 20, bottom: 20),
child: Text(
'Flutter.io',
style: TextStyle(fontSize: 50),
),
)),
value: () {
debugPrint('goto Flutter.io');
},
),
],
);
On PopupMenuButton's child, you can use SizedBox to provide the size you want. Also in your case you can just increase the icon size. Same goes for PopupMenuItem
PopupMenuButton(
child: const SizedBox(
height: 100,
width: 100,
child:...,
),
itemBuilder: (context) => [
PopupMenuItem(
child:
Container(width: 100.0, height: 200,....),

How to maintain container widget width when we add a child column widget

My code without column widget gives expected UI like this
But when I add a column widget the width of the container is shrinking based on the column widget child like this
Code:
Scaffold(
backgroundColor: Color(0xffE3E4EB),
appBar: AppBar(
titleTextStyle: TextStyle(fontWeight: FontWeight.w600),
backgroundColor: Color(0xffE3E4EB),
elevation: 0,
actions: [
Padding(
padding: const EdgeInsets.only(right: 10.0),
child: Container(
width: 60,
height: 60,
child: Icon(Icons.done),
),
)
],
),
body: Center(
child: Padding(
padding: EdgeInsets.only(top: 120, left: 20, right: 20, bottom: 40),
child: Container(
decoration: BoxDecoration(
color: Colors.white, borderRadius: BorderRadius.circular(20)),
// child: Column( // disable this 3 line to check the UI
// children: [Text("Dinesh Nagarajan")],
// ),
),
),
),
);
How I can maintain the width of my container
You can just set the width property of container to double.infinity. It will expand to fit the maximum available width.

Flutter how to remove default padding from stack positioned

CODE:
#override
Widget build(BuildContext context) {
return Scaffold(
resizeToAvoidBottomInset: false,
backgroundColor: Colors.blue,
body: SafeArea(
child: SingleChildScrollView(
physics: ClampingScrollPhysics(),
child: Align(
alignment: Alignment.center,
child: Container(
width: Get.width,
height: Get.width * 16 / 9,
child: Stack(
children: [
Positioned(top: 16, left: 16, child: BackButton()),
Positioned(
left: 0,
bottom: 0,
child: IconButton(
padding: EdgeInsets.symmetric(vertical: 0, horizontal: 0),
icon: Icon(
Icons.delete_forever,
color: Colors.greenAccent,
size: 32,
),
onPressed: () {
},
),
),
],
),
),
),
),
),
);
}
There is some margin on IconButton.
I think IconButton should be tight on bottom left.
How to remove margin IconButton and screen side?
Actually it's the default padding of the Icon Button only...
That is, the stack is placing the button at bottom left but icon in the button is padded by default.
You can try using Gesture detector with that icon as a child...
You will get different result...
Please correct me if i am wrong..

How to set the width and height of a button in Flutter?

I have seen that I can't set the width of a ElevatedButton in Flutter. If I have well understood, I should put the ElevatedButton into a SizedBox. I will then be able to set the width or height of the box. Is it correct? Is there another way to do it?
This is a bit tedious to create a SizedBox around every buttons so I'm wondering why they have chosen to do it this way. I'm pretty sure that they have a good reason to do so but I don't see it.
The scaffolding is pretty difficult to read and to build for a beginner.
new SizedBox(
width: 200.0,
height: 100.0,
child: ElevatedButton(
child: Text('Blabla blablablablablablabla bla bla bla'),
onPressed: _onButtonPressed,
),
),
As said in documentation here
Raised buttons have a minimum size of 88.0 by 36.0 which can be
overidden with ButtonTheme.
You can do it like that
ButtonTheme(
minWidth: 200.0,
height: 100.0,
child: RaisedButton(
onPressed: () {},
child: Text("test"),
),
);
match_parent (Full width):
SizedBox(
width: double.infinity, // <-- match_parent
height: double.infinity, // <-- match-parent
child: ElevatedButton(...)
)
or
SizedBox.expand(
child: ElevatedButton(...)
)
Specific width:
SizedBox(
width: 100, // <-- Your width
height: 50, // <-- Your height
child: ElevatedButton(...)
)
With Flutter 2.0 RaisedButton is deprecated and replaced by ElevatedButton.
With that in mind, much more cleaner approach to give custom size to ElevatedButton is minimumSize property of ElevatedButton widget.
Output
Full Code
ElevatedButton(
style: ElevatedButton.styleFrom(
primary: Colors.green,
onPrimary: Colors.white,
shadowColor: Colors.greenAccent,
elevation: 3,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(32.0)),
minimumSize: Size(100, 40), //////// HERE
),
onPressed: () {},
child: Text('Hey bro'),
)
Note: Also keep in mind that same approach can be used in new widgets like TextButton and OutlinedButton using TextButton.styleFrom(minimumSize: Size(100, 40)) and OutlinedButton.styleFrom(minimumSize: Size(100, 40)) respectively.
That's because flutter is not about size. It's about constraints.
Usually we have 2 use cases :
The child of a widget defines a constraint. The parent size itself is based on that information. ex: Padding, which takes the child constraint and increases it.
The parent enforce a constraint to its child. ex: SizedBox, but also Column in strech mode, ...
RaisedButton is the first case. Which means it's the button which defines its own height/width. And, according to material rules, the raised button size is fixed.
You don't want that behavior, therefore you can use a widget of the second type to override the button constraints.
Anyway, if you need this a lot, consider either creating a new widget which does the job for you. Or use MaterialButton, which possesses a height property.
I would recommend using a MaterialButton, than you can do it like this:
MaterialButton(
height: 40.0,
minWidth: 70.0,
color: Theme.of(context).primaryColor,
textColor: Colors.white,
child: new Text("push"),
onPressed: () => {},
splashColor: Colors.redAccent,
)
You need to use an Expanded Widget. But, if your button is on a column, the Expanded Widget fills the rest of the column. So, you need to enclose the Expanded Widget within a row.
Row(children: <Widget>[
Expanded(
flex: 1,
child: RaisedButton(
child: Text("Your Text"),
onPressed: _submitForm,
),
),),])
The new buttons TextButton, ElevatedButton, OutlinedButton etc. are to be changed in a different way.
One method I found is from this article: you need to "tighten" a constrained box around the button.
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Kindacode.com'),
),
body: Center(
child: ConstrainedBox(
constraints: BoxConstraints.tightFor(width: 300, height: 200),
child: ElevatedButton(
child: Text('300 x 200'),
onPressed: () {},
),
),
));
}
Use Media Query to use width wisely for your solution which will run the same for small and large screen
Container(
width: MediaQuery.of(context).size.width * 0.5, // Will take 50% of screen space
child: RaisedButton(
child: Text('Go to screen two'),
onPressed: () => null
),
)
You can apply a similar solution to SizeBox also.
My preferred way to make Raise button with match parent is that wrap it with Container.
below is sample code.
Container(
width: double.infinity,
child: RaisedButton(
onPressed: () {},
color: Colors.deepPurpleAccent[100],
child: Text(
"Continue",
style: TextStyle(color: Colors.white),
),
),
)
This piece of code will help you better solve your problem, as we cannot specify width directly to the RaisedButton, we can specify the width to it's child
double width = MediaQuery.of(context).size.width;
var maxWidthChild = SizedBox(
width: width,
child: Text(
StringConfig.acceptButton,
textAlign: TextAlign.center,
));
RaisedButton(
child: maxWidthChild,
onPressed: (){},
color: Colors.white,
);
Simply use FractionallySizedBox, where widthFactor & heightFactor define the percentage of app/parent size.
FractionallySizedBox(
widthFactor: 0.8, //means 80% of app width
child: RaisedButton(
onPressed: () {},
child: Text(
"Your Text",
style: TextStyle(color: Colors.white),
),
color: Colors.red,
)),
You can create global method like for button being used all over the app. It will resize according to the text length inside container. FittedBox widget is used to make widget fit according to the child inside it.
Widget primaryButton(String btnName, {#required Function action}) {
return FittedBox(
child: RawMaterialButton(
fillColor: accentColor,
splashColor: Colors.black12,
elevation: 8.0,
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(5.0)),
child: Container(
padding: EdgeInsets.symmetric(horizontal: 20.0, vertical: 13.0),
child: Center(child: Text(btnName, style: TextStyle(fontSize: 18.0))),
),
onPressed: () {
action();
},
),
);
}
If you want button of specific width and height you can use constraint property of RawMaterialButton for giving min max width and height of button
constraints: BoxConstraints(minHeight: 45.0,maxHeight:60.0,minWidth:20.0,maxWidth:150.0),
If you want globally change the height and the minWidth of all your RaisedButtons, then you can override ThemeData inside your MaterialApp:
#override
Widget build(BuildContext context) {
return MaterialApp(
...
theme: ThemeData(
...
buttonTheme: ButtonThemeData(
height: 46,
minWidth: 100,
),
));
}
Wrap RaisedButton inside Container and give width to Container Widget.
e.g
Container(
width : 200,
child : RaisedButton(
child :YourWidget ,
onPressed(){}
),
)
We can also use ElevatedButton Widget, it have fixedSize property. latest Flutter version
ElevatedButton(
onPressed: () {},
style: ElevatedButton.styleFrom(
fixedSize: Size(120, 34), // specify width, height
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(
20,
))),
child: Text("Search"),
)
Preview
This worked for me. The Container provides the height and FractionallySizedBox provides the width for the RaisedButton.
Container(
height: 50.0, //Provides height for the RaisedButton
child: FractionallySizedBox(
widthFactor: 0.7, ////Provides 70% width for the RaisedButton
child: RaisedButton(
onPressed: () {},
),
),
),
Try with Container, I think we will have more control.
ElevatedButton(
style: ElevatedButton.styleFrom(textStyle: const TextStyle(fontSize: 20)),
onPressed: () {
buttonClick();
},
child: Container(
height: 70,
width: 200,
alignment: Alignment.center,
child: Text("This is test button"),
),
),
you can do as they say in the comments or you can save the effort and work with RawMaterialButton . which have everything and you can change the border to be circular
and alot of other attributes. ex shape(increase the radius to have more circular shape)
shape: new RoundedRectangleBorder(borderRadius: BorderRadius.circular(25)),//ex add 1000 instead of 25
and you can use whatever shape you want as a button by using GestureDetector which is a widget and accepts another widget under child attribute.
like in the other example here
GestureDetector(
onTap: () {//handle the press action here }
child:Container(
height: 80,
width: 80,
child:new Card(
color: Colors.blue,
shape: new RoundedRectangleBorder(borderRadius: BorderRadius.circular(25)),
elevation: 0.0,
child: Icon(Icons.add,color: Colors.white,),
),
)
)
If the button is placed in a Flex widget (including Row & Column), you can wrap it using an Expanded Widget to fill the available space.
we use Row or Column, Expanded, Container and the element to use example RaisedButton
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
children: <Widget>[
Padding(
padding: const EdgeInsets.symmetric(vertical: 10.0),
),
Row(
children: <Widget>[
Expanded(
flex: 2, // we define the width of the button
child: Container(
// height: 50, we define the height of the button
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 10.0),
child: RaisedButton(
materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
textColor: Colors.white,
color: Colors.blue,
onPressed: () {
// Method to execute
},
child: Text('Copy'),
),
),
),
),
Expanded(
flex: 2, // we define the width of the button
child: Container(
// height: 50, we define the height of the button
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 10.0),
child: RaisedButton(
materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
textColor: Colors.white,
color: Colors.green,
onPressed: () {
// Method to execute
},
child: Text('Paste'),
),
),
),
),
],
),
],
),
),
SizedBox(
width: double.infinity,
child: ElevatedButton(
child: Text("FULL WIDTH"),
onPressed: () {},
),
),
Use ElevatedButton since RaisedButton is deprecated
In my case(the Button is a child of a horizontal ListView), I had to wrap the button with a padding widget and set right/left padding.
Padding(
padding: const EdgeInsets.only(right: 50, left: 50),
child: ElevatedButton(onPressed: () {}, child: Text("LOGOUT")),
)
In my case I used margin to be able to change the size:
Container(
margin: EdgeInsets.all(10),
// or margin: EdgeInsets.only(left:10, right:10),
child: RaisedButton(
padding: EdgeInsets.all(10),
shape: RoundedRectangleBorder(borderRadius:
BorderRadius.circular(20)),
onPressed: () {},
child: Text("Button"),
),
),
If you don't want to remove all the button theme set up.
ButtonTheme.fromButtonThemeData(
data: Theme.of(context).buttonTheme.copyWith(
minWidth: 200.0,
height: 100.0,,
)
child: RaisedButton(
onPressed: () {},
child: Text("test"),
),
);
If you have a button inside a Column() and want the button to take maximum width, set:
crossAxisAlignment: CrossAxisAlignment.stretch
in your Column widget. Now everything under this Column() will have maximum available width
I struggled with this problem and found what my problem was: I defined all my buttons inside a ListView. Does not matter what I did, the width of the button was always the width of the screen. I replaces ListView by Column and voila - suddenly I could control the button width.
Use SizeBox with width and height parameters
SizedBox(
width: double.infinity,
height: 55.0,
child: ElevatedButton(
.....
),
);
You don't need to use other widget to set the size. You can use minimumSize for ElevatedButton
ElevatedButton(
style: ElevatedButton.styleFrom(
minimumSize: const Size(200, 50),
elevation: 0,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(50), // <-- Radius
),
),
onPressed: (){},
child: const Text("Text", style: TextStyle(fontSize: 20, fontWeight: FontWeight.w500),),
),
To set the height and width of Any Button Just Wrap it with SizedBox. you set easily the height and width of any button by Wrape with SizedBox .
And if you want to give Space between Two Any Kind of Widgets then you can Used SizedBox and inside the SizedBox you use height .As much as you want to give..
wrap your ElevatedButton with a Column PLUS add padding for the button for the style:
Column(
children: [
ElevatedButton(
style: TextButton.styleFrom(
backgroundColor: Colors.green,
padding: const EdgeInsets.symmetric(
horizontal: 20 * 1.5, vertical: 20),
),
onPressed: () {},
child: const Text('text')),],),