How to set value on selected items with checkboxListTile - list

What is the correct way to Setstate of checkboxListTile
to get both toggle button and added value to it?
What I want is when you check the box, You see the check button.
then the value added into the base price. Please kindly help.
CheckboxListTile(
activeColor: Colors.blue,
dense: true,
//font change
title: new Text(
listTopping[i].price.toStringAsFixed(0) +
' บาท',
style: TextStyle(
fontSize: 25,
fontWeight: FontWeight.bold,
),
),
value: listTopping[i].isCheck,
secondary: Container(
height: 50,
width: 300,
child: Text(
listTopping[i].topping,
style: TextStyle(
fontSize: 25,
fontWeight: FontWeight.bold,
),
),
),
onChanged: (bool? val) {
itemChange(val!, i);
},
),
Here is the setstate that I believe is wrong...
void itemChange(bool val, int i) {
setState(() {
listTopping[i].isCheck = val;
});
}
}

Here is a small example of your code. Since you didn't provide the AddonTopping class I created a simply version for myself. You can try it out and run this Widget in your MaterialApp. Everything should worked as expected.
class AddonTopping {
AddonTopping({
required this.id,
required this.topping,
required this.isCheck,
required this.price,
});
final int id;
final String topping;
bool isCheck;
final int price;
}
class Americano extends StatefulWidget {
#override
_AmericanoState createState() => _AmericanoState();
}
class _AmericanoState extends State<Americano> {
List<AddonTopping> listTopping = [
AddonTopping(
id: 8,
topping: 'Whipcream',
price: 0,
isCheck: true,
),
AddonTopping(
id: 9,
topping: 'Javachip',
price: 30,
isCheck: false,
),
AddonTopping(
id: 10,
topping: 'SoyMilk',
price: 20,
isCheck: false,
),
AddonTopping(
id: 11,
topping: 'ExtraSyrup',
price: 30,
isCheck: false,
),
];
#override
Widget build(BuildContext context) {
return Column(
children: [
Text('SUM: ${calculatePrice()}'),
ListView.builder(
shrinkWrap: true,
itemCount: listTopping.length,
itemBuilder: (context, i) => CheckboxListTile(
activeColor: Colors.blue,
dense: true,
//font change
title: Text(
listTopping[i].price.toStringAsFixed(0),
style: TextStyle(
fontSize: 25,
fontWeight: FontWeight.bold,
),
),
value: listTopping[i].isCheck,
secondary: Container(
height: 50,
width: 300,
child: Text(
listTopping[i].topping,
style: TextStyle(
fontSize: 25,
fontWeight: FontWeight.bold,
),
),
),
onChanged: (bool? val) {
itemChange(val!, i);
},
),
),
],
);
}
void itemChange(bool val, int i) {
setState(() {
listTopping[i].isCheck = val;
});
}
double calculatePrice() {
if (listTopping.isNotEmpty) {
double _price = 0.0;
// Get those toppings that are chosen (`isCheck` is true)
final chosenTopping = listTopping.where((element) => element.isCheck);
// Calculate the sum
for (final AddonTopping item in chosenTopping) {
if (item.isCheck) {
_price += item.price;
}
}
return _price;
}
return 0.00;
}
}

Related

This is the latest dialogflow flutter... I dont get response from Dialogflow. I get this Error " The method '[]' was called on null."

import 'package:bubble/bubble.dart';
import 'package:dialogflow_flutter/dialogflowFlutter.dart';
import 'package:dialogflow_flutter/googleAuth.dart';
import 'package:dialogflow_flutter/language.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
class ChatBotScreen extends StatefulWidget {
const ChatBotScreen({Key? key}) : super(key: key);
#override
_ChatBotScreenState createState() => _ChatBotScreenState();
}
class _ChatBotScreenState extends State<ChatBotScreen> {
///Dialogflow
void response(query) async {
AuthGoogle authGoogle = await AuthGoogle(fileJson: "assets/services.json").build();
DialogFlow dialogflow = DialogFlow(authGoogle: authGoogle, language: Language.english);
AIResponse aiResponse = await dialogflow.detectIntent(query);
setState(() {
messages.insert(0, {"data": 0, "message":
aiResponse.getListMessage()![0]["text"]["text"][0].toString()
}
);
}
);
}
final messageInsert = TextEditingController();
///list where needed fixing i guess
List<Map> messages = [];
#override
Widget build(BuildContext context) {
return Scaffold(backgroundColor: Colors.white,
appBar: AppBar(
backgroundColor: Colors.black87,
centerTitle: false,
toolbarHeight: 100,
shape: const RoundedRectangleBorder(
borderRadius: BorderRadius.only(
bottomLeft: Radius.circular(30),
bottomRight: Radius.circular(30),
),
),
elevation: 10,
title: const Text("LAIRA",
style: TextStyle(
fontWeight: FontWeight.bold,
fontFamily: 'Lato',
fontSize: 24,
),
),
),
body: Column(
children: <Widget>[
Flexible(
///listview builder
child: ListView.builder(
reverse: true,
itemCount: messages.length,
itemBuilder: (context, index) => chat(
messages[index]["message"].toString(),
messages[index]["data"]
)
)
),
///divider
const Divider(
color: Colors.white,
height: 6.0,
),
Container(
padding: const EdgeInsets.only(left: 15.0, right: 15.0, bottom: 10, top: 10),
///Textfield
margin: const EdgeInsets.symmetric(horizontal: 8.0),
child: Row(
children: [
Flexible(
child: TextField(
controller: messageInsert,
decoration: InputDecoration(
fillColor: Colors.grey[200],
contentPadding:
const EdgeInsets.symmetric(horizontal: 25, vertical: 20),
filled: true,
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(30),
borderSide: const BorderSide(
width: 0,
style: BorderStyle.none,
),
),
hintText: "Type your message...",
hintStyle: const TextStyle(
fontFamily: 'Lato',
fontSize: 18.0)),
)
),
///onpressed send
Container(
margin: const EdgeInsets.symmetric(horizontal: 4.0),
child: IconButton(
icon: const Icon(
Icons.send,
size: 30.0,
),
onPressed: () {
if (messageInsert.text.isEmpty) {
if (kDebugMode) {
print("empty message");
}
} else {
setState(() {
messages.insert(0, {"data": 1, "message": messageInsert.text});
});
response(messageInsert.text);
messageInsert.clear();
FocusScopeNode currentFocus = FocusScope.of(context);
if (!currentFocus.hasPrimaryFocus) {
currentFocus.unfocus();
}
}
}
),
)
],
),
),
const SizedBox(
height: 15.0,
)
],
),
);
}
///chat system
Widget chat(String message, int data) {
return Padding(
padding: const EdgeInsets.all(10.0),
child: Bubble(
radius: const Radius.circular(10.0),
color: data == 0 ? Colors.blue : Colors.black87,
elevation: 5,
alignment: data == 0 ? Alignment.topLeft : Alignment.topRight,
nip: data == 0 ? BubbleNip.leftBottom : BubbleNip.rightTop,
child: Padding(
padding: const EdgeInsets.all(7.0),
child: Row(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
// CircleAvatar(
// backgroundImage: AssetImage(
// data == 0 ? "assets/bot.png" : "assets/user.png"),
// ),
const SizedBox(
width: 10.0,
),
Flexible(
child: Text(
message,
style: const TextStyle(
color: Colors.white,
fontSize: 19,
fontFamily: 'Lato'
),
)
)
],
),
)
),
);
}
}

(Flutter) Listview builder won't show checkboxlist

It does not show any error
but the listview builder doesn't show any checkboxlist.
where did I goes wrong?
Please correct me.
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:selfordering1/models/addon.dart';
import 'package:selfordering1/models/models.dart';
class Americano extends StatefulWidget {
#override
_AmericanoState createState() => _AmericanoState();
}
class _AmericanoState extends State<Americano> {
List<Products> beverages = [];
List<addonsize> listSize = [];
List<addontopping> listTopping = [];
var items = Products().beverages;
bool _value = false;
#override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(''),
leading: IconButton(
icon: Icon(Icons.arrow_back, color: Colors.white),
onPressed: () {
Navigator.pop(context);
},
),
backgroundColor: Colors.transparent,
elevation: 0.0,
),
extendBodyBehindAppBar: true,
body: Container(
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage('assets/lightwood.jpg'),
fit: BoxFit.fill,
),
),
child: ListView(
physics: NeverScrollableScrollPhysics(),
primary: false,
padding: const EdgeInsets.all(100),
children: <Widget>[
Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
width: 200,
height: 200,
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage(items[1].img),
),
),
),
Text(
items[1].name,
style: TextStyle(
fontWeight: FontWeight.bold,
fontSize: 30,
color: Colors.brown),
),
Container(
margin: EdgeInsets.all(50),
child: Text(
items[1].price.toStringAsFixed(0) + ' บาท',
style: TextStyle(
fontWeight: FontWeight.bold,
fontSize: 30,
color: Colors.brown),
),
),
],
),
Row(
children: [
Expanded(
child: ListView.builder(
shrinkWrap: true,
itemCount: listTopping.length,
itemBuilder: (BuildContext context, int i) {
return new Card(
child: new Container(
padding: new EdgeInsets.all(10.0),
child: Column(
children: <Widget>[
new CheckboxListTile(
activeColor: Colors.blue,
dense: true,
//font change
title: new Text(
listTopping[i].topping,
style: TextStyle(
fontSize: 25,
fontWeight: FontWeight.bold,
),
),
value: listTopping[i].isCheck,
secondary: Container(
height: 50,
width: 50,
child: Text(listTopping[i]
.price
.toStringAsFixed(0)),
),
onChanged: (bool? val) {
itemChange(val!, i);
},
),
],
),
),
);
}),
),
],
),
],
),
),
);
}
void itemChange(bool val, int i) {
setState(() {
listTopping[i].isCheck = val;
});
}
}
Here is the model
import 'package:flutter/material.dart';
class addonsize {
int id;
String size;
double price;
addonsize({
required this.id,
required this.size,
required this.price,
});
}
List<addonsize> listSize = [
addonsize(
id: 6,
size: 'Grande',
price: 30,
),
addonsize(
id: 7,
size: 'Venti',
price: 50,
),
];
class addontopping {
int id;
String topping;
double price;
bool isCheck;
addontopping({
required this.id,
required this.topping,
required this.price,
required this.isCheck,
});
}
List<addontopping> listTopping = [
addontopping(
id: 8,
topping: 'Whipcream',
price: 0,
isCheck: true,
),
addontopping(
id: 9,
topping: 'Javachip',
price: 30,
isCheck: false,
),
addontopping(
id: 10,
topping: 'SoyMilk',
price: 20,
isCheck: false,
),
addontopping(
id: 11,
topping: 'ExtraSyrup',
price: 30,
isCheck: false,
),
];
If there are more detailed needed, please let me know.
Also, if it's not too much, I would like the price to adjust accordingly to topping's click. Please show me the examples #_#
The reason is that you are having 2 listTopping and 2 listSize variable in 2 different files. It will prioritize the one in your local _AmericanoState class (which has no data) over the other one (which has data).
To fix this, simply replace the listTopping and listSize inside _AmericanoState with the lists that have data in the other files.
class Americano extends StatefulWidget {
#override
_AmericanoState createState() => _AmericanoState();
}
class _AmericanoState extends State<Americano> {
List<Products> beverages = [];
var items = Products().beverages;
List<addonsize> listSize = [
addonsize(
id: 6,
size: 'Grande',
price: 30,
),
addonsize(
id: 7,
size: 'Venti',
price: 50,
),
];
List<addontopping> listTopping = [
addontopping(
id: 8,
topping: 'Whipcream',
price: 0,
isCheck: true,
),
addontopping(
id: 9,
topping: 'Javachip',
price: 30,
isCheck: false,
),
addontopping(
id: 10,
topping: 'SoyMilk',
price: 20,
isCheck: false,
),
addontopping(
id: 11,
topping: 'ExtraSyrup',
price: 30,
isCheck: false,
),
];
For the price update after every topping chosen, you can use this method. This returns a double value that you can use within your UI:
double calculatePrice() {
if (listTopping.isNotEmpty) {
var _price;
// Get those toppings that are chosen (`isCheck` is true)
final chosenTopping = listTopping.where((element) => element.isCheck);
// Calculate the sum
for (var item in chosenTopping) {
_price += item.price;
}
return _price;
}
return 0.0;
}
Quick note: You should use UpperCamelCase for every class name in Flutter as a good practice (so AddonTopping instead of addontopping). Read more on the styling here
Because your 'CheckboxListTile' is built by 'ListView.builder' with listTopping list.
But in '_AmericanoState' class, listTopping is empty.
...
List<addontopping> listTopping = [];
...
ListView.builder(
shrinkWrap: true,
itemCount: listTopping.length,
itemBuilder: (BuildContext context, int i) {
return new Card(
child: new Container(
padding: new EdgeInsets.all(10.0),
child: Column(
children: <Widget>[
new CheckboxListTile(
You need to change listTopping variable in '_AmericanoState' class like below.
List<addontopping> listTopping = [
addontopping(
id: 8,
topping: 'Whipcream',
price: 0,
isCheck: true,
),
addontopping(
id: 9,
topping: 'Javachip',
price: 30,
isCheck: false,
),
addontopping(
id: 10,
topping: 'SoyMilk',
price: 20,
isCheck: false,
),
addontopping(
id: 11,
topping: 'ExtraSyrup',
price: 30,
isCheck: false,
),
];

Building a List<FlatButton> using Firebase [duplicate]

This question already has answers here:
how to assign future<> to widget in flutter?
(6 answers)
Closed 1 year ago.
I'm building a list of buttons, using Firebase to name each one, but my code presents this error when referencing "_getButtonBar" to the Widget: "The argument type 'Future<List>' can't be assigned to the parameter type 'List'". Should the widget be Future too? Does anyone know what's missing?
class ThemesList extends StatelessWidget {
Future<List<FlatButton>> _getButtonBar(context) async {
List<FlatButton> _list1 = [];
tot = await callReadTotal(); //Receives length to make the loop.
getListCauses(); //Calls Firebase to use arrCauses = List () for child: Text
for (int i = 1; i <= tot; i++) {
_list1.add(
FlatButton(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(30.0),
side: BorderSide(color: Color.fromRGBO(150, 1, 1, 1)),
),
splashColor: Color.fromRGBO(150, 1, 1, 1),
onPressed: () => {
setChoice(i),
Navigator.push(
context,
MaterialPageRoute(builder: (context) => CausesList()),
),
},
child: Text(
arrCauses[i],
style: TextStyle(
color: Color.fromRGBO(150, 1, 1, 1),
fontSize: 20,
fontFamily: 'Balsamiq_Sans',
),
),
),
);
}
return _list1;
}
#override
Widget build(BuildContext context) {
return Platform.isIOS
? CupertinoPageScaffold(child: null)
: Scaffold(
appBar: AppBar(
title: Text(
'ICare',
style: TextStyle(
color: Color.fromRGBO(150, 1, 1, 1),
fontSize: 40,
fontFamily: 'Balsamiq_Sans',
fontWeight: FontWeight.w500,
),
),
flexibleSpace: Image(
image: AssetImage('assets/images/solidariedade.png'),
color: Color.fromRGBO(255, 200, 200, 0.45),
colorBlendMode: BlendMode.modulate,
fit: BoxFit.cover,
),
),
body: Stack(
children: <Widget>[
Container(
child: SingleChildScrollView(
scrollDirection: Axis.vertical,
child: ButtonBar(
children: _getButtonBar(
context), //<-- Here it points out the error.
alignment: MainAxisAlignment.center,
),
),
),
],
),
);
}
}
Your problem can be solve via two options.
By using StatefulWidget
import 'package:flutter/material.dart';
class ThemesList extends StatefulWidget {
#override
_ThemesListState createState() => _ThemesListState();
}
class _ThemesListState extends State<ThemesList> {
List<FlatButton> _buttonBar = [];
#override
void initState() {
_getButtonBar();
super.initState();
}
_getButtonBar() async {
List<FlatButton> _list1 = [];
tot = await callReadTotal(); //Receives length to make the loop.
getListCauses(); //Calls Firebase to use arrCauses = List () for child: Text
for (int i = 1; i <= tot; i++) {
_list1.add(
FlatButton(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(30.0),
side: BorderSide(color: Color.fromRGBO(150, 1, 1, 1)),
),
splashColor: Color.fromRGBO(150, 1, 1, 1),
onPressed: () => {
setChoice(i),
Navigator.push(
context,
MaterialPageRoute(builder: (context) => CausesList()),
),
},
child: Text(
arrCauses[i],
style: TextStyle(
color: Color.fromRGBO(150, 1, 1, 1),
fontSize: 20,
fontFamily: 'Balsamiq_Sans',
),
),
),
);
}
_buttonBar = _list1;
setState(() {});
}
#override
Widget build(BuildContext context) {
return Platform.isIOS
? CupertinoPageScaffold(child: null)
: Scaffold(
appBar: AppBar(
title: Text(
'ICare',
style: TextStyle(
color: Color.fromRGBO(150, 1, 1, 1),
fontSize: 40,
fontFamily: 'Balsamiq_Sans',
fontWeight: FontWeight.w500,
),
),
flexibleSpace: Image(
image: AssetImage('assets/images/solidariedade.png'),
color: Color.fromRGBO(255, 200, 200, 0.45),
colorBlendMode: BlendMode.modulate,
fit: BoxFit.cover,
),
),
body: Stack(
children: <Widget>[
Container(
child: SingleChildScrollView(
scrollDirection: Axis.vertical,
child: ButtonBar(
children: _buttonBar,
alignment: MainAxisAlignment.center,
),
),
),
],
),
);
}
}
By using FutureBuilder
import 'package:flutter/material.dart';
class ThemesList extends StatelessWidget {
Future<List<FlatButton>> _getButtonBar(context) async {
List<FlatButton> _list1 = [];
tot = await callReadTotal(); //Receives length to make the loop.
getListCauses(); //Calls Firebase to use arrCauses = List () for child: Text
for (int i = 1; i <= tot; i++) {
_list1.add(
FlatButton(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(30.0),
side: BorderSide(color: Color.fromRGBO(150, 1, 1, 1)),
),
splashColor: Color.fromRGBO(150, 1, 1, 1),
onPressed: () => {
setChoice(i),
Navigator.push(
context,
MaterialPageRoute(builder: (context) => CausesList()),
),
},
child: Text(
arrCauses[i],
style: TextStyle(
color: Color.fromRGBO(150, 1, 1, 1),
fontSize: 20,
fontFamily: 'Balsamiq_Sans',
),
),
),
);
}
return _list1;
}
#override
Widget build(BuildContext context) {
return Platform.isIOS
? CupertinoPageScaffold(child: null)
: Scaffold(
appBar: AppBar(
title: Text(
'ICare',
style: TextStyle(
color: Color.fromRGBO(150, 1, 1, 1),
fontSize: 40,
fontFamily: 'Balsamiq_Sans',
fontWeight: FontWeight.w500,
),
),
flexibleSpace: Image(
image: AssetImage('assets/images/solidariedade.png'),
color: Color.fromRGBO(255, 200, 200, 0.45),
colorBlendMode: BlendMode.modulate,
fit: BoxFit.cover,
),
),
body: Stack(
children: <Widget>[
Container(
child: SingleChildScrollView(
scrollDirection: Axis.vertical,
child: FutureBuilder<List<FlatButton>>(
future: _getButtonBar(context),
builder: (context,
AsyncSnapshot<List<FlatButton>> snapshot) {
switch (snapshot.connectionState) {
case ConnectionState.waiting:
return Text('Loading....');
break;
default:
if (snapshot.hasError)
return Text('Error: ${snapshot.error}');
else
return ButtonBar(
children: snapshot.data,
alignment: MainAxisAlignment.center,
);
}
}),
),
),
],
),
);
}
}

Flutter Merging List of Images

I was working on merging few images and display it as one.
I have two dart files one is for adding images and other is for displaying the merged result.
first file code is,
class SingleImageUpload extends StatefulWidget {
#override
_SingleImageUploadState createState() {
return _SingleImageUploadState();
}
}
class _SingleImageUploadState extends State<SingleImageUpload> {
List<Object> images = List<Object>();
File _selectedFile;
bool _inProcess = false;
Map data = {};
Readerservice _readerservice;
#override
void initState() {
// TODO: implement initState
super.initState();
setState(() {
images.add("Add Image");
images.add("Add Image");
images.add("Add Image");
images.add("Add Image");
});
}
#override
Widget build(BuildContext context) {
return new MaterialApp(
debugShowCheckedModeBanner: false,
home: new Scaffold(
appBar: AppBar(
backgroundColor: Colors.white,
leading: Padding(
padding: EdgeInsets.only(left: 12),
child: IconButton(
icon: Icon(Icons.arrow_back_ios,
color: Colors.black,
size: 30,),
onPressed: () {
Navigator.pushNamed(context, '/');
},
),
),
title: Row(
mainAxisAlignment: MainAxisAlignment.center,
children:<Widget>[
Text('Basic AppBar'),
]
),
actions: <Widget>[
IconButton(
icon: Icon(Icons.more_vert,
color: Colors.black,
size: 30,),
onPressed: () {
print('Click start');
},
),
],
),
body:
Column(
children: <Widget>[
SizedBox(height: 10),
Row(children: <Widget>[
Text('Image',
style: TextStyle(
color: Colors.black,
fontSize: 33,
fontWeight: FontWeight.bold,
)),
Text('Merger',
style: TextStyle(
color: Colors.orange,
fontSize: 33,
fontWeight: FontWeight.bold,
)),
]),
SizedBox(height: 40),
Text(' merge it here'),
SizedBox(height: 10),
Expanded(
child: buildGridView(),
),
RaisedButton(
textColor: Colors.white,
color: Colors.orange,
child: Text("Finish",
style: TextStyle(fontSize: 15),),
onPressed: () {
pasimage();
},
shape: new RoundedRectangleBorder(
borderRadius: new BorderRadius.circular(8.0),
),
),
],
),
),
);
}
Widget buildGridView() {
return GridView.count(
shrinkWrap: true,
crossAxisCount: 3,
childAspectRatio: 1,
children: List.generate(images.length, (index) {
if (images[index] is ImageUploadModel) {
ImageUploadModel uploadModel = images[index];
return Card(
clipBehavior: Clip.antiAlias,
child: Stack(
children: <Widget>[
Image.file(
uploadModel.imageFile,
width: 300,
height: 300,
),
Positioned(
right: 5,
top: 5,
child: InkWell(
child: Icon(
Icons.remove_circle,
size: 20,
color: Colors.red,
),
onTap: () {
setState(() {
images.replaceRange(index, index + 1, ['Add Image']);
});
},
),
),
],
),
);
} else {
return Card(
child: IconButton(
icon: Icon(Icons.add),
onPressed: () {
//popup
showDialog(
context: context,
builder: (context) {
return Dialog(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10)),
elevation: 16,
child: Container(
height: 180.0,
width: 330.0,
child: ListView(
children: <Widget>[
SizedBox(height: 20),
//Center(
Padding(
padding: const EdgeInsets.only(left: 15.0),
child: Text(
"Add a Receipt",
textAlign: TextAlign.left,
style: TextStyle(
fontSize: 24,
color: Colors.black,
fontWeight: FontWeight.bold),
),
),
// ),
SizedBox(height: 20),
FlatButton(
child: Text(
'Take a photo..',
textAlign: TextAlign.left,
style: TextStyle(fontSize: 20),
),
onPressed: () {
_onAddImageClick(index,ImageSource.camera);
Navigator.of(context).pop();
// picker.getImage(ImageSource.camera);
},
textColor: Colors.black,
),
FlatButton(
child: Text(
'Choose from Library..',
style: TextStyle(fontSize: 20),
textAlign: TextAlign.left,
),
onPressed: () {
_onAddImageClick(index,ImageSource.gallery);
Navigator.of(context).pop();
},
textColor: Colors.black,
),
],
),
),
);
},
);
//pop ends
},
),
);
}
}),
);
}
Future _onAddImageClick(int index, ImageSource source ) async {
setState(() {
_inProcess = true;
});
File image = await ImagePicker.pickImage(source: source);
if(image != null){
File cropped = await ImageCropper.cropImage(
sourcePath: image.path,
maxWidth: 1080,
maxHeight: 1080,
compressFormat: ImageCompressFormat.jpg,
androidUiSettings: AndroidUiSettings(
toolbarColor: Colors.black,
toolbarWidgetColor: Colors.white,
//toolbarTitle: "RPS Cropper",
statusBarColor: Colors.deepOrange.shade900,
backgroundColor: Colors.black,
initAspectRatio: CropAspectRatioPreset.original,
lockAspectRatio: false
),
iosUiSettings: IOSUiSettings(
minimumAspectRatio: 1.0,
)
);
this.setState((){
_selectedFile = cropped ;
_inProcess = false;
});
} else {
this.setState((){
_inProcess = false;
});
}
getFileImage(index);
}
void getFileImage(int index) async {
// var dir = await path_provider.getTemporaryDirectory();
setState(() {
ImageUploadModel imageUpload = new ImageUploadModel();
imageUpload.isUploaded = false;
imageUpload.uploading = false;
imageUpload.imageFile = _selectedFile;
imageUpload.imageUrl = '';
images.replaceRange(index, index + 1, [imageUpload]);
});
}
void pasimage(){
Navigator.pushReplacementNamed(context, '/crop',arguments: {
'imageList':ImagesMerge(
images,///required,images list
direction: Axis.vertical,///direction
backgroundColor: Colors.black26,///background color
fit: false,///scale image to fit others
),
});
}
}
class ImageUploadModel {
bool isUploaded;
bool uploading;
File imageFile;
String imageUrl;
ImageUploadModel({
this.isUploaded,
this.uploading,
this.imageFile,
this.imageUrl,
});
}
when I tap the finish button after adding the images it shows an error
The following _TypeError was thrown while handling a gesture:
type 'List' is not a subtype of type 'List'
The page just on captures the data sent from the code above and display the image.
please if anyone know why is the error and help me .
Change the images to List<Object> images = [].

Use Arrows to Navigate through list / change Widget

I am currently struggling to implement a "list" with two QR-Codes.
I want to change the shown QR code by pressing the arrows left and right to it.
"list" because currently I don't use a list view.
Currently it looks like this: Current App
The QR codes are within a ModalBottomSheet.
Here is my code so far:
void _onButtonPressed() {
bool inAppQr = true;
String _output = "QR 1";
showModalBottomSheet(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10.0),
),
context: context,
builder: (context) {
return Container(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
_output,
style:
TextStyle(fontWeight: FontWeight.bold, fontSize: 15.0),
),
SizedBox(
height: 30,
),
SizedBox(
height: 5,
width: 150,
child: LinearProgressIndicator(
backgroundColor: Colors.white,
valueColor: AlwaysStoppedAnimation<Color>(
Colors.blueGrey,
),
),
),
SizedBox(
height: 30,
),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
IconButton(
icon: Icon(Icons.arrow_back_ios),
onPressed: () {
setState(() {
inAppQr = false;
_output = "QR 1";
});
}),
inAppQr == true
? PrettyQr(
typeNumber: 3,
size: 150,
data: 'Test',
errorCorrectLevel: QrErrorCorrectLevel.M,
roundEdges: true)
: PrettyQr(
typeNumber: 3,
size: 150,
data: 'Test 2',
errorCorrectLevel: QrErrorCorrectLevel.M,
roundEdges: true),
IconButton(
icon: Icon(Icons.arrow_forward_ios),
onPressed: () {
setState(() {
_output = "QR 2";
inAppQr = true;
});
}),
],
),
]),
);
});
}
Thanks for your help!
Solution found thanks to Zeeshan Hussain!
I added a StatefulBuilder with the StateSetter newState
This code worked for me:
void _onButtonPressed() {
bool inAppQr = true;
String _output = "QR 1";
showModalBottomSheet(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10.0),
),
context: context,
builder: (context) {
return StatefulBuilder(
builder: (BuildContext context, StateSetter newState) {
return Container(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
_output,
style: TextStyle(
fontWeight: FontWeight.bold, fontSize: 15.0),
),
SizedBox(
height: 30,
),
SizedBox(
height: 5,
width: 150,
child: LinearProgressIndicator(
backgroundColor: Colors.white,
valueColor: AlwaysStoppedAnimation<Color>(
Colors.blueGrey,
),
),
),
SizedBox(
height: 30,
),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
IconButton(
icon: Icon(Icons.arrow_back_ios),
onPressed: () {
newState(() {
inAppQr = true;
_output = "QR 1";
});
}),
inAppQr == true
? PrettyQr(
typeNumber: 3,
size: 150,
data: 'Test',
errorCorrectLevel: QrErrorCorrectLevel.M,
roundEdges: true)
: PrettyQr(
typeNumber: 3,
size: 150,
data: 'Test 2',
errorCorrectLevel: QrErrorCorrectLevel.M,
roundEdges: true),
IconButton(
icon: Icon(Icons.arrow_forward_ios),
onPressed: () {
newState(() {
_output = "QR 2";
inAppQr = false;
});
}),
],
),
]),
);
},
);
});