Flutter:从 appbar 调用 listview builder 中的方法

Posted

技术标签:

【中文标题】Flutter:从 appbar 调用 listview builder 中的方法【英文标题】:Flutter : Call a method inside listview builder from appbar 【发布时间】:2020-11-04 11:23:25 【问题描述】:

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

现在我面临的问题是当用户返回主页然后再次单击同一项目以转到第二页时,他们会找到原来的计数器值(即不是零),尽管我没有包含任何存储这些值的机制(即没有 sharedpreferance 左右)。

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

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

这是我的代码:

    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')),
                ],
              ),
            )),
          );
        ,
      ),
    );
 

请告诉我,除此之外还有其他方法可以强制应用将这些值重置为零,因为一旦用户返回主页,它们就会原样重置。

【问题讨论】:

【参考方案1】:

如果我对您的理解正确,您希望在按下后退按钮时将 widget.cities.attractions 中的所有 localranks 设置为零。

我的第一个建议是使用 WillPopScope 小部件在按下后执行您想要的操作,而不是使用应用栏中的后退按钮,但更重要的是,如果在此处定义了 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(...),
    );
  

【讨论】:

完美,它可以按我的意愿工作。感谢 Khashayar 的回答,非常感谢。

以上是关于Flutter:从 appbar 调用 listview builder 中的方法的主要内容,如果未能解决你的问题,请参考以下文章

Flutter:从 AppBar 中减去状态栏高度

Flutter:如何从 appbar 动作中显示快餐栏

Flutter - 从 AppBar 返回上一页不会刷新页面,使用 Navigator.pop(context)

Flutter 导航推送,同时保持 Appbar 不变

Flutter 从父类调用子类函数

没有 AppBar 的 Flutter 布局