Home > Mobile >  SetState isnt defined in StatefulWidgt
SetState isnt defined in StatefulWidgt

Time:01-13

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...

  • Related