flutter-使用抽屉子小部件onTap更改子小部件

时间:2019-04-25 02:46:52

标签: android dart flutter

我是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相应地更改currentpageFuture.delayed()将通过抽屉中的按钮进行更改。

但是继续出现相同的错误:

  

引发了另一个异常:锁定小部件树时调用setState()或markNeedsBuild()。

如您所见,我基于this suggestion添加了drawer,但错误仍然存​​在。

经过一些研究,我感觉到它与setState()flutter的处理方式有关,但我不确定如何处理。

很明显,我仍然没有从buildstate的角度来了解public VideoPlayer vp; public void seturl(string filetoplay) { vp.url = "file://"+filetoplay; vp.play(); } 的工作方式。

似乎是问题所在,我该如何解决?

1 个答案:

答案 0 :(得分:0)

您应该在currentPage方法之外声明build变量,因为每次调用setState时,都会再次调用build方法,并且变量不会更改。

所以移动这个:

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

对此:

var currentpage = 'landing';

Widget build(BuildContext context) {