मैं स्पंदन के लिए नया हूँ और मैं कुछ अभ्यास करता हूँ। मेरे पास एक StatelessWidget है जिसे doChange और makeChange और एक StatefulWidget कहा जाता है। यह क्लास जो स्टेटफुलविजेट है मैंने ऐप के होम पेज का भी चाइल्ड बना दिया है। लेकिन, मुझे लगता है कि यहां परिभाषित करना अनावश्यक है। इस मामले में मेरा उद्देश्य यह है कि, मैं बटन की स्थिति को बदलना चाहता हूं make open,make closed और साथ ही साथ टेक्स्ट open और close भी बदल जाएगा। मुझे लगता है कि कक्षा changeText में कोई समस्या नहीं है लेकिन makeChange कक्षा में मुझे onPress में कॉल करने के लिए कंस्ट्रक्टर और फ़ंक्शन बनाने में कुछ परेशानी है। राज्य नहीं बदलते हैं। मैं इसे कैसे हल कर सकता हूं या यह बिना किसी कार्य के ऐसा करने का कोई तरीका है?

class changeText extends StatelessWidget{

  final doChange;  
  changeText({@required this.doChange}); 

   @override
   Widget build(BuildContext context){
     return Container(
        //some codes
        //some codes
        child: doChange ? Text("open") : Text("close"),
     );
   }
}
class makeChange extends StatelessWidget{ 
     
     final changeState;
     makeChange({@required this.changeState}); // I want to add constructor here lets say onPressButton 

     whenPressed(){ // I want to create a function with the that constructor that I have add.
          
     }
     @override
     Widget build(BuildContext context){
       return Container(
            //some codes
            //
           child: Column(
              children: [
                MaterialButton(
                  //some codes
                  //
                  onPressed: () {} // Here I want to call a function when press the button. 
                  child: changeState ? Text("make open") : Text("make close"),
                ),
              ],
            ),
       );
     }
} 
class Mainarea extends StatefulWidget{
   @override
   _MainareaState createState() => _mainAreaState();
}

class _MainareaState extends State<Mainarea> {

   bool isChange= false; 

   @override
   Widget build(BuildContext context){ 
       return Container(
          //some codes
          // 
          child: Column(
            children: <Widget>[ 
                changeText(doChange: !this.isChange),
                makeChange(changeState: !this.isChange), 
            ],
          ),
       );
    }
}
    
0
bambortey 8 जिंदा 2021, 12:51
आपकी समस्या का विवरण समझना काफी कठिन है। क्या आप समस्या को उसके सरलतम रूप में वर्णित करने का प्रयास कर सकते हैं?
 – 
João Soares
8 जिंदा 2021, 13:18
ऐसा लगता है कि आपको जो चाहिए वह कॉलबैक है। यहां कुछ जानकारी digitalocean.com/community/tutorials/…
 – 
MSpeed
8 जिंदा 2021, 13:24

2 जवाब

सबसे बढ़िया उत्तर

मैंने अभी एक पैरामीटर के रूप में एक final Function(bool) callback जोड़ा है, जिसे स्टेटलेस विजेट से अंदर बुलाया जा सकता है, और कॉलिंग फ़ंक्शन पर वापस आ जाता है। वहां से आप सेटस्टेट को कॉल कर सकते हैं

class changeText extends StatelessWidget {
  final bool doChange;
  changeText({@required this.doChange});

  @override
  Widget build(BuildContext context) {
    return Container(
      //some codes
      //some codes
      child: doChange ? Text("open") : Text("close"),
    );
  }
}

class makeChange extends StatelessWidget {
  final bool changeState;
  final Function(bool) callback;

  makeChange(
      {@required
          this.changeState,
      @required
          this.callback}); // You can rename this to onPressed or whatever


  @override
  Widget build(BuildContext context) {
    return Container(
      //some codes
      //
      child: Column(
        children: [
          MaterialButton(
            //some codes
            //
            onPressed: () => callback( changeState),
            child: changeState ? Text("make close") : Text("make open"), //I had to swap these around to make the text correct
          ),
        ],
      ),
    );
  }
}

class Mainarea extends StatefulWidget {
  @override
  _MainareaState createState() => _MainareaState();
}

class _MainareaState extends State<Mainarea> {
  bool isChange = false;

  @override
  Widget build(BuildContext context) {
    return Container(
      //some codes
      //
      child: Column(
        children: <Widget>[
          changeText(doChange: !this.isChange),
          makeChange(
            changeState: !this.isChange,
            callback: (bool val) {
              setState(() => isChange = val); //this is your function that returns and resetst the value in the parent widget
            },
          ),
        ],
      ),
    );
  }
}
1
MSpeed 8 जिंदा 2021, 15:17

यह थोड़ा अस्पष्ट प्रश्न है, लेकिन आप राज्य बदलने के लिए कुछ इस तरह की कोशिश कर सकते हैं

onPressed: () {
setState(() {});
}
0
Hakkı Akut 8 जिंदा 2021, 13:32