微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

设置父无状态小部件标志时 Flutter setState 执行但不重新渲染 UI

如何解决设置父无状态小部件标志时 Flutter setState 执行但不重新渲染 UI

我的应用程序有一个介绍性功能,它只是通知用户要执行的操作,问题是此帮助操作文本 (Container(...)) 在调用 setState() 函数时不会被删除

流程的逻辑概述:

-> `User launches app` 
    |-> `login` 
    |-> `show main UI (with help action if first time launch)` 
        |-> first time launch ? show help text : don't show
             | User ackNowledges help text,set in preferences

下面是一些飞镖片段的代码片段

UiHomePage(主界面 - 这是父界面)

class HomePage extends StatefulWidget {
  const HomePage({Key key}) : super(key: key);

  @override
  _HomePage createState() => _HomePage();
}

class _HomePage extends State<HomePage> {

  @override
  Widget build(BuildContext context) {
    
    Widget pageDashboardUser() {
      ...
      
      // Notify UiComponentPartnerSelector if we should show help action text based on AppSharedPreferences().isFirstTap()
      Widget middlebrowseCard() {
        return new FutureBuilder(
            builder: (context,snapshot) {
              return UiComponentPartnerSelector(
                  _displayProfiles,snapshot.data);
            },future: AppSharedPreferences().isFirstTap());
      }

      var search = topSearch();
      var selector = middlebrowseCard();

      return Stack(
        children: [search,selector],);

    return Scaffold(...)
}

此小部件显示一堆带有基本卡片、文本叠加层和提示文本组件的配置文件

主要焦点是构造函数中的 showHint 定义(如果应用程序第一次启动则为真),showTapTutorial() 返回提示组件或空容器,最后是 {{1 }} 处理卡片的 onclick 事件。

UiComponentPartnerSelector(子 UI - 此处显示帮助文本

_onTap(Profile)

问题:

当点击 class UiComponentPartnerSelector extends StatefulWidget { bool showHint; final List<Profile> items; UiComponentPartnerSelector(this.items,this.showHint,{Key key}) : super(key: key); @override _UiComponentPartnerSelector createState() => _UiComponentPartnerSelector(); } class _UiComponentPartnerSelector extends State<UiComponentPartnerSelector> { UiComponentCard _activeCard; int _tappedImageIndex = 0; Widget showTapTutorial() { if (!widget.showHint) { return Container(); } return Container( padding: const EdgeInsets.symmetric(vertical: 16,horizontal: 32),decoration: Boxdecoration( color: Colors.white.withOpacity(0.6),borderRadius: BorderRadius.all(Radius.circular(5)),),child: Column( mainAxisAlignment: MainAxisAlignment.center,children: [ Icon( Icons.touch_app,color: Colors.black.withOpacity(0.6),Text( "Touch to view partner profile",textAlign: TextAlign.center,style: TextStyle(color: Colors.black),) ],); } @override Widget build(BuildContext context) { Color _standard = Colors.white; // // _cache = widget.items.map((e) => { // e.imageUri.toString(),// Image.network(e.imageUri.toString()) // }); Future _onTap(Profile e) async { if (!widget.showHint) { Navigator.of(context) .push(MaterialPageRoute(builder: (context) => UiViewProfile(e))); } else { AppSharedPreferences().setFirstTap(false).then((value) { setState(() { widget.showHint = false; }); }); } } UiComponentCard createComponentCard(Profile e) { ... return UiComponentCard( onTap: () { _onTap(e); },wImage: Center( child: Image.network( e.profileImageLink.toString(),fit: BoxFit.fill,wContent: // Center( // child: UiTextLine(text: e.displayName),// ),Column( children: [ topBasicInfo(),Expanded(child: Container()),showTapTutorial(),bottomBio() ],); } return Container( child: Stack(...) ); _onTap(Profile)showHint 时。

应该发生什么:

接下来应该发生的是true应该将初始点击标志设置为AppSharedPreferences().setFirstTap(false),然后在完成false包括setState()设置为{ {1}},然后重新呈现 UI 并移除提示文本容器(在 showHint 中找到)。

会发生什么:

实际上发生的是当 false调用时,它正确更新首选项,showTapTutorial()调用并且 _onTap() 中的 setState()showHint == false 返回 true !widget.showHint 但 UI 本身不会重新呈现。

因此在第一次点击这个“按钮”后,UI 仍然存在(不会改变)。再次单击会执行 showTapTutorial() 部分 WHILE 操作帮助文本(教程)仍在显示。如果我再次点击同一张卡片

我是否遗漏了什么或做错了什么?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。