简体   繁体   English

Setstate 在小部件列表 flutter 中不起作用

[英]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我的问题是我的列表中的 Raisedbutton 没有改变 position ontap 而留在小部件列表中请帮助我并告诉我该代码有什么问题

  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我希望在留在列表中时点击它后我提出的更改 position 请帮我解决这个问题 控制台没有给出错误

You can copy paste run full code below您可以在下面复制粘贴运行完整代码
You can use StatefulBuilder您可以使用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我认为您必须为列表中的每个按钮创建一个 position 元素

List<Offset> position = Offset();


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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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