我遇到错误 错误使用ParentDataWidget。
Mobile App
错误代码是
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:testapp/constants.dart';
import 'package:testapp/request/quotation_resources.dart';
import 'dart:math';
class AuctionDetails extends StatelessWidget {
final QuotationResources quotationResources;
const AuctionDetails({Key key, this.quotationResources}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: kPrimaryColor,
appBar: buildAppBar,
body: BodyAuction(),
);
}
AppBar get buildAppBar {
return AppBar(
backgroundColor: kBackgroundColor,
elevation: 0,
leading: Padding(
padding: EdgeInsets.only(left: kDefaultPadding),
child:
IconButton(icon: Icon(FontAwesomeIcons.backward), onPressed: () {}),
),
);
}
}
class BodyAuction extends StatelessWidget {
final QuotationResources quotationResources;
const BodyAuction({Key key, this.quotationResources}) : super(key: key);
@override
Widget build(BuildContext context) {
Size size = MediaQuery.of(context).size;
var cardAspectRatio = 10.0 / 14.0;
var widgetAspectRatio = cardAspectRatio * 1.2;
return Column(
children: <Widget>[
Container(
padding: EdgeInsets.symmetric(horizontal: kDefaultPadding),
decoration: BoxDecoration(
color: kBackgroundColor,
borderRadius: BorderRadius.only(
bottomLeft: Radius.circular(50),
bottomRight: Radius.circular(50),
),
),
child: Column(
children: <Widget>[
Container(
margin: EdgeInsets.symmetric(vertical: kDefaultPadding),
height: size.width * 0.8,
child: CardSlider(),
),
],
),
),
],
);
}
}
class CardSlider extends StatefulWidget {
@override
_CardSliderState createState() => _CardSliderState();
}
var cardAspectRatio = 10.0 / 14.0;
var widgetAspectRatio = cardAspectRatio * 1.2;
class _CardSliderState extends State<CardSlider> {
var currentPage = images.length - 1.0;
@override
Widget build(BuildContext context) {
PageController controller = PageController(initialPage: images.length - 1);
controller.addListener(() {
setState(() {
currentPage = controller.page;
});
});
return Column(
children: <Widget>[
CardScrollWidget(currentPage),
Positioned.fill(
child: PageView.builder(
itemCount: images.length,
controller: controller,
reverse: true,
itemBuilder: (context, index) {
return Container();
},
),
)
],
);
}
}
class CardScrollWidget extends StatelessWidget {
var currentPage;
var padding = 20.0;
var verticalInset = 20.0;
CardScrollWidget(this.currentPage);
@override
Widget build(BuildContext context) {
return new AspectRatio(
aspectRatio: widgetAspectRatio,
child: LayoutBuilder(builder: (context, contraints) {
var width = contraints.maxWidth;
var height = contraints.maxHeight;
var safeWidth = width - 2 * padding;
var safeHeight = height - 2 * padding;
var heightOfPrimaryCard = safeHeight;
var widthOfPrimaryCard = heightOfPrimaryCard * cardAspectRatio;
var primaryCardLeft = safeWidth - widthOfPrimaryCard;
var horizontalInset = primaryCardLeft / 2;
List<Widget> cardList = new List();
for (var i = 0; i < images.length; i++) {
var delta = i - currentPage;
bool isOnRight = delta > 0;
var start = padding +
max(
primaryCardLeft -
horizontalInset * -delta * (isOnRight ? 15 : 1),
0.0);
var cardItem = Positioned.directional(
top: padding + verticalInset * max(-delta, 0.0),
bottom: padding + verticalInset * max(-delta, 0.0),
start: start,
textDirection: TextDirection.rtl,
child: ClipRRect(
borderRadius: BorderRadius.circular(16.0),
child: Container(
decoration: BoxDecoration(color: Colors.white, boxShadow: [
BoxShadow(
color: Colors.black12,
offset: Offset(3.0, 6.0),
blurRadius: 10.0)
]),
child: AspectRatio(
aspectRatio: cardAspectRatio,
child: Stack(
fit: StackFit.expand,
children: <Widget>[
Image.asset(images[i], fit: BoxFit.cover),
Align(
alignment: Alignment.bottomLeft,
)
],
),
),
),
),
);
cardList.add(cardItem);
}
return Stack(
children: cardList,
);
}),
);
}
}
答案 0 :(得分:5)
错误代码已经显示出什么地方不对。 “定位的窗口小部件直接放置在堆栈窗口小部件中。有问题的“位置”当前放置在“列”窗口小部件中。”您必须将Positioned Widget放置在Stacks中。您不能将它们放在“列”中。
Column(
children: <Widget>[
CardScrollWidget(currentPage),
Positioned.fill(
child: PageView.builder(
itemCount: images.length,
controller: controller,
reverse: true,
itemBuilder: (context, index) {
return Container();
},
),
)
],
);
只需将Stack替换为Stack或不使用Positioned.fill。