import 'package:bloc_sample/blocs/product_bloc.dart';
import 'package:flutter/material.dart';
import '../blocs/cart_bloc.dart';
import '../models/cart.dart';
class ProductListScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("eCommerce"),
actions: [
IconButton(
icon: Icon(Icons.shopping_cart),
onPressed: () => Navigator.pushNamed(context, "/cart"),
)
],
),
body: buildProductList(),
);
}
buildProductList() {
return StreamBuilder(
initialData: productBloc.getAll(),
stream: productBloc.getStream,
builder: (context, snapshot) {
return snapshot.data.length > 0 //ERROR
? buildProductListItems(snapshot)
: Center(
child: Text("No data"),
);
},
);
}
buildProductListItems(AsyncSnapshot snapshot) {
return ListView.builder(
itemCount: snapshot.data.length,
itemBuilder: (BuildContext context, index) {
final list = snapshot.data;
return ListTile(
title: Text(list[index].name),
subtitle: Text(list[index].price.toString()),
trailing: IconButton(
icon: Icon(Icons.add_shopping_cart),
onPressed: () {
cartBloc.addToCart(Cart(list[index], 1));
},
),
);
});
}
}
不能無條件訪問屬性“長度”,因為接收者可以為“空”。(檔案)嘗試使訪問有條件(使用'?.')或向目標添加空檢查('!')。
我試過了 ”?” 要么 ”!” 但它不起作用。你能幫助我嗎?我怎么解決這個問題?
uj5u.com熱心網友回復:
編譯器不確定它snapshot.data是否為空。它也不知道它是一個List. (我假設它是List因為您正在訪問該length屬性)。
所以在這里你需要一個 bang 運算子!和一個型別轉換的組合。
如果Map只是將型別轉換更改為Map.
(snapshot.data! as List).length > 0
另一個選項是空檢查。
if (snapshot.data != null) {
return buildProductListItems(snapshot);
} else {
return Center(child: Text("No data"),
);
}
選擇哪一個取決于您對product.getStream. 如果它始終至少是一個空串列并且從不為空,則使用第一個選項。如果實際上null沒有資料,則使用空檢查。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/454197.html
上一篇:ShowModalBottomSheet打開時螢屏上沒有變化
下一篇:UniformGrid的行屬性
