Search code examples
listflutterwidgetsetstate

Setstate is not working inside list of widgets flutter


My question is my Raisedbutton of the list Is not changing position ontap While staying in the list of widgets Please help me out And tell me what's wrong in that code

  class Sticker extends 
StatefulWidget {
 Sticker({Key key}) : 
 super(key: key);
 @override
 _StickerState 
createState() => _ 
 StickerState();
 }

class _StickerState extends 
 State<Sticker> {
 Offset position = 
Offset(50, 100);
 List<Widget> list = [];
 @override
 Widget build(BuildContext 
context) {
   return Container(
  child: Stack(
    children: [
      Container(
        height: MediaQuery.of(context).size.height,
        width: MediaQuery.of(context).size.width,
      ),
      Positioned(
        left: 50,
        top: 50,
        child: 
          RaisedButton(
          onPressed: () {
            setState(
              () {
                list.add(
                  
             Positioned(
                    left: position.dx,
                    top: position.dy,
                    child: RaisedButton(
                    onPressed: () {                    
                      setState(() => position = Offset(50, 150));
                    },
                    ),
                  ),
                );
              },
            );
          },
        ),
      ),
        ...list
       ],
     ),
   );
 }
 }

I want that my raised change position after I tap on that while staying in the list Please help me out dealing this problem console is giving no errors


Solution

  • You can copy paste run full code below
    You can use StatefulBuilder

    list.add(StatefulBuilder(
                builder: (BuildContext context, StateSetter setState) {
              return Positioned(
    

    working demo

    enter image description here

    full code

    import 'package:flutter/material.dart';
    
    class Sticker extends StatefulWidget {
      Sticker({Key key}) : super(key: key);
      @override
      _StickerState createState() => _StickerState();
    }
    
    class _StickerState extends State<Sticker> {
      Offset position = Offset(50, 100);
      List<Widget> list = [];
      @override
      Widget build(BuildContext context) {
        print("build list.length ${list.length}");
        return Container(
          child: Stack(
            children: [
              Container(
                height: MediaQuery.of(context).size.height,
                width: MediaQuery.of(context).size.width,
              ),
              Positioned(
                left: 50,
                top: 50,
                child: RaisedButton(
                  onPressed: () {
                    setState(
                      () {
                        list.add(StatefulBuilder(
                            builder: (BuildContext context, StateSetter setState) {
                          return Positioned(
                            left: position.dx,
                            top: position.dy,
                            child: RaisedButton(
                              onPressed: () {
                                setState(() {
                                  position = Offset(50, 150);
                                });
                              },
                            ),
                          );
                        }));
                      },
                    );
                  },
                ),
              ),
              ...list
            ],
          ),
        );
      }
    }
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Flutter Demo',
          theme: ThemeData(
            primarySwatch: Colors.blue,
            visualDensity: VisualDensity.adaptivePlatformDensity,
          ),
          home: MyHomePage(title: 'Flutter Demo Home Page'),
        );
      }
    }
    
    class MyHomePage extends StatefulWidget {
      MyHomePage({Key key, this.title}) : super(key: key);
    
      final String title;
    
      @override
      _MyHomePageState createState() => _MyHomePageState();
    }
    
    class _MyHomePageState extends State<MyHomePage> {
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text(widget.title),
          ),
          body: Sticker(),
        );
      }
    }