繁体   English   中英

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

[英]Setstate is not working inside list of widgets flutter

我的问题是我的列表中的 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
       ],
     ),
   );
 }
 }

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

您可以在下面复制粘贴运行完整代码
您可以使用StatefulBuilder

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

工作演示

在此处输入图像描述

完整代码

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

我认为您必须为列表中的每个按钮创建一个 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