繁体   English   中英

如何设置隐藏的小部件ListTile

[英]How To Set Widget ListTile Hidden

即时通讯试图设置隐藏的小部件ListTile如果SharedPreferences获取空数据,我试图使用Visibility ,我得到这样的错误

'Future'类型不是'Widget'类型的子类型

我的Widget build(BuildContext context)

 Widget build(BuildContext context) {
    return new Drawer(
        child: new ListView(
      children: <Widget>[
        new DrawerHeader(
          child: new Text("Menu"),
          decoration: new BoxDecoration(color: Colors.lightBlueAccent),
        ),
        new ListTile(
          title: new Text("Profile"),
          onTap: () {
            Navigator.pop(context);
            Navigator.push(
                context,
                new MaterialPageRoute(
                    builder: (context) => new ProfileScreen()));
          },
        ),
        new ListTile(
          title: new Text("Proposal List"),
          onTap: () {
            visibleMethod();
          },
        ),
        //MY PROBLEM HERE
        Visibility(
          visible: true, 
          child: listTileAju()),

        new ListTile(
          title: new Text("Sign Out"),
          onTap: () async {
            SharedPreferences pref = await SharedPreferences.getInstance();
            pref.remove("authorization");
            pref.remove("is_login");
            Navigator.pushReplacement(context,
                MaterialPageRoute(builder: (BuildContext ctx) => LoginPage()));
          },
        ),
      ],
    ));
  }

My Widget listTileAju()

  listTileAju() async {
    SharedPreferences pref = await SharedPreferences.getInstance();
    setState(() {
      roleAju = (pref.getStringList('role_aju') ?? 'Something Went Wrong');
    });
    if (roleAju != null) {
      Visibility(
        visible: true,
        child: new ListTile(
          title: new Text("Aju List"),
          onTap: () {
            Navigator.pop(context);
            Navigator.push(context,
                new MaterialPageRoute(builder: (context) => new AjuScreen()));
          },
        ),
      );
    } else {
      Visibility(
        visible: false,
        child: new ListTile(
          title: new Text("Aju List"),
          onTap: null,
        ),
      );
    }
  }

我希望如果SharedPreferences获取空数据,则可以隐藏小部件ListTile

您的listTileAju是异步的,因此它变为Future并且小部件不能为Future。

最简单的解决方案是必须将数据加载到initState中,然后必须在此处使用该数据以避免异步。

请尝试以下代码:-

bool isShowListTile;

Widget listTileAju(){
  Visibility(
    visible: isShowListTile,
    child: new ListTile(
      title: new Text("Aju List"),
      onTap: () {
        Navigator.pop(context);
        Navigator.push(context,
            new MaterialPageRoute(builder: (context) => new AjuScreen()));
      },
    ),
  );
}

@override
void initState() {
  super.initState();

  SharedPreferences pref = await SharedPreferences.getInstance();
  roleAju = (pref.getStringList('role_aju') ?? 'Something Went Wrong');
  if (roleAju != null) {
    if (mounted) {
      setState(() {
        isShowListTile = true;
      });
    }
  } else {
    if (mounted) {
      setState(() {
        isShowListTile = false;
      });
    }
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM