Dart 颤振材料路线WidgetBuilder运行两次

Dart 颤振材料路线WidgetBuilder运行两次,dart,flutter,Dart,Flutter,我正在创建一个包含文本字段的页面,当用户在其中输入3+字符时,我从数据库中获取包含插入文本的行。在我提供的示例中,我通过获取一个列表来模拟这一点。向用户显示列表后,用户可以点击其中一行转到另一页 我的问题是,当我点击一行MaterialPageRoute WidgetBuilder运行两次时,以下是日志: ---------- onTap ---------- ---------- MaterialPageRoute ---------- ---------- SecondPage build

我正在创建一个包含文本字段的页面,当用户在其中输入3+字符时,我从数据库中获取包含插入文本的行。在我提供的示例中,我通过获取一个列表来模拟这一点。向用户显示列表后,用户可以点击其中一行转到另一页

我的问题是,当我点击一行MaterialPageRoute WidgetBuilder运行两次时,以下是日志:

---------- onTap ----------
---------- MaterialPageRoute ----------
---------- SecondPage build ----------
---------- MaterialPageRoute ----------
---------- SecondPage build ----------
有人能解释一下这种行为以及如何修复它吗


谢谢。

我也面临同样的问题。这是因为您没有向
FutureBuilder
添加任何条件。因此,当您使用
setState()
时,下次会调用它

您可以使用
Future
函数中的一个标志来解决此问题,以便仅第一次调用它。例如:

bool flag = true;
flag?FutureBuilder(
future: getData(),
builder: (BuildContext context, AsyncSnapshot snap){
  if(snap.connectionState != ConnectionState.done){
     return Center(child: CircularProgressIndicator(),);
  }else{
     return populate();
  }
},
):Container();
 Future getData()async{
    flag = false;
    return await fetchFromDatabase();
 }

这是理想的行为。任何时候都可以调用Build。你可能想看看几天前我也问过这个问题,这就是答案。但这也适用于MaterialPageRoute WidgetBuilder?似乎如此。无论如何,您不应该关心“build”被调用了多少次。在任何情况下,这都不会对您的应用程序产生任何影响。这种奇怪的行为对我来说都很奇怪。如果我在
initState
中创建列表,MaterialPageRoute WidgetBuilder只运行一次。@NCSantos这是正确的,但当应用程序重新呈现时,它将永远不会更新。正如Remi所说,您不应该关心太多的构建,颤振小部件树是针对这类事情优化的。