简体   繁体   中英

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

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

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

working demo

在此处输入图像描述

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(),
    );
  }
}

I think you have to create a position element for each button in the list

List<Offset> position = Offset();


setState(() => position.add(Offset(50,150)));

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM