【问题标题】:can't getting stacked list of widgets after pushing them推送后无法获得堆叠的小部件列表
【发布时间】:2019-05-21 18:14:30
【问题描述】:

我创建了一个简单的应用程序来推送和弹出我在变量中列出的随机小部件:

List<Widget> _widgets = [TextWidget(), ImageWidget(), ButtonWidget()];

在屏幕上我必须按如下方式进行按钮

  • 1) 附加随机小部件
  • 2) 上一个小部件

点击附加随机小部件后,我将其存储在

final List<int> _widgetStacks = [0];

应用程序可以很好地使用此功能来存储它们

void attachWidget(int index) {
  print(_widgetStacks[index]);
  _widgetStacks.add(index);
  setState(() {
    _currentWidget = index;
  });
}

现在我想通过这个功能点击上一个小部件返回_widgetStacks

getPreviousWidget() {
  if (_widgetStacks.length - 1 > 0) {
    attachWidget(_widgetStacks[_widgetStacks.length - 1]);
  } else {
    _widgetStacks.removeAt(_widgetStacks.length - 1);
    Navigator.pop(context);
  }
}

void getPrevWidget(int index) {
  setState(() {
    _currentWidget = index;
  });
}

多次点击上一个小部件的此功能不起作用

我的实现代码:

void main() {
  runApp(MaterialApp(
    title: 'AndroidMonks',
    home: Scaffold(
      appBar: AppBar(
        title: Text('Androidmonks'),
        backgroundColor: Colors.orangeAccent,
      ),
      body: Home(),
    ),
  ));
}

class Home extends StatefulWidget {
  Home({
    Key key,
  }) : super(key: key);

  @override
  State<Home> createState() => _Home();
}

class _Home extends State<Home> {
  String title = "Title";
  int _currentWidget = 0;
  final List<int> _widgetStacks = [0];

  @override
  Widget build(BuildContext context) {
    attachWidget(_currentWidget);
    List<Widget> _widgets = [TextWidget(), ImageWidget(), ButtonWidget()];

    //TextWidget
    return WillPopScope(
      onWillPop: () {
        getPreviousWidget();
      },
      child: Scaffold(
        body: Column(
          children: <Widget>[
            Row(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                RaisedButton(
                  child: Text('Attach RANDOM widget'.toUpperCase()),
                  onPressed: () {
                    var rnd = Random();
                    _currentWidget = rnd.nextInt(3);
                    attachWidget(_currentWidget);
                  },
                ),
                RaisedButton(
                  child: Text('PREVIOUS widget'.toUpperCase()),
                  onPressed: () {
                    getPreviousWidget();
                  },
                ),
              ],
            ),
            Expanded(
              child: _widgets[_currentWidget],
            ),
          ],
        ),
      ),
    );
  }

  void attachWidget(int index) {
    print(_widgetStacks[index]);
    _widgetStacks.add(index);
    setState(() {
      _currentWidget = index;
    });
  }

  void getPrevWidget(int index) {
    setState(() {
      _currentWidget = index;
    });
  }

  getPreviousWidget() {
    if (_widgetStacks.length - 1 > 0) {
      attachWidget(_widgetStacks[_widgetStacks.length - 1]);
    } else {
      _widgetStacks.removeAt(_widgetStacks.length - 1);
      Navigator.pop(context);
    }
  }
}

class ImageWidget extends StatefulWidget {
  @override
  State<ImageWidget> createState() => _ImageWidget();
}

class _ImageWidget extends State<ImageWidget> {
  @override
  Widget build(BuildContext context) {
    return Center(
      child: Text("ImageWidget"),
    );
  }
}

class TextWidget extends StatefulWidget {
  @override
  State<TextWidget> createState() => _TextWidget();
}

class _TextWidget extends State<TextWidget> {
  @override
  Widget build(BuildContext context) {
    return Center(
      child: Text("TextWidget"),
    );
  }
}

class ButtonWidget extends StatefulWidget {
  @override
  State<ButtonWidget> createState() => _ButtonWidget();
}

class _ButtonWidget extends State<ButtonWidget> {
  @override
  Widget build(BuildContext context) {
    return Center(
      child: Text("ButtonWidget"),
    );
  }
}

【问题讨论】:

    标签: dart flutter


    【解决方案1】:

    检查更改:

    在方法attachWidget 中,每次将小部件添加到_widgetStacks,而不是从_widgetStacksgetPreviousWidget 中删除

       void main() {
      runApp(MaterialApp(
        title: 'AndroidMonks',
        home: Scaffold(
          appBar: AppBar(
            title: Text('Androidmonks'),
            backgroundColor: Colors.orangeAccent,
          ),
          body: Home(),
        ),
      ));
    }
    
    class Home extends StatefulWidget {
      Home({
        Key key,
      }) : super(key: key);
    
      @override
      State<Home> createState() => _Home();
    }
    
    class _Home extends State<Home> {
      String title = "Title";
      int _currentWidget = 0;
      final List<int> _widgetStacks = [0];
    
      @override
      Widget build(BuildContext context) {
        attachWidget(_currentWidget);
        List<Widget> _widgets = [TextWidget(), ImageWidget(), ButtonWidget()];
    
        //TextWidget
        return WillPopScope(
          onWillPop: () {
            getPreviousWidget();
          },
          child: Scaffold(
            body: Column(
              children: <Widget>[
                Row(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: <Widget>[
                    RaisedButton(
                      child: Text('Attach widget'.toUpperCase()),
                      onPressed: () {
                        var rnd = Random();
                        _currentWidget = rnd.nextInt(3);
                        _widgetStacks.add(_currentWidget);
                        attachWidget(_currentWidget);
                      },
                    ),
                    RaisedButton(
                      child: Text('PREVIOUS widget'.toUpperCase()),
                      onPressed: () {
                        getPreviousWidget();
                      },
                    ),
                  ],
                ),
                Expanded(
                  child: _widgets[_currentWidget],
                ),
              ],
            ),
          ),
        );
      }
    
      void attachWidget(int index) {
         setState(() {
          _currentWidget = index;
        });
      }
    
    
      getPreviousWidget() {
        if (_widgetStacks.length - 1 > 0) {
          _widgetStacks.removeAt(_widgetStacks.length - 1);
          attachWidget(_widgetStacks[_widgetStacks.length - 1]);
        } else {
          Navigator.pop(context);
        }
      }
    }
    
    class ImageWidget extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return Center(
          child: Text("ImageWidget"),
        );
      }
    }
    
    class TextWidget extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return Center(
          child: Text("TextWidget"),
        );
      }
    }
    
    class ButtonWidget extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return Center(
          child: Text("ButtonWidget"),
        );
      }
    }
    

    【讨论】:

    • 从头到尾获取列表不正确,这意味着当我尝试通过单击按钮逐步获取上一个列表时得到错误列表
    猜你喜欢
    • 2020-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多