Flutter 颤振:从appbar调用listview生成器内部的方法

Flutter 颤振:从appbar调用listview生成器内部的方法,flutter,dart,Flutter,Dart,我有一个listview构建器,在主页中有一个列表,当按下列表中的一个项目时,第二个页面将打开该列表的详细信息。详细信息基本上是每张卡上的另一张卡列表。我有一个计数器,从零值开始,当用户按下每张卡时,计数器值将增加 现在,我面临的问题是,当用户返回主页,然后再次单击同一项转到第二页时,他们将找到计数器值,因为它们是(即不是零),尽管我没有包括任何存储这些值的机制(即没有sharedpreferance等等) 除非关闭并再次打开应用程序,否则计数器的这些值不会回到零 我试图通过在第二页的listv

我有一个listview构建器,在主页中有一个列表,当按下列表中的一个项目时,第二个页面将打开该列表的详细信息。详细信息基本上是每张卡上的另一张卡列表。我有一个计数器,从零值开始,当用户按下每张卡时,计数器值将增加

现在,我面临的问题是,当用户返回主页,然后再次单击同一项转到第二页时,他们将找到计数器值,因为它们是(即不是零),尽管我没有包括任何存储这些值的机制(即没有sharedpreferance等等)

除非关闭并再次打开应用程序,否则计数器的这些值不会回到零

我试图通过在第二页的listview.builder中添加一个方法来解决这个问题,在用户返回主屏幕后,将每张卡的计数器值更改为零。为此,我正在从appbar调用该方法,但我得到了此错误“错误:没有为类型“\u DetailState”定义方法“moveToLastScreen”。。如何解决这个问题

这是我的代码:

    return Scaffold(
      appBar: AppBar(
        leading: IconButton(
          icon: Icon(Icons.arrow_back_ios),
          onPressed: () {
            setState(() {
              moveToLastScreen();
            });
          },
        ),
      ),
      body: ListView.builder(
        itemCount: widget.cities.attractions.length,
        itemBuilder: (BuildContext context, int index) {
          void moveToLastScreen() {
            setState(() {
              widget.cities.attractions[index].localrank = 0;
            });
          }

          return InkWell(
            onTap: () {
              setState(() {
                widget.cities.attractions[index].localrank++;
              });
            },
            child: Card(
                child: Padding(
              padding: const EdgeInsets.all(8.0),
              child: Row(
                mainAxisAlignment: MainAxisAlignment.spaceBetween,
                children: <Widget>[
                  Text(widget.cities.attractions[index].name),
                  Center(
                      child: Text(
                          '${widget.cities.attractions[index].localrank}')),
                ],
              ),
            )),
          );
        },
      ),
    );
 
返回脚手架(
appBar:appBar(
领先:IconButton(
图标:图标(图标、箭头、背面),
已按下:(){
设置状态(){
移动到最后屏幕();
});
},
),
),
正文:ListView.builder(
itemCount:widget.cities.attractions.length,
itemBuilder:(构建上下文,int索引){
void moveToLastScreen(){
设置状态(){
widget.cities.attractions[index].localrank=0;
});
}
回墨槽(
onTap:(){
设置状态(){
widget.cities.attractions[index].localrank++;
});
},
孩子:卡片(
孩子:填充(
填充:常数边集全部(8.0),
孩子:排(
mainAxisAlignment:mainAxisAlignment.spaceBetween,
儿童:[
文本(widget.cities.attractions[index].name),
居中(
子:文本(
“${widget.cities.attractions[index.localrank}”),
],
),
)),
);
},
),
);

请告诉我是否还有其他方法,在用户返回主页后,强制应用程序将这些值重置为零。如果我理解正确,请在按下“上一步”按钮时将widget.cities.attractions中的所有localranks设置为零

我的第一个建议是使用WillPopScope小部件在按下back键时做您想做的事情,而不是使用appbar中的back按钮,但更重要的是,如果在那里定义了moveToLastScreen方法,则无法访问它。您必须在Widget类中定义它。 您可以使用forEach访问每个景点,然后将localrank设置为零

  Future<bool> moveToLastScreen() async {
    setState(() {
       widget.cities.attractions.forEach((attraction) => attraction.localrank = 0);
    });
    Navigator.of(context).pop();
    return true;
  }

  @override
  Widget build(BuildContext context) {
    return WillPopScope(
      onWillPop: () => moveToLastScreen(),
      child: Scaffold(...),
    );
  }
Future moveToLastScreen()异步{
设置状态(){
widget.cities.attractions.forEach((attraction)=>attraction.localrank=0);
});
Navigator.of(context.pop();
返回true;
}
@凌驾
小部件构建(构建上下文){
返回式示波器(
onWillPop:()=>moveToLastScreen(),
儿童:脚手架(…),
);
}

太好了,我想怎么用就怎么用。谢谢Khashayar的回答,谢谢。