【问题标题】:Flutter: CupertinoTabScaffold tab content does not refresh after closing PageRouteFlutter:关闭 PageRoute 后,CupertinoTabScaffold 选项卡内容不刷新
【发布时间】:2021-11-20 20:28:31
【问题描述】:

问题:从 CupertinoPageRoute 关闭新屏幕后,CupertinoTabScaffold 选项卡内容不刷新

应用: Listview 中有一个数据列表。 我打开一个数据集并删除收藏状态(选中=false)。 我关闭数据集并且列表视图应该刷新(FutureBuilder 到 SQL 数据库)。

详情: 我有一个具有两种布局(Material 和 Cupertino)的 Flutter App。 在每个布局中,我有四个选项卡,并且内容小部件是相同的。 在 Cupertino 应用程序上,每个选项卡都包含一个 CupertinoPageScaffold。 当我按下一个元素时,它会导航到带有 CupertinoPageRoute 的新屏幕。 关闭 CupertinoPageRoute 后,选项卡内容不会刷新。 当我在四个标签之间切换时,标签内容正在刷新。

如果一个 CupertinoPageRoute 是打开的,我从这里打开一个新的并再次关闭它 然后打开的 CupertinoPageScaffold 的内容令人耳目一新。 数据在没有回调等的情况下刷新,只需调用未来(我认为)。

表示 CupertinoTabScaffold 应该有问题。 Material App上没有问题。 关闭 MaterialPageRoute 时,Material App 的选项卡内容会刷新。

问题: 这个位置有问题吗? 您是否有同样的问题或者解决方案或解决方法?

代码: 我的代码并不真正具有代表性,所以我将为您创建一个新的干净项目。 请确认是否需要代码。

我尝试了什么: 我尝试了很多来自互联网的解决方案,例如路由的回调、setState、.then、.whencomplete。 似乎没有任何效果。

提前谢谢你。

EDIT 03.10.2021:当我打开或关闭新屏幕时,带有 SingleTickerProviderStateMixin 的 tabcontroller 会重新加载打开的选项卡。如果我只使用 DefaultTabController Widget 而不是。所以我必须编辑 CupertinoTabController。

class _MyHomePageState extends State<MyHomePage> with SingleTickerProviderStateMixin  {
  late TabController _tabController;
  final CupertinoTabController _cuptabController = CupertinoTabController();

  Future<void> _refreshdata() async {
    downloadJSON1();
    setState(() {
    });
  }

  callback() {
    _refreshdata();
  }

  @override
  void initState() {
    _refreshdata();
    super.initState();
    _tabController = TabController(vsync: this, length: 2, initialIndex: 0);
    _cuptabController.index = widget.starttab;
  }

  @override
  void dispose() {
    _tabController.dispose();
    super.dispose();
  }

...
}

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    我可以建议几个选项:

    选项 1: 将您的 FutureBuilder 更改为 StreamBuilderFutureBuilder 保存数据时不会自动刷新,StreamBuilder 做得很好。

    选项 2: 使用setState,但不是在您要关闭的路线的上下文中,而是在您要刷新的原始页面的上下文中

    setState(() {  });
    

    【讨论】:

    • 与以前相同的行为;表示不刷新
    • 我正在开发两个小型虚拟应用程序,用于保存和显示最喜欢的数据集,一个应用程序具有材料,一个应用程序具有 Cupertino 布局。一个活生生的例子应该更好地测试和分析。我也会尝试上传应用行为的 gif/视频。
    • 您是否尝试将 FutureBuilder 更改为 StreamBuiler?它必须有效,而且变化很快
    • 是的,我将其更改为 Streambuilder,它在 Android 上的工作方式与以前一样,但在 CupertinoApp 上没有任何改进。目前我正在开发一个新的空应用程序,但它似乎也不适用于 android。 :-) - 我必须重新创建它。
    【解决方案2】:

    目前我通过 PageRoute 的 .then-callback 解决了这个问题。我刚刚将回调传递给最深的 Widget/PageRoute。但是,如果您对 tabcontroller 有解决方案/想法,那就太好了。

    来源: how to refresh state on Navigator.Pop or Push in flutter

          Navigator.push(context,
          CupertinoPageRoute(
            builder: (BuildContext context) => MyWidget(
              'myparameters'),),).then((value) => setState(() {callback();}));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-25
      • 2011-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-27
      • 1970-01-01
      • 2022-11-04
      相关资源
      最近更新 更多