See the image first:
enter image description here
So i have made a news app using https://newsapi.org/s/google-news-in-api
Code:
Widget build(BuildContext context) {
return Container(
child: Center(
child: isLoading
? CircularProgressIndicator()
: ListView.builder(
itemCount: newsData == null ? 0 : newsData.length,
itemBuilder: (context, int index) {
return GestureDetector(
onTap: () => Navigator.of(context).pushNamed("/headlines"),
child: Card(
margin: EdgeInsets.all(10),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(15),
),
elevation: 5,
child: Column(
children: <Widget>[
ClipRRect(
borderRadius: BorderRadius.only(
topLeft: Radius.circular(15),
topRight: Radius.circular(15),
),
child: Image.network(newsData[index]['urlToImage']),
),
Padding(
padding: const EdgeInsets.all(8.0),
child: Text(
newsData[index]['title'],
style: TextStyle(
fontSize: 23.0, fontWeight: FontWeight.bold),
),
),
Padding(
padding: const EdgeInsets.all(8.0),
child:
Align(
alignment: Alignment.bottomLeft,
child: Text(
newsData[index]['publishedAt'][11]
),
),
)
],
),
semanticContainer: false,
color: Colors.white70,
),
);
},
),
So how can i open the news website when the card is clicked/tapped in this app itself,
I mean how should i open the news website in this app rather than open it up in the browser using url_launcher
Note: I found a plugin "flutter_webview_plugin"
But still not able to implement it.
Also do remember that I need to keep the index number common for both the card and the source url.
Edit add click event to image
https://inducesmile.com/google-flutter/how-to-add-on-click-event-to-image-in-flutter/
You can wrap you news image with GestureDetector and do action in onTap
GestureDetector(
onTap: () {
Navigator.push(context, MaterialPageRoute(builder: (BuildContext context) => MyInAppWebView(webUrl: newsData[index][url],webRect: Rect.fromLTWH(0, 0, 300, 300))));
);
},
child: CircleAvatar(
backgroundImage: ExactAssetImage('assets/images/umbrella.png'),
minRadius: 80,
maxRadius: 120,
),
),
You can use https://pub.dev/packages/flutter_inappbrowser
You can display in widget directly or
Navigator.push(context, MaterialPageRoute(builder: (BuildContext context) => MyInAppWebView(webUrl: "https://flutter.dev/",webRect: Rect.fromLTWH(0, 0, 300, 300))));
You can reference both situations in my full code
the simple MyInAppWebView just pass webUrl and WebRect
or you can reference complex demo (picture 2) in official site
class MyInAppWebView extends StatelessWidget {
String webUrl;
final Rect webRect;
InAppWebViewController webView;
MyInAppWebView({Key key, this.webUrl, this.webRect}) : super(key: key);
#override
Widget build(BuildContext context) {
InAppWebView webWidget = new InAppWebView(
initialUrl: webUrl,
initialHeaders: {},
initialOptions: {},
onWebViewCreated: (InAppWebViewController controller) {
webView = controller;
},
onLoadStart: (InAppWebViewController controller, String url) {
print("InAppWebView.onLoadStart: $url");
this.webUrl = url;
},
onProgressChanged: (InAppWebViewController controller, int progress) {
double prog = progress / 100;
print('InAppWebView.onProgressChanged: $prog');
});
return Container(
width: webRect.width,
height: webRect.height,
child: webWidget,
);
}
}
full code
import 'package:flutter/material.dart';
import 'package:flutter_inappbrowser/flutter_inappbrowser.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
// This widget is the root of your application.
#override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
// This is the theme of your application.
//
// Try running your application with "flutter run". You'll see the
// application has a blue toolbar. Then, without quitting the app, try
// changing the primarySwatch below to Colors.green and then invoke
// "hot reload" (press "r" in the console where you ran "flutter run",
// or simply save your changes to "hot reload" in a Flutter IDE).
// Notice that the counter didn't reset back to zero; the application
// is not restarted.
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
// This widget is the home page of your application. It is stateful, meaning
// that it has a State object (defined below) that contains fields that affect
// how it looks.
// This class is the configuration for the state. It holds the values (in this
// case the title) provided by the parent (in this case the App widget) and
// used by the build method of the State. Fields in a Widget subclass are
// always marked "final".
final String title;
#override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
int _counter = 0;
void _incrementCounter() {
setState(() {
Navigator.push(context, MaterialPageRoute(builder: (BuildContext context) => MyInAppWebView(webUrl: "https://flutter.dev/",webRect: Rect.fromLTWH(0, 0, 300, 300))));
// This call to setState tells the Flutter framework that something has
// changed in this State, which causes it to rerun the build method below
// so that the display can reflect the updated values. If we changed
// _counter without calling setState(), then the build method would not be
// called again, and so nothing would appear to happen.
_counter++;
});
}
#override
Widget build(BuildContext context) {
// This method is rerun every time setState is called, for instance as done
// by the _incrementCounter method above.
//
// The Flutter framework has been optimized to make rerunning build methods
// fast, so that you can just rebuild anything that needs updating rather
// than having to individually change instances of widgets.
return Scaffold(
appBar: AppBar(
// Here we take the value from the MyHomePage object that was created by
// the App.build method, and use it to set our appbar title.
title: Text(widget.title),
),
body: Center(
// Center is a layout widget. It takes a single child and positions it
// in the middle of the parent.
child: Column(
// Column is also a layout widget. It takes a list of children and
// arranges them vertically. By default, it sizes itself to fit its
// children horizontally, and tries to be as tall as its parent.
//
// Invoke "debug painting" (press "p" in the console, choose the
// "Toggle Debug Paint" action from the Flutter Inspector in Android
// Studio, or the "Toggle Debug Paint" command in Visual Studio Code)
// to see the wireframe for each widget.
//
// Column has various properties to control how it sizes itself and
// how it positions its children. Here we use mainAxisAlignment to
// center the children vertically; the main axis here is the vertical
// axis because Columns are vertical (the cross axis would be
// horizontal).
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Expanded( child: MyInAppWebView(webUrl: "https://flutter.dev/", webRect: Rect.fromLTWH(0, 0, 300, 300),)),
Text(
'You have pushed the button this many times:',
),
Text(
'$_counter',
style: Theme.of(context).textTheme.display1,
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
tooltip: 'Increment',
child: Icon(Icons.add),
), // This trailing comma makes auto-formatting nicer for build methods.
);
}
}
class MyInAppWebView extends StatelessWidget {
String webUrl;
final Rect webRect;
InAppWebViewController webView;
MyInAppWebView({Key key, this.webUrl, this.webRect}) : super(key: key);
#override
Widget build(BuildContext context) {
InAppWebView webWidget = new InAppWebView(
initialUrl: webUrl,
initialHeaders: {},
initialOptions: {},
onWebViewCreated: (InAppWebViewController controller) {
webView = controller;
},
onLoadStart: (InAppWebViewController controller, String url) {
print("InAppWebView.onLoadStart: $url");
this.webUrl = url;
},
onProgressChanged: (InAppWebViewController controller, int progress) {
double prog = progress / 100;
print('InAppWebView.onProgressChanged: $prog');
});
return Container(
width: webRect.width,
height: webRect.height,
child: webWidget,
);
}
}
example code demo
official demo
Did you try forceWebview option as explained in https://medium.com/#muaazmusthafa08/how-to-load-a-web-page-in-flutter-app-607fa9184e4a
Related
I want the buttons on flutter to be either side of screen i.e one on the bottom right and one on the bottom left.
I want the minus button on the left side of screen :
I have searched online but I can't find any help, I have tried to use align but it just gives something messy.
My code for the flutter is(some changes in demo app and using Align):
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
// This widget is the root of your application.
#override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
// This is the theme of your application.
//
// Try running your application with "flutter run". You'll see the
// application has a blue toolbar. Then, without quitting the app, try
// changing the primarySwatch below to Colors.green and then invoke
// "hot reload" (press "r" in the console where you ran "flutter run",
// or simply save your changes to "hot reload" in a Flutter IDE).
// Notice that the counter didn't reset back to zero; the application
// is not restarted.
primarySwatch: Colors.red,
),
home: const MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({Key? key, required this.title}) : super(key: key);
// This widget is the home page of your application. It is stateful, meaning
// that it has a State object (defined below) that contains fields that affect
// how it looks.
// This class is the configuration for the state. It holds the values (in this
// case the title) provided by the parent (in this case the App widget) and
// used by the build method of the State. Fields in a Widget subclass are
// always marked "final".
final String title;
#override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
int _counter = 0;
void _incrementCounter() {
setState(() {
// This call to setState tells the Flutter framework that something has
// changed in this State, which causes it to rerun the build method below
// so that the display can reflect the updated values. If we changed
// _counter without calling setState(), then the build method would not be
// called again, and so nothing would appear to happen.
_counter++;
});
}
void _decrementCounter(){
setState(() {
-_counter --;
});
}
#override
Widget build(BuildContext context) {
// This method is rerun every time setState is called, for instance as done
// by the _incrementCounter method above.
//
// The Flutter framework has been optimized to make rerunning build methods
// fast, so that you can just rebuild anything that needs updating rather
// than having to individually change instances of widgets.
return Scaffold(
appBar: AppBar(
// Here we take the value from the MyHomePage object that was created by
// the App.build method, and use it to set our appbar title.
title: Text(widget.title),
),
body: Center(
// Center is a layout widget. It takes a single child and positions it
// in the middle of the parent.
child: Column(
// Column is also a layout widget. It takes a list of children and
// arranges them vertically. By default, it sizes itself to fit its
// children horizontally, and tries to be as tall as its parent.
//
// Invoke "debug painting" (press "p" in the console, choose the
// "Toggle Debug Paint" action from the Flutter Inspector in Android
// Studio, or the "Toggle Debug Paint" command in Visual Studio Code)
// to see the wireframe for each widget.
//
// Column has various properties to control how it sizes itself and
// how it positions its children. Here we use mainAxisAlignment to
// center the children vertically; the main axis here is the vertical
// axis because Columns are vertical (the cross axis would be
// horizontal).
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
const Text(
'You have pushed the button this many times:',
),
Text(
'$_counter',
style: Theme.of(context).textTheme.headline4,
),
],
),
),
floatingActionButton:
Row(
mainAxisAlignment: MainAxisAlignment.end,
children :
[
Align(
alignment: Alignment.bottomLeft,
child : FloatingActionButton(
onPressed: _decrementCounter,
tooltip: 'decrement',
child: const Icon(Icons.remove),
heroTag: null,
)),
FloatingActionButton(
onPressed: _incrementCounter,
tooltip: 'Increment',
child: const Icon(Icons.add),
heroTag: null,
) ,
]),
// This trailing comma makes auto-formatting nicer for build methods.
);
}
}
How can I achieve this?
One option is to use mainAxisAlignment: MainAxisAlignment.spaceBetween in the Row widget, combined with setting floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat. You can use Padding to add some space horizontally:
floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat,
floatingActionButton: Padding(
padding: const EdgeInsets.symmetric(horizontal: 16.0),
child:
Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [
FloatingActionButton(
onPressed: _decrementCounter,
tooltip: 'decrement',
child: const Icon(Icons.remove),
heroTag: null,
),
FloatingActionButton(
onPressed: _incrementCounter,
tooltip: 'Increment',
child: const Icon(Icons.add),
heroTag: null,
),
])),
But you original plan with Align works as well, you just need to but the two FABs into a Stack widget, it means that these will be placed upon each other (like layers), and you can set a bottom left and bottom right alignment respectively:
floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat,
floatingActionButton: Padding(
padding: const EdgeInsets.symmetric(horizontal: 16.0),
child: Stack(children: [
Align(
alignment: Alignment.bottomLeft,
child: FloatingActionButton(
onPressed: _decrementCounter,
tooltip: 'decrement',
child: const Icon(Icons.remove),
heroTag: null,
)),
Align(
alignment: Alignment.bottomRight,
child: FloatingActionButton(
onPressed: _incrementCounter,
tooltip: 'Increment',
child: const Icon(Icons.add),
heroTag: null,
)),
])),
how to set icon to floating action button with flutter same this photo
Please see the picture
You can use the Badge plugin to achive that.
see the plugin : - Badge plugin
Use the badge property like this:-
Badge(
badgeContent: Text('3'),
child: Icon(Icons.settings),
)
You can wrap the floating action button with this.
Floating action button code:-
floatingActionButton: Badge(
badgeColor: const Color.fromARGB(255, 231, 15, 87),
borderRadius: BorderRadius.circular(40),
badgeContent: const Padding(
padding: EdgeInsets.all(5.0),
child: Text(
'3',
style: TextStyle(color: Colors.white),
),
),
child: FloatingActionButton(
backgroundColor: const Color.fromARGB(255, 231, 15, 87),
onPressed: _incrementCounter,
tooltip: 'Increment',
child: const Icon(Icons.add),
),
),
Full code
import 'package:badges/badges.dart';
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
// This widget is the root of your application.
#override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
// This is the theme of your application.
//
// Try running your application with "flutter run". You'll see the
// application has a blue toolbar. Then, without quitting the app, try
// changing the primarySwatch below to Colors.green and then invoke
// "hot reload" (press "r" in the console where you ran "flutter run",
// or simply save your changes to "hot reload" in a Flutter IDE).
// Notice that the counter didn't reset back to zero; the application
// is not restarted.
primarySwatch: Colors.blue,
),
home: const MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({Key? key, required this.title}) : super(key: key);
// This widget is the home page of your application. It is stateful, meaning
// that it has a State object (defined below) that contains fields that affect
// how it looks.
// This class is the configuration for the state. It holds the values (in this
// case the title) provided by the parent (in this case the App widget) and
// used by the build method of the State. Fields in a Widget subclass are
// always marked "final".
final String title;
#override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
int _counter = 0;
void _incrementCounter() {
setState(() {
// This call to setState tells the Flutter framework that something has
// changed in this State, which causes it to rerun the build method below
// so that the display can reflect the updated values. If we changed
// _counter without calling setState(), then the build method would not be
// called again, and so nothing would appear to happen.
_counter++;
});
}
#override
Widget build(BuildContext context) {
// This method is rerun every time setState is called, for instance as done
// by the _incrementCounter method above.
//
// The Flutter framework has been optimized to make rerunning build methods
// fast, so that you can just rebuild anything that needs updating rather
// than having to individually change instances of widgets.
return Scaffold(
appBar: AppBar(
// Here we take the value from the MyHomePage object that was created by
// the App.build method, and use it to set our appbar title.
title: Text(widget.title),
),
body: Center(
// Center is a layout widget. It takes a single child and positions it
// in the middle of the parent.
child: Column(
// Column is also a layout widget. It takes a list of children and
// arranges them vertically. By default, it sizes itself to fit its
// children horizontally, and tries to be as tall as its parent.
//
// Invoke "debug painting" (press "p" in the console, choose the
// "Toggle Debug Paint" action from the Flutter Inspector in Android
// Studio, or the "Toggle Debug Paint" command in Visual Studio Code)
// to see the wireframe for each widget.
//
// Column has various properties to control how it sizes itself and
// how it positions its children. Here we use mainAxisAlignment to
// center the children vertically; the main axis here is the vertical
// axis because Columns are vertical (the cross axis would be
// horizontal).
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
const Text(
'You have pushed the button this many times:',
),
Text(
'$_counter',
style: Theme.of(context).textTheme.headline4,
),
],
),
),
floatingActionButton: Badge(
badgeColor: const Color.fromARGB(255, 231, 15, 87),
borderRadius: BorderRadius.circular(40),
badgeContent: const Padding(
padding: EdgeInsets.all(5.0),
child: Text(
'3',
style: TextStyle(color: Colors.white),
),
),
child: FloatingActionButton(
backgroundColor: const Color.fromARGB(255, 231, 15, 87),
onPressed: _incrementCounter,
tooltip: 'Increment',
child: const Icon(Icons.add),
),
), // This trailing comma makes auto-formatting nicer for build methods.
);
}
}
Output
Stack your container with another upper-right corner container:
Stack(
children: [
Container( width: 30, height: 30, decoration: BoxDecoration( image: DecorationImage( image: const AssetImage('assets/images/shop.png'), fit: BoxFit.contain, ), ), ), ),
Positioned(
right: 20,
top: 20,
child: Container( width: 5, height: 5
]
How to increase the height of raised button having icon? Because padding is not working after using RaisedButton.icon.
You could wrap the icon with Padding, like this:
RaisedButton.icon(
icon: Padding(
padding: EdgeInsets.only(left: 50, top: 20, right: 50, bottom: 15),
child: Icon(Icons.ac_unit),
),
...
)
Work fine with SizeBox
Padding(
padding: const EdgeInsets.all(8.0),
child: SizedBox(
height: 100,
width: 300, // specific value
child: RaisedButton.icon(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(40.0)),
onPressed: () {},
icon: Icon(Icons.ac_unit),
label: Text("abc"))),
),
full code
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
// This widget is the root of your application.
#override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
// This is the theme of your application.
//
// Try running your application with "flutter run". You'll see the
// application has a blue toolbar. Then, without quitting the app, try
// changing the primarySwatch below to Colors.green and then invoke
// "hot reload" (press "r" in the console where you ran "flutter run",
// or simply save your changes to "hot reload" in a Flutter IDE).
// Notice that the counter didn't reset back to zero; the application
// is not restarted.
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
// This widget is the home page of your application. It is stateful, meaning
// that it has a State object (defined below) that contains fields that affect
// how it looks.
// This class is the configuration for the state. It holds the values (in this
// case the title) provided by the parent (in this case the App widget) and
// used by the build method of the State. Fields in a Widget subclass are
// always marked "final".
final String title;
#override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
int _counter = 0;
void _incrementCounter() {
setState(() {
// This call to setState tells the Flutter framework that something has
// changed in this State, which causes it to rerun the build method below
// so that the display can reflect the updated values. If we changed
// _counter without calling setState(), then the build method would not be
// called again, and so nothing would appear to happen.
_counter++;
});
}
#override
Widget build(BuildContext context) {
// This method is rerun every time setState is called, for instance as done
// by the _incrementCounter method above.
//
// The Flutter framework has been optimized to make rerunning build methods
// fast, so that you can just rebuild anything that needs updating rather
// than having to individually change instances of widgets.
return Scaffold(
appBar: AppBar(
// Here we take the value from the MyHomePage object that was created by
// the App.build method, and use it to set our appbar title.
title: Text(widget.title),
),
body: Center(
// Center is a layout widget. It takes a single child and positions it
// in the middle of the parent.
child: Column(
// Column is also a layout widget. It takes a list of children and
// arranges them vertically. By default, it sizes itself to fit its
// children horizontally, and tries to be as tall as its parent.
//
// Invoke "debug painting" (press "p" in the console, choose the
// "Toggle Debug Paint" action from the Flutter Inspector in Android
// Studio, or the "Toggle Debug Paint" command in Visual Studio Code)
// to see the wireframe for each widget.
//
// Column has various properties to control how it sizes itself and
// how it positions its children. Here we use mainAxisAlignment to
// center the children vertically; the main axis here is the vertical
// axis because Columns are vertical (the cross axis would be
// horizontal).
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Padding(
padding: const EdgeInsets.all(8.0),
child: SizedBox(
height: 100,
width: 300, // specific value
child: RaisedButton.icon(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(40.0)),
onPressed: () {},
icon: Icon(Icons.ac_unit),
label: Text("abc"))),
),
Text(
'You have pushed the button this many times:',
),
Text(
'$_counter',
style: Theme.of(context).textTheme.display1,
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
tooltip: 'Increment',
child: Icon(Icons.add),
), // This trailing comma makes auto-formatting nicer for build methods.
);
}
}
String selectedValue;
Widget _dropDownMenu<String>({String title, List<String> list, List<String> strList, Function(String) onChange}) {
return Container(
decoration: containerDecoration(border: Border.all(color: Colors.grey)),
width: MediaQuery.of(context).size.width - 20,
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
SizedBox(width: 10),
Container(
width: MediaQuery.of(context).size.width - 60,
child: DropdownButtonHideUnderline(
child: DropdownButton<String>(
value: selectedValue,
hint: Text(title),
items: List.generate(list.length, (index) {
return DropdownMenuItem<String>(
value: list[index],
child: Text(strList[index], key: UniqueKey()),
);
}),
onChanged: (value) {
setState(() {
selectedValue = value;
onChange(value);
});
}
)
),
),
SizedBox(width: 10)
]
)
);
}
this code give me this message
lib/src/ui/Filter_page.dart:136:24: Error: The argument type
'String/1/' can't be assigned to the parameter type 'String/2/'.
- 'String/1/' is from 'dart:core'.
- 'String/2/' is from 'package:fundaqah_flutter/src/ui/Filter_page.dart'
('lib/src/ui/Filter_page.dart'). Try changing the type of the
parameter, or casting the argument to 'String/2/'.
value: selectedValue,
and .toString() not working
Please remove <String> and error will disappear
_dropDownMenu<String>({String title
to
Widget _dropDownMenu({String title
for test, I update some Container width, you can see full test code
full test code
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
// This widget is the root of your application.
#override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
// This is the theme of your application.
//
// Try running your application with "flutter run". You'll see the
// application has a blue toolbar. Then, without quitting the app, try
// changing the primarySwatch below to Colors.green and then invoke
// "hot reload" (press "r" in the console where you ran "flutter run",
// or simply save your changes to "hot reload" in a Flutter IDE).
// Notice that the counter didn't reset back to zero; the application
// is not restarted.
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
// This widget is the home page of your application. It is stateful, meaning
// that it has a State object (defined below) that contains fields that affect
// how it looks.
// This class is the configuration for the state. It holds the values (in this
// case the title) provided by the parent (in this case the App widget) and
// used by the build method of the State. Fields in a Widget subclass are
// always marked "final".
final String title;
#override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
int _counter = 0;
void _incrementCounter() {
setState(() {
// This call to setState tells the Flutter framework that something has
// changed in this State, which causes it to rerun the build method below
// so that the display can reflect the updated values. If we changed
// _counter without calling setState(), then the build method would not be
// called again, and so nothing would appear to happen.
_counter++;
});
}
String selectedValue;
Widget _dropDownMenu(
{String title,
List<String> list,
List<String> strList,
Function(String) onChange}) {
return Container(
//decoration: containerDecoration(border: Border.all(color: Colors.grey)),
//height: 100,
//width: MediaQuery.of(context).size.width - 20,
child:
Row(mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[
SizedBox(width: 10),
Container(
//width: MediaQuery.of(context).size.width - 60,
child: DropdownButtonHideUnderline(
child: DropdownButton<String>(
value: selectedValue,
hint: Text(title),
items: List.generate(list.length, (index) {
return DropdownMenuItem<String>(
value: list[index],
child: Text(strList[index], key: UniqueKey()),
);
}),
onChanged: (String value) {
setState(() {
selectedValue = value;
onChange(value);
});
})),
),
SizedBox(width: 10)
]));
}
#override
Widget build(BuildContext context) {
// This method is rerun every time setState is called, for instance as done
// by the _incrementCounter method above.
//
// The Flutter framework has been optimized to make rerunning build methods
// fast, so that you can just rebuild anything that needs updating rather
// than having to individually change instances of widgets.
return Scaffold(
appBar: AppBar(
// Here we take the value from the MyHomePage object that was created by
// the App.build method, and use it to set our appbar title.
title: Text(widget.title),
),
body: Center(
// Center is a layout widget. It takes a single child and positions it
// in the middle of the parent.
child: Column(
// Column is also a layout widget. It takes a list of children and
// arranges them vertically. By default, it sizes itself to fit its
// children horizontally, and tries to be as tall as its parent.
//
// Invoke "debug painting" (press "p" in the console, choose the
// "Toggle Debug Paint" action from the Flutter Inspector in Android
// Studio, or the "Toggle Debug Paint" command in Visual Studio Code)
// to see the wireframe for each widget.
//
// Column has various properties to control how it sizes itself and
// how it positions its children. Here we use mainAxisAlignment to
// center the children vertically; the main axis here is the vertical
// axis because Columns are vertical (the cross axis would be
// horizontal).
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
_dropDownMenu(
title: "",
list: ["a", "b"],
strList: ["a", "b"],
onChange: (value) => {print("CLICKED")}
),
Text(
'You have pushed the button this many times:',
),
Text(
'$_counter',
style: Theme.of(context).textTheme.display1,
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
tooltip: 'Increment',
child: Icon(Icons.add),
), // This trailing comma makes auto-formatting nicer for build methods.
);
}
}
The avatar image's size doesn't want to change and i can't control the spacing
This is how i want to change it :
FilterChip(
backgroundColor: _changeColor(t),
avatar: Image.asset('assets/types/$t.png',),
label: Text(t,overflow: TextOverflow.ellipsis,
style: TextStyle(color: Colors.white)),onSelected: (b){},
),
You can control avatar with Container and FilterChip has padding and labelPadding, you can chnage padding per your request
code snippet
FilterChip(
padding: const EdgeInsets.only(left: 22.0),
labelPadding: const EdgeInsets.only(left: 22.0),
avatar: Container(
width: 190.0,
height: 190.0,
decoration: new BoxDecoration(
shape: BoxShape.circle,
image: new DecorationImage(
fit: BoxFit.fill,
image: new NetworkImage(
"https://i.imgur.com/BoN9kdC.png")))),
label: Text("Poison"),
//selected: badCategoryIds.contains(category.id),
onSelected: (bool value) {},
),
full code
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
// This widget is the root of your application.
#override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
// This is the theme of your application.
//
// Try running your application with "flutter run". You'll see the
// application has a blue toolbar. Then, without quitting the app, try
// changing the primarySwatch below to Colors.green and then invoke
// "hot reload" (press "r" in the console where you ran "flutter run",
// or simply save your changes to "hot reload" in a Flutter IDE).
// Notice that the counter didn't reset back to zero; the application
// is not restarted.
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
// This widget is the home page of your application. It is stateful, meaning
// that it has a State object (defined below) that contains fields that affect
// how it looks.
// This class is the configuration for the state. It holds the values (in this
// case the title) provided by the parent (in this case the App widget) and
// used by the build method of the State. Fields in a Widget subclass are
// always marked "final".
final String title;
#override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
int _counter = 0;
void _incrementCounter() {
setState(() {
// This call to setState tells the Flutter framework that something has
// changed in this State, which causes it to rerun the build method below
// so that the display can reflect the updated values. If we changed
// _counter without calling setState(), then the build method would not be
// called again, and so nothing would appear to happen.
_counter++;
});
}
#override
Widget build(BuildContext context) {
// This method is rerun every time setState is called, for instance as done
// by the _incrementCounter method above.
//
// The Flutter framework has been optimized to make rerunning build methods
// fast, so that you can just rebuild anything that needs updating rather
// than having to individually change instances of widgets.
return Scaffold(
appBar: AppBar(
// Here we take the value from the MyHomePage object that was created by
// the App.build method, and use it to set our appbar title.
title: Text(widget.title),
),
body: Center(
// Center is a layout widget. It takes a single child and positions it
// in the middle of the parent.
child: Column(
// Column is also layout widget. It takes a list of children and
// arranges them vertically. By default, it sizes itself to fit its
// children horizontally, and tries to be as tall as its parent.
//
// Invoke "debug painting" (press "p" in the console, choose the
// "Toggle Debug Paint" action from the Flutter Inspector in Android
// Studio, or the "Toggle Debug Paint" command in Visual Studio Code)
// to see the wireframe for each widget.
//
// Column has various properties to control how it sizes itself and
// how it positions its children. Here we use mainAxisAlignment to
// center the children vertically; the main axis here is the vertical
// axis because Columns are vertical (the cross axis would be
// horizontal).
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
FilterChip(
padding: const EdgeInsets.only(left: 22.0),
labelPadding: const EdgeInsets.only(left: 22.0),
avatar: Container(
width: 190.0,
height: 190.0,
decoration: new BoxDecoration(
shape: BoxShape.circle,
image: new DecorationImage(
fit: BoxFit.fill,
image: new NetworkImage(
"https://i.imgur.com/BoN9kdC.png")))),
label: Text("Poison"),
//selected: badCategoryIds.contains(category.id),
onSelected: (bool value) {},
),
Padding(
padding: const EdgeInsets.all(8.0),
child: Text(
'You have pushed the button this many times:',
),
),
Text(
'$_counter',
style: Theme.of(context).textTheme.display1,
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
tooltip: 'Increment',
child: Icon(Icons.add),
), // This trailing comma makes auto-formatting nicer for build methods.
);
}
}
demo no padding
demo after add padding