【发布时间】:2019-06-03 18:28:59
【问题描述】:
我正在尝试根据方向更新 SliverGrid 中的项目数(crossAxisCount)以及 childAspectRatio。
我试图用 OrientationBuilder 包装 SliverGrid,这会引发 RenderLayout 错误,因为在 sliver 内,直接子级应该是 RenderSliver!
_gridview() 中的 SLiverGrid:GridList.dart
import 'package:app_jokally/model/Items.dart';
import 'package:flutter/material.dart';
import 'ItemList.dart';
class GridList extends StatefulWidget {
@override
_GridListState createState() => _GridListState();
}
class _GridListState extends State<GridList> {
List<Items> itemList;
@override
Widget build(BuildContext context) {
itemList = _itemList();
return Container(
child: _gridView(),
);
}
Widget _gridView() {
return SliverGrid(
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
childAspectRatio: 0.86,
),
delegate: SliverChildBuilderDelegate(
(context, index) {
return ItemList(context, items: itemList[index]);
},
childCount: itemList.length,
),
);
}
List<Items> _itemList() {
return [
Items(
id: 0,
shopName: "Demo",
shopCategory: "General",
street: "Lorem Ipsum 149",
//houseNo:
//zipCode:
city: "Demo",
province: "Demo",
country: "Demo",
rating: 4,
imageUrl: 'assets/images/shop1.png',
bannerUrl: 'assets/images/shop1.png',
shopImg1: 'assets/images/shop1.png',
shopImg2: 'assets/images/shop1.png',
shopImg3: 'assets/images/shop1.png',
shopImg4: 'assets/images/shop1.png',
),
Items(
id: 1,
shopName: "Demo",
shopCategory: "General",
street: "Lorem Ipsum 149",
//houseNo:
//zipCode:
city: "Demo",
province: "Demo",
country: "Demo",
rating: 4,
imageUrl: 'assets/images/shop1.png',
bannerUrl: 'assets/images/shop1.png',
shopImg1: 'assets/images/shop1.png',
shopImg2: 'assets/images/shop1.png',
shopImg3: 'assets/images/shop1.png',
shopImg4: 'assets/images/shop1.png',
),
];
}
}
父 CustomScrollView:ShopsList.dart
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'GridList.dart';
class ShopList extends StatefulWidget {
@override
_JkShopList createState() => _JkShopList();
}
class _JkShopList extends State<ShopList> {
@override
Widget build(BuildContext context) {
return Scaffold(
body: SafeArea(
child: Container(
margin: EdgeInsets.all(5),
child: OrientationBuilder(
builder: (context, orientation) {
return CustomScrollView(
slivers: <Widget>[
SliverAppBar(
automaticallyImplyLeading: false,
floating: true,
titleSpacing: 0,
backgroundColor: Colors.white,
elevation: 1.0,
title: _searchCard(),
),
SliverToBoxAdapter(
child: SizedBox(height: 15),
),
SliverToBoxAdapter(
child: _shopListTitle(),
),
SliverToBoxAdapter(
child: SizedBox(height: 15),
),
SliverToBoxAdapter(
child: ScrollableBadges(),
),
SliverToBoxAdapter(
child: SizedBox(height: 15),
),
GridList(),
],
);
},
),
),
),
);
}
}
══╡ 小部件库发现异常
╞═══════════════════════════════════════════════════════════
flutter: The following assertion was thrown building OrientationBuilder:
flutter: A RenderViewport expected a child of type RenderSliver but received a child of type
flutter: _RenderLayoutBuilder.
flutter: RenderObjects expect specific types of children because they coordinate with their children during
flutter: layout and paint. For example, a RenderSliver cannot be the child of a RenderBox because a
flutter: RenderSliver does not understand the RenderBox layout protocol.
flutter:
flutter: The RenderViewport that expected a RenderSliver child was created by:
flutter: Viewport ← IgnorePointer-[GlobalKey#fce57] ← Semantics ← Listener ← _GestureSemantics ←
flutter: RawGestureDetector-[LabeledGlobalKey<RawGestureDetectorState>#22327] ← Listener ← _ScrollableScope ←
flutter: _ScrollSemantics-[GlobalKey#3c1e1] ← Scrollable ← PrimaryScrollController ← CustomScrollView ← ⋯
flutter:
flutter: The _RenderLayoutBuilder that did not match the expected child type was created by:
flutter: LayoutBuilder ← OrientationBuilder ← Container ← GridList ← Viewport ←
flutter: IgnorePointer-[GlobalKey#fce57] ← Semantics ← Listener ← _GestureSemantics ←
flutter: RawGestureDetector-[LabeledGlobalKey<RawGestureDetectorState>#22327] ← Listener ← _ScrollableScope ←
flutter: ⋯
flutter:
flutter:
【问题讨论】:
-
这可能是一篇适合你的文章:flutter.dev/docs/cookbook/design/orientation
-
我认为您想将整个 customScrollView 包装在orientationBuilder中,而不仅仅是GridList
-
好的,我可以试试第二条评论。
-
您将非 Sliver 小部件放在需要放置 sliver 小部件的位置。也就是说,您将orientationBuilder 放置在customScrollView 中,作为它的子项之一。
-
不仅如此,而且(!),您的 GridList 实际上并没有扩展任何类型的 Sliver,因此也不能用作 SliverWidget。
标签: flutter flutter-layout flutter-sliver