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

如何在颤振中更新 GridView.builder 中的 Widget

如何解决如何在颤振中更新 GridView.builder 中的 Widget

我想知道如何在 GridView.builder 中更新 Widget。 我在 GestureDetector 的 onTap 调用时使用了 setState(),但 Gridview.Builder 项目中的小部件没有改变。

这是改变状态的函数

Widget todayProductCard(String url,String name,String price,String mall,String discount,String imageURL,String like) {
bool _isSelected = false;
if (name.length >= 15) {
  name = name.substring(0,15) + "...";
}
return GestureDetector(
  onTap: () {
    setState(() {
      _isSelected = !_isSelected;
      print(_isSelected.toString() + " " + name);
    });
  },child: Column(
    children: [
      ClipRRect(
        borderRadius: BorderRadius.circular(10),child: Stack(
          children: [
            Image.network(
              imageURL,width: MediaQuery.of(context).size.width / 2.2,height: MediaQuery.of(context).size.height / 4.5,fit: BoxFit.cover,),Visibility(
              visible: _isSelected,

这是 build()(_productWidgetList 是上面的函数列表)

@override
Widget build(BuildContext context) {
 print("qkwueiuqoieuqoieuoiqueoique");
 return Scaffold(
   appBar: AppBar(
     actions: [
       Padding(
         padding: EdgeInsets.symmetric(
           horizontal: MediaQuery.of(context).size.width / 30,child: Icon(Icons.more_horiz),)
     ],// title: Text(widget.closetName),title: Text(toggle.toString()),centerTitle: true,brightness: Brightness.light,body: FutureBuilder(
       future: productList(widget.userID,widget.closetName),builder: (BuildContext context,AsyncSnapshot<List<ProductModel>> snapshot) {
         if (snapshot.hasData) {
           return GridView.builder(
             padding: EdgeInsets.fromLTRB(
               12,12,shrinkWrap: true,itemCount: snapshot.data.length,gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
               childAspectRatio: 0.7,crossAxisCount: 2,crossAxisspacing: 8,mainAxisspacing: 10,itemBuilder: (context,index) {
               return _productWidgetList[index];
             },);
         } else {
           return Container();
         }
       }),);
}
}

这是完整的代码


class FavoriteEditScreen extends StatefulWidget {
  const FavoriteEditScreen({Key key,this.userID,this.closetName})
      : super(key: key);

  final String userID;
  final String closetName;

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

class _FavoriteEditScreenState extends State<FavoriteEditScreen> {
  ProductComponent productComponent = new ProductComponent();
  bool futureSemaphore = true;
  int httpPageNum = 1;
  String appbarString = "appbarString";

  List<Widget> _productWidgetList = [];

  Future<List<ProductModel>> productList(
      String userID,String closetName) async {
    Map body = {
      "abc": userID,"abc": closetName,};

    final response = await http.post(
      Uri.http("abcd.com".toString(),'/link'),body: body,headers: {
        "Accept": "application/json",'Content-Type': "application/x-www-form-urlencoded"
      },);

    final decodeData = utf8.decode(response.bodyBytes);
    var jsonArray = jsonDecode(decodeData) as List;
    List<ProductModel> products =
        await jsonArray.map((e) => ProductModel.fromJSON(e)).toList();
    print(products[0].title);
    return products;
  }

  @override
  void initState() {
    productList(widget.userID,widget.closetName).then((value) {
      generateProductList(value);
      return;
    });
    super.initState();
  }

  Widget todayProductCard(String url,String like) {
    bool _isSelected = false;
    if (name.length >= 15) {
      name = name.substring(0,15) + "...";
    }
    return GestureDetector(
      onTap: () {
        setState(() {
          _isSelected = !_isSelected;
          print(_isSelected.toString() + " " + name);
        });
      },child: Column(
        children: [
          ClipRRect(
            borderRadius: BorderRadius.circular(10),child: Stack(
              children: [
                Image.network(
                  imageURL,Visibility(
                  visible: _isSelected,child: Opacity(
                    opacity: 0.4,child: Container(
                      decoration: Boxdecoration(
                        color: Colors.lightGreen,border: Border.all(
                          color: Colors.green[900],width: 3,borderRadius: BorderRadius.circular(10),],Container(
            width: MediaQuery.of(context).size.width / 2.2,child: Padding(
              padding: EdgeInsets.symmetric(
                horizontal: MediaQuery.of(context).size.width / 70,child: Row(
                mainAxisAlignment: MainAxisAlignment.start,children: [
                  Container(
                    child: Column(
                      mainAxisAlignment: MainAxisAlignment.center,crossAxisAlignment: CrossAxisAlignment.start,children: [
                        SizedBox(
                          height: MediaQuery.of(context).size.height / 200,Text(
                          // "$mall",_isSelected.toString(),style: TextStyle(
                            fontWeight: FontWeight.w700,color: Colors.grey[700],fontSize: MediaQuery.of(context).size.width / 38,Text(
                          "$name",style: TextStyle(
                            color: Colors.grey[700],fontSize: MediaQuery.of(context).size.width / 35,SizedBox(
                          height: MediaQuery.of(context).size.height / 200,Row(
                          children: [
                            Text(
                              (discount == "") ? "" : "$discount ",style: TextStyle(
                                fontWeight: FontWeight.w900,color: Colors.red,fontSize:
                                    MediaQuery.of(context).size.width / 30,Text(
                              "$price",);
  }

  generateProductList(List<ProductModel> productList) {
    setState(() {
      _productWidgetList.addAll(
        List.generate(
          productList.length,(index) {
            return todayProductCard(
              productList[index].url,productList[index].title,productList[index].price,productList[index].mallName,productList[index].discount,productList[index].image,productList[index].likeBool,);
          },);
    });
  }

  bool toggle = false;

  @override
  Widget build(BuildContext context) {
    print("qkwueiuqoieuqoieuoiqueoique");
    return Scaffold(
      appBar: AppBar(
        actions: [
          Padding(
            padding: EdgeInsets.symmetric(
              horizontal: MediaQuery.of(context).size.width / 30,)
        ],body: FutureBuilder(
          future: productList(widget.userID,AsyncSnapshot<List<ProductModel>> snapshot) {
            if (snapshot.hasData) {
              return GridView.builder(
                padding: EdgeInsets.fromLTRB(
                  12,gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
                  childAspectRatio: 0.7,index) {
                  return _productWidgetList[index];
                },);
            } else {
              return Container();
            }
          }),);
  }
}

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