我想问一下我的问题,当阵列上的最后一个索引上的卡堆叠时,我想用无限循环来制造卡堆,我想使其循环至第一个索引。我为此使用了satck小部件和页面构建器,我有一个数据列表:
import 'package:flutter/material.dart';
List<String> images = [
'assets/images/trivia/bedroom.png',
'assets/images/trivia/digital-signature.png',
];
List<String> title = [
'“41 percent of job seekers search for jobs while in bed”',
'“Digital signatures are legally recognized.”',
];
List<Color> colorList = [
Color(0xffa605ad),
Color(0xffe0991e),
];
和我的颤动代码:
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'data.dart';
import 'dart:math';
void main() => runApp(MaterialApp(
home: Trivia(),
debugShowCheckedModeBanner: false,
));
class Trivia extends StatefulWidget {
@override
_TriviaState createState() => new _TriviaState();
}
var cardAspectRatio = 12.0 / 16.0;
var widgetAspectRatio = cardAspectRatio * 1.2;
class _TriviaState extends State<Trivia> {
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 Container(
decoration: BoxDecoration(
color: Colors.white,
),
child: Scaffold(
backgroundColor: Colors.transparent,
body: Column(
children: <Widget>[
SizedBox(
height: 70,
),
Container(
alignment: Alignment.center,
child: Text(
'Please Wait',
textAlign: TextAlign.center,
),
),
SizedBox(
height: 60,
),
Stack(
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 {
double 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(
child: Container(
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(16.0),
border: Border.all(color: colorList[i], width: 2)),
child: AspectRatio(
aspectRatio: cardAspectRatio,
child: Stack(
fit: StackFit.expand,
children: <Widget>[
Text(
'Fun Fact',
textAlign: TextAlign.center,
style: TextStyle(
decorationColor: Colors.black,
fontSize: 22,
fontFamily: 'Poppins-ExtraBold'),
),
Image.asset(
images[i],
scale: 3,
),
Align(
alignment: Alignment.bottomLeft,
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
Padding(
padding: EdgeInsets.symmetric(
horizontal: 16.0, vertical: 8.0),
child: Text(title[i],
textAlign: TextAlign.center,
style: TextStyle(
color: colorList[i],
fontSize: 18.0,
fontFamily: 'TTCommons')),
),
SizedBox(
height: 10.0,
),
],
),
)
],
),
),
),
),
);
cardList.add(cardItem);
}
return Stack(
children: cardList,
);
}),
);
}
}
我想通过阵列使卡可循环播放。还是谢谢你
您可以使用PageView进行此操作,除非提供PageView的项目计数,否则默认为循环。范例
final controller = new PageController(initialPage: 999);
...
new PageView.builder(
controller: controller,
itemBuilder: (context, index) {
return new Center(
child: new Text('${index % 5}'),
);
},
)
我不知道您是否确实需要堆栈并且不能使用PageView。.但是如果您不能使用PageView,我将尝试为您寻找答案。
希望我对您有所帮助!