Am trying to change the color of my container using the setState Method in onPress but the app crashes with an error of setState isnt defined.And i want to ask for help.Any help provider will be appreciated.Thank you
import 'package:flutter/material.dart';
import 'AllContainers.dart';
import 'ColumnContainer.dart';
import 'AllConstants.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
enum AgeStatus{
child,
old
}
class MyHomePage extends StatefulWidget {
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
AgeStatus? ageStatus;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(
'Practising_Cards'
),
),
body: Column(
children: <Widget>[
Expanded(
child: Row(
children: [
Expanded(
child: AllContainers(
onPress: (){
setState(() {
ageStatus=AgeStatus.child;
});
},
colors: ageStatus==AgeStatus.child?activeColor:
deactiveColor,
mycard:MyColumnItems(
FontAwesomeIcons.mars,'FEMALE'
),
),
),
Expanded(
child: AllContainers(
colors: ageStatus==deactiveColor?activeColor:
deactiveColor,
onPress: (){
setState(() {
ageStatus=AgeStatus.old;
});
},
mycard:MyColumnItems(
FontAwesomeIcons.mars,'FEMALE'
),
),
)
],
),
),
Container(
margin: EdgeInsets.only(top: 5),
width: double.infinity,
height: 50,
color: Colors.red,
),
],
),
);
}
//this is the Container class
import 'package:flutter/material.dart';
import 'NewMain.dart';
class AllContainers extends StatelessWidget {
final Color colors;
final Widget mycard;
final Function onPress;
AllContainers({required this.colors,required this.mycard, required this.onPress});
Widget build(BuildContext context) {
return GestureDetector(
onTap: onPress(),
child: Container(
child: mycard,
margin: EdgeInsets.all(10),
decoration: BoxDecoration(
color: colors,
borderRadius: BorderRadius.circular(20),
),
),
);
}
}
I tried creating a function with the setState in it in the State and passed the function to my onPress method and that also didnt work
CodePudding user response:
You put function instead on VoidCallBack
class AllContainers extends StatelessWidget {
final Color colors;
final Widget mycard;
final VoidCallback onPress; /// update here
....
CodePudding user response:
AllContainers' property onTap has type Function.
But I think your intention is VoidCallback type.
So, you have to change the type of onTap property from Function to VoidCallback
And you have to pass not onPress() but onPress.
class AllContainers extends StatelessWidget {
final Color colors;
final Widget mycard;
// final Function onPress;
final VoidCallback onPress;
AllContainers({
required this.colors,
required this.mycard,
required this.onPress,
});
Widget build(BuildContext context) {
return GestureDetector(
// onTap: onPress(),
onTap: onPress,
child: Container(
child: mycard,
margin: EdgeInsets.all(10),
decoration: BoxDecoration(
color: colors,
borderRadius: BorderRadius.circular(20),
),
),
);
}
}
CodePudding user response:
you should use final VoidCallback onPress inside your AllContainers instead of final Function onPress
this is the class you should use to solve your problem.
class AllContainers extends StatelessWidget {
final Color colors;
final Widget myCard;
final VoidCallback onPress;
const AllContainers({super.key, required this.colors,required this.myCard, required this.onPress});
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: onPress,
child: Container(
margin: const EdgeInsets.all(10),
decoration: BoxDecoration(
color: colors,
borderRadius: BorderRadius.circular(20),
),
child: myCard,
),
);
}
}
please note that to use annotations and use camelCase in your coding. happy coding...
