流Bloc中的错误返回'Instance Of“

问题描述 投票:0回答:1

以下有关将loc与api结合使用的教程我使用流从api获取数据,但返回了'

的实例

已搜索此问题,但仍然存在此问题

我将在下面显示我的代码

主屏幕中有我的StreamBuilder代码

StreamBuilder(
          stream: homeProductsBloc.productsStream ,
          builder: (BuildContext context , AsyncSnapshot <List<Product>> snapshot){
            print(snapshot.connectionState) ;
            switch (snapshot.connectionState) {
              case ConnectionState.none:
                return error('No thing worked') ;
                break;
              case ConnectionState.waiting:
                return loading();
                break;
              case ConnectionState.active:
              case ConnectionState.done:
                if(snapshot.hasError){
                  return error(snapshot.error.toString()) ;
                }else{
                  if( ! snapshot.hasData ) {
                    return error('No Data Returned') ;
                  }else{
                    print(snapshot.data) ;
                    _drawProducts(snapshot.data) ;
                  }
                }
                break;
            }
            return Container();
        },
        ),

并且有_drawProduct小部件

Widget _drawProducts( List<Product> products ){
    return Container(
      child: Column(
        children: <Widget>[
          Flexible(
            child: ListView.builder(
              itemCount: products.length ,
              itemBuilder: (context , position){
                print(products.length) ;
                return Card(
                  child: Container(
                    child: Image(
                      image: NetworkImage(products[position].featuredImage()),
                    ),
                  ),
                );
              },
            ),
          ),
        ],
      ) ,
    ) ;
  }

并且有我的流bloc类

class HomeProductsBloc implements Disposable {

  List<Product> products ;
  ProductsApi productsApi ;

  final StreamController <List<Product>> _productController = StreamController <List<Product>>.broadcast() ;
  final StreamController <int> _categoryController = StreamController <int>.broadcast() ;

  Stream <List<Product>> get productsStream => _productController.stream ;

  StreamSink <int> get fetchProducts => _categoryController.sink ;
  Stream <int> get category => _categoryController.stream ;

  int categoryID ;

  HomeProductsBloc(){
    this.products = [] ;
    productsApi = ProductsApi() ;
    _productController.add(this.products) ;
    _categoryController.add(this.categoryID) ;
    _categoryController.stream.listen( _fetchCategoriesFromApi ) ;
  }

  Future<void> _fetchCategoriesFromApi( int category ) async {
    this.products = await productsApi.fetchProductsByCategory(category, 1) ;
    _productController.add(this.products) ;
//    print(products[0].product_id) ;
  }

  @override
  void dispose() {
    _productController.close();
    _categoryController.close();
  }



}

这是fetchProductByCategory将来的方法

Future<List<Product>> fetchProductsByCategory( int category ,int page ) async {
    String url = ApiUtil.CATEGORY_PRODUCTS(category , page ) ;
    http.Response response = await http.get( url , headers: headers) ;
    List<Product> products = [] ;
    switch (response.statusCode){

      case 404 :
        throw ResourceNotFound('products') ;
        break;

      case 301 :
      case 302 :
      case 303 :
        throw RedirectionFound() ;
      break;

      case 200 :
        var body = jsonDecode(response.body) ;
        for( var item in body['data'] ){
          products.add(
              Product.fromJson(item)
          );
        }
        return products ;
        break;
      default :
        return null ;
        break ;

    }
  }

这是我的想法中的完整错误日志

flutter: ConnectionState.waiting
flutter: ConnectionState.active
flutter: [Instance of 'Product', Instance of 'Product', Instance of 'Product', Instance of 'Product', Instance of 'Product', Instance of 'Product', Instance of 'Product', Instance of 'Product', Instance of 'Product', Instance of 'Product', Instance of 'Product', Instance of 'Product', Instance of 'Product', Instance of 'Product', Instance of 'Product']

任何主意吗?

**编辑

产品类别

import 'package:chef_app/exeptions/exeptions.dart';
import 'package:chef_app/product/product_category.dart';
import 'package:chef_app/product/product_tag.dart';
import 'package:chef_app/review/product_reviews.dart';
import 'product_unit.dart';


class Product{

  int product_id ;
  String product_title , product_description ;
  ProductUnit product_unit ;
  double product_price , product_total , product_discount ;
  ProductCategory productCategory ;
  List<ProductTag> tags ;
  List<String> images ;
  List<ProductReview> reviews ;

  Product(this.product_id , this.product_title , this.product_description ,
      this.product_unit , this.product_price , this.product_total , this.product_discount ,
      this.productCategory , this.tags , this.images , this.reviews
      );

  Product.fromJson(Map<String , dynamic> jsonObj){

    if(jsonObj['product_id'] == null){
      throw PropertyRequired('Product Id');
    }
    if(jsonObj['product_title'] == null){
      throw PropertyRequired('Product Title');
    }
    if(jsonObj['product_description'] == null){
      throw PropertyRequired('Product Description');
    }
    if(jsonObj['product_price'] == null){
      throw PropertyRequired('Product Price');
    }

    this.product_id = jsonObj['product_id'] ;
    this.product_title = jsonObj['product_title'] ;
    this.product_description = jsonObj['product_description'] ;
    this.product_unit = ProductUnit.fromJson(jsonObj['product_unit']) ;
    this.product_price = double.tryParse(jsonObj['product_price']) ;
    this.product_total = double.tryParse(jsonObj['product_total']) ;
    this.product_discount = double.tryParse(jsonObj['product_discount']) ;
    this.productCategory = ProductCategory.fromJson(jsonObj['product_category']) ;

    this.tags = [] ;
    if(jsonObj['product_tags'] == null){
      _setTags(jsonObj['product_tags']) ;
    }

    this.images = [] ;
    if(jsonObj['product_images'] == null){
      _setImages(jsonObj['product_images']) ;

    }

    this.reviews = [] ;
    if(jsonObj['product_reviews'] == null){
      _setReviews(jsonObj['product_reviews']) ;
    }

  }


  void _setReviews(List<dynamic> jsonReview) {
    if(jsonReview.length > 0){
      for(var item in jsonReview){
        if(item != null){
          this.reviews.add(ProductReview.fromJson(item)) ;
        }
      }
    }
  }

  void _setTags(List<dynamic> jsonTag) {
    if(jsonTag.length > 0){
      for(var item in jsonTag){
        if(item != null){
          tags.add(ProductTag.fromJson(item)) ;
        }
      }
    }
  }


  void _setImages(List<dynamic> jsonImg){
    if(jsonImg.length > 0){
      for(var image in jsonImg){
        if(image != null){
          this.images.add(image['image_url']) ;
        }
      }
    }
  }

  String featuredImage(){
    if (this.images.length > 0){
      return this.images[0];
    }
    return 'data:image/jpeg;base64,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' ;
  }

}
api flutter dart bloc
1个回答
0
投票
用产品分类编辑了我的问题
© www.soinside.com 2019 - 2024. All rights reserved.