颤动 - 使用抽屉子窗口小部件onTap更改子窗口小部件

问题描述 投票:0回答:1

我是flutter初学者。我的主页分为2个自定义小部件,top小部件和page小部件。我有一个带有几个按钮的抽屉来改变page小部件的内容。

我按照this tutorial尝试按下按钮交换小部件。

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) {
var currentpage = 'landing';

    Widget pageWidget;

    switch (currentpage) {
      case 'landing':
        pageWidget = new Landing();
        break;
      case 'visitors':
        pageWidget = new Visitors();
        break;
      default:
    }

return Scaffold(
body:new Container(
child: Container(
    child: Column(
      children: <Widget>[
        Header(), ///<-- widget declared in separated .dart file
        pageWidget
      ],
    )
    )
drawer: Drawer(
        child: ListView(
          children: <Widget>[
            DrawerHeader(
              child: Text(
                "UserN3",
                style: TextStyle(
                    fontSize: 20,
                    fontWeight: FontWeight.bold,
                    color: Colors.black54),
              ),
            ),
            new GestureDetector(
              onTap: (){
                print("landing");

                Future.delayed(Duration.zero,(){
                  setState(() {
                    currentpage = 'landing';
                  });
                });
              },
              child: new Text("landing"),
            ),
            new GestureDetector(
              onTap: (){
                print("visitors");
                Future.delayed(Duration.zero,(){
                  setState(() {
                    currentpage = 'visitors';
                  });
                });        
              },

              child: new Text("Visitors"),
            ),
          ],
        ),
      ),
);
}

所以要点是:

我在构建中有switch case,它将根据pageWidget相应地更改currentpage,这将通过抽屉中的按钮进行更改。

但是继续得到同样的错误:

抛出了另一个异常:当窗口小部件树被锁定时调用的setState()或markNeedsBuild()。

如你所见,我添加了基于Future.delayed()this suggestion,但错误仍然存​​在。

经过一番研究后,我感觉它与drawer如何处理setState()有关,但我不确定如何。

显然,我仍然没有得到flutter如何工作buildstate

什么似乎是问题,我该如何解决这个问题?

android dart flutter
1个回答
0
投票

你应该在你的currentPage方法之外声明你的build变量,因为每次你调用setState时,build方法再次被调用,变量不会改变。

移动这个:

Widget build(BuildContext context) {
  var currentpage = 'landing';

对此:

var currentpage = 'landing';

Widget build(BuildContext context) {
© www.soinside.com 2019 - 2024. All rights reserved.