Flutter - setState не обновляет виджеты? - PullRequest
0 голосов
/ 04 мая 2020

Я пытаюсь создать раздел отзывов для моего приложения. В этом я пытаюсь использовать функцию «читать дальше», которая, как видно из названия, будет расширять виджет, чтобы отображать больше текста после касания виджета. Я использую индексированный стек с 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], как я это сделал с методом ontap ListTiles, но нажав на плитку списка ничего не делает .. плитки списка не обновляются, в основном ничего не происходит. Но что интересно, если я установилState и изменил значение changeableText, он обновил бы текст на панели приложений ... Кто-нибудь может сказать мне, почему это происходит? как мне это исправить?

1 Ответ

0 голосов
/ 04 мая 2020

Я просто очистил код и избавил от необходимости хранить виджеты со списками ... не задействовав никаких списков с виджетами, я сразу же решил проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...