Flutter-setState不更新小部件?

时间:2020-05-04 07:54:27

标签: android flutter dart

我正在尝试为我的应用程序建立一个“评论”部分。在这种情况下,我正在尝试拥有更多阅读功能,显然,正如其名称所暗示的那样,在点击小部件时,它将扩展小部件以显示更多文本。 我正在使用带有BottomNavigationBar的索引堆栈在评论和产品页面之间切换。

import 'package:cached_network_image/cached_network_image.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_rating_bar/flutter_rating_bar.dart';
import 'Product_Page_Widgets.dart';
void main() => runApp(Product());
class Product extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: ProductState(),
    );
  }
}
class ProductState extends StatefulWidget {
  Map<dynamic,dynamic> productData;
  CollectionReference reviews;
  ProductState({@required this.productData,@required this.reviews});
  @override
  _ProductStateState createState() => _ProductStateState();
}

class _ProductStateState extends State<ProductState>  with TickerProviderStateMixin{
  List<NetworkImage> _Images = [];
  List<Widget> productImages = [];
  List<Widget> reviewWidgets = [];
  String changeableText = "";
  List<String> firstHalf = [];
  List<String> secondHalf = [];
  var cardHeight = [];

  bool load  = false;

  int pageIndex = 0;

  List<Widget> pageWidget = [];
  addPageWidgets() async{
    pageWidget.add( ProductPageWidget(
        productName: widget.productData['Name'],
        galleryItems: _Images,cachedImages: productImages,description:widget.productData['description'] ?? "placeholder")

    );
    Widget w =  await buildReviewsWidgets();
    pageWidget.add(w);

  }
  GlobalKey key = new GlobalKey();
 Future <Widget> buildReviewsWidgets() async{

    var docs = await widget.reviews.getDocuments();
    var documents = docs.documents;

      print(documents.toString());
    if(docs != null) {

      for (int i = 0; i < documents.length; i++) {
        cardHeight.add(MediaQuery.of(context).size.height/4);
        print(documents[i].data['Review']);
       if(documents[i].data['Review'].toString().length>50){
         firstHalf.add( documents[i].data['Review'].toString().substring(0,50));
         secondHalf.add(documents[i].data['Review'].toString().substring(51));

       }else{
         firstHalf.add( documents[i].data['Review'].toString());
          secondHalf.add("");

       }


      }



    }
    for(var doc in documents){
      print(doc.data);

    }


  return Container(
        height:MediaQuery.of(context).size.height,
        child: ListView.builder(
          key: key,
          itemCount: documents.length,
          itemBuilder: (context,index) => AnimatedSize(
            vsync: this,
            curve: Curves.easeIn,
            duration: new Duration(milliseconds: 300),
            child: Container(
              height: cardHeight[index],
              child: Card(

                elevation: 2.0,

                child: ListTile(
                  onTap: (){
                    stateUpdate(index);
                  },
                    leading: CircleAvatar(),
                    title: Text(documents[index].data['Title']),

                    subtitle: Column(children: [

                      RatingBar(
                        itemBuilder: (context, _) => Icon(
                          Icons.star,
                          color: Colors.amber,
                        ),
                        maxRating: 5.0,
                        allowHalfRating: false,
                        ignoreGestures: true,
                        initialRating: int.parse(documents[index].data['Rating'].toString()).toDouble(),
                      ),
                      Wrap(
                        children: <Widget>[
                          Text(firstHalf[index].toString()),
                          Text("Read More")
                        ],
                      ),
                    ]),
                  ),

              ),
            ),
          ),
        ),
      );

}
void AddNetworkImages (BuildContext context){
  if(!load) {

    for (int i = 0; i < widget.productData.length; i++) {
      if (widget.productData.containsKey('Img$i')) {
        print("Img$i exists");
        _Images.add(
            NetworkImage(widget.productData['Img$i'])
        );
        productImages.add(
          CachedNetworkImage(
            imageUrl: widget.productData['Img$i'],
            placeholder: (context, url) => CircularProgressIndicator(),
            errorWidget: (context, url, error) => Icon(Icons.error),

          ),
        );
      }
    }
  }
}
void loadWidgets(BuildContext context){
  setState(() {

  });
  load = true;

}
  @override
  void initState() {
    //AddNetworkImages(context);
    addPageWidgets();

    super.initState();



  }

  @override
  Widget build(BuildContext context) {
    WidgetsBinding.instance
        .addPostFrameCallback((_) => AddNetworkImages(context));

    WidgetsBinding.instance
        .addPostFrameCallback((_) => loadWidgets(context));
    return Scaffold(
      appBar: AppBar(

        actions: <Widget>[

        ],
        title: Text("$changeableText"),
        backgroundColor: Colors.deepOrangeAccent,
      ),
      body: SingleChildScrollView(
          scrollDirection: Axis.vertical,
          physics: BouncingScrollPhysics(

      ),

          child:IndexedStack(
            index: pageIndex,
            children: pageWidget,
          )),
      bottomNavigationBar:BottomNavigationBar(
        currentIndex: pageIndex,
        onTap: (index){
          setState(() {
            pageIndex = index;

          });
        },

        items: [
          BottomNavigationBarItem(

            icon: Icon(Icons.shopping_cart),
            title: Text("Overview")
          ),
          BottomNavigationBarItem(
            icon: Icon(Icons.star),
            title: Text("Reviews")
          )
        ],
      )
    );
}

  void stateUpdate(int index) {
    setState(() {
      firstHalf[index]+=secondHalf[index];
      cardHeight[index] = MediaQuery.of(context).size.height/2;

    });
    print(index);
    print(firstHalf[index]);
  }
}

现在,在buildReviewsWidgets()方法内部,我将获取所有评论数据,对其进行迭代并将其拆分为firstHalf和secondHalf列表,以便在点击ListTile时,我可以简单地加入firstHalf [index ]和secondHalf [index],就像我在ListTiles的ontap方法上所做的一样,但是点击列表图块根本没有任何作用..列表图块不会更新,基本上没有任何反应。但是有趣的是,如果我设置状态并更改changeableText的值,它的确会更新应用栏上的文本。有人能告诉我为什么会这样吗?我该如何解决?

1 个答案:

答案 0 :(得分:0)

我刚刚清理了代码,并消除了存储带有列表的小部件的需要。.不涉及任何列表,而这些小部件可立即解决此问题。