簡體   English   中英

顫動 - 使用抽屜子窗口小部件onTap更改子窗口小部件

[英]flutter - change child widget with drawer child widget onTap

flutter初學者。 我將主頁分為2個自定義小部件, top小部件和page小部件。 我有一個帶有幾個按鈕的抽屜來更改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) {
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() ,但錯誤仍然存​​在。

經過一番研究,我覺得它與drawer如何處理setState() ,但我不確定如何。

顯然,我仍然沒有得到在buildstate方面有多么flutter工作。

什么似乎是問題,我該如何解決這個問題?

您應該在build方法之外聲明currentPage變量,因為每次調用setState時,都會再次調用build方法,並且變量不會更改。

移動這個:

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

對此:

var currentpage = 'landing';

Widget build(BuildContext context) {

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM