【发布时间】:2021-08-10 14:06:17
【问题描述】:
我有一个通过偏移量上传数据的 api 调用,我的目标是在用户向下滚动时加载 10 x 10,问题是我无法向下滚动并显示更多数据:这是我的 sn-ps:
class Body extends StatefulWidget {
@override
_BodyState createState() => _BodyState();
}
class _BodyState extends State<Body> {
@override
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
return SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
HomeHeader(),
ProductsGridViewInfiniteScroll(),
],
),
);
}
}
这里的滚动控制器似乎不起作用:
class ProductsGridViewInfiniteScroll extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return ProductsGridViewInfiniteScrollState();
}
}
class ProductsGridViewInfiniteScrollState
extends State<ProductsGridViewInfiniteScroll> {
Future<ProductList> products;
int offset;
ScrollController _controller;
_scrollListener() {
if (_controller.offset >= _controller.position.maxScrollExtent &&
!_controller.position.outOfRange) {
setState(() {
offset += 10;
products = loadProductsByIdService(1, offset, 10);
});
}
}
@override
void initState() {
offset = 0;
products = loadProductsByIdService(1, offset, 10);
_controller = ScrollController();
_controller.addListener(_scrollListener);
super.initState();
}
Widget build(BuildContext context) {
return FutureBuilder<ProductList>(
future: products,
builder: (context, snapshot) {
if (snapshot.hasData) {
return GridView.builder(
controller: _controller,
itemCount: snapshot.data.products.length,
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
crossAxisSpacing: 4.0,
mainAxisSpacing: 10.0),
shrinkWrap: true,
physics: ScrollPhysics(),
itemBuilder: (BuildContext ctx, index) {
return Container(
alignment: Alignment.center,
child: ProductCard(product: snapshot.data.products[index]),
);
});
} else {
return SizedBox();
}
});
}
}
Future<ProductList> loadProductsByIdService(serviceid, offset, limit) async {
var datamap = {'service_id': serviceid, 'offset': offset, 'limit': limit};
var data = json.encode(datamap);
ProductList products;
final response = await http.post(Uri.parse(PRODUCTS),
headers: {
"Accept": "application/json",
"Content-Type": "application/x-www-form-urlencoded"
},
body: data,
encoding: Encoding.getByName("utf-8"));
if (response.body.isNotEmpty) {
if (response.statusCode == 200) {
products = ProductList.fromJson(json.decode(response.body));
}
} else {
throw Exception('echec de chargement des produits');
}
return products;
}
我想在每次滚动到达屏幕底部时重建构建函数并更新产品变量,请帮助;
【问题讨论】:
-
您是否重新启动了应用程序?当我们定义控制器时,应用程序需要重新启动。请检查是否执行了 setState。
-
我按照你说的重新启动了应用程序,但是向下滚动时只加载了 10 个产品,没有任何反应,如果你不介意我如何检查 setState 是否被执行?
-
做一个 print("something") 应该在终端打印一些东西。
-
是否显示了任何产品?
-
是的,前 10 个产品
标签: flutter flutter-futurebuilder