flutter 中explaned布局有可能会出现重复刷新swiper组件,
//Coded by fsy on 2021/7/1
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_swiper/flutter_swiper.dart';
class SelData extends StatefulWidget {
const SelData({Key key}) : super(key: key);
@override
_SelDataState createState() => _SelDataState();
}
class _SelDataState extends State<SelData> {
DateTime dateTime = DateTime.now();
List year =[];
int _selYearIndex = 0;
int _selMonthIndex = 0;
int _selDayIndex = 0;
List monthDays = [31,29,31,30,31,30,31,31,30,31,30,31];
SwiperController _monthController = SwiperController();
int getDays(int fYear,int month){
//闰年
if(fYear%400==0||(fYear%4==0&&fYear%100!=0)){
monthDays[1] = 29;
}else{
monthDays[1] = 28;
}
return monthDays[month];
}
@override
void initState() {
Future.delayed(const Duration(milliseconds: 100),(){
_monthController.move(dateTime.month-1,animation: false);
});
super.initState();
}
@override
void dispose() {
_monthController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Material(
type: MaterialType.transparency,
child: Center(
child: Container(
padding: EdgeInsets.all(10),
decoration: BoxDecoration(
color: Colors.white, borderRadius: BorderRadius.circular(12)),
height: 400,
width: MediaQuery.of(context).size.width - 70,
child: Column(
children: [
Container(
alignment: Alignment.topLeft,
child: Text('开始日期'),
),
Container(
height: 150,
width: MediaQuery.of(context).size.width - 120,
child: Container(
child: Row(
children: [
//年
Expanded(
flex: 2,
child: Container(
child: Swiper(
onTap: (e){
print('你点击了我');
},
onIndexChanged: (index) {
_selYearIndex = index;
print(_selYearIndex);
setState(() {
});
},
scrollDirection: Axis.vertical,
scale: 0.5,
viewportFraction: 0.35,
itemCount: 20,
itemBuilder: (BuildContext context, int index) {
return Container(
decoration: BoxDecoration(
color: _selYearIndex == index
? Color(0xFFF7F7F7)
: Colors.white,
borderRadius: BorderRadius.horizontal(
left: Radius.circular(8))),
alignment: Alignment.center,
child: Text('${dateTime.year + index}年'),
);
},
),
)),
//月
Expanded(
flex: 2,
child: Container(
child: Swiper(
controller: _monthController,
onTap: (e){
print(getDays(_selYearIndex+dateTime.year, _selMonthIndex+1));
},
onIndexChanged: (index) {
_selMonthIndex = index;
print(getDays(_selYearIndex+dateTime.year, _selMonthIndex));
setState(() {});
},
scrollDirection: Axis.vertical,
scale: 0.5,
viewportFraction: 0.35,
itemCount: 12,
itemBuilder: (BuildContext context, int index) {
return Container(
color: _selMonthIndex == index
? Color(0xFFF7F7F7)
: Colors.white,
alignment: Alignment.center,
child: Text('${index+1}月')
);
},
),
)),
//日
Expanded(
flex: 2,
child: Container(
child: Swiper(
onIndexChanged: (index) {
_selDayIndex = index;
setState(() {});
},
scrollDirection: Axis.vertical,
scale: 0.5,
viewportFraction: 0.35,
itemCount: getDays(_selYearIndex+dateTime.year, _selMonthIndex),
// itemCount: getDays(2012,12),
itemBuilder: (BuildContext context, int index) {
return Container(
decoration: BoxDecoration(
color: _selDayIndex == index
? Color(0xFFF7F7F7)
: Colors.white,
borderRadius: BorderRadius.horizontal(right: Radius.circular(8))
),
alignment: Alignment.center,
child: Text('${index+1}日')
);
},
),
)),
],
)),
),
ElevatedButton(
onPressed: (){
print( getDays(205, 1));
}, child: Text('点击'))
],
),
),
),
);
}
}
去掉flex好啦,但是不知道原因,以后有时间了解决
//Coded by fsy on 2021/7/1
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_swiper/flutter_swiper.dart';
class SelData extends StatefulWidget {
const SelData({Key key}) : super(key: key);
@override
_SelDataState createState() => _SelDataState();
}
class _SelDataState extends State<SelData> {
DateTime dateTime = DateTime.now();
List year =[];
int _selYearIndex = 0;
int _selMonthIndex = 0;
int _selDayIndex = 0;
List monthDays = [31,29,31,30,31,30,31,31,30,31,30,31];
SwiperController _monthController = SwiperController();
int getDays(int fYear,int month){
//闰年
if(fYear%400==0||(fYear%4==0&&fYear%100!=0)){
monthDays[1] = 29;
}else{
monthDays[1] = 28;
}
return monthDays[month];
}
@override
void initState() {
Future.delayed(const Duration(milliseconds: 100),(){
_monthController.move(dateTime.month-1,animation: false);
});
super.initState();
}
@override
void dispose() {
_monthController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Material(
type: MaterialType.transparency,
child: Center(
child: Container(
padding: EdgeInsets.all(10),
decoration: BoxDecoration(
color: Colors.white, borderRadius: BorderRadius.circular(12)),
height: 400,
width: MediaQuery.of(context).size.width - 70,
child:Column(
children: [
Container(
alignment: Alignment.topLeft,
child: Text('开始日期'),
),
Container(
height: 150,
width: MediaQuery.of(context).size.width - 120,
child: Container(
child: Row(
children: [
//年
Container(
height: 300,
width: 80,
child: Swiper(
onTap: (e){
print('你点击了我');
},
onIndexChanged: (index) {
_selYearIndex = index;
print(_selYearIndex);
setState(() {
});
},
scrollDirection: Axis.vertical,
scale: 0.5,
viewportFraction: 0.35,
itemCount: 20,
itemBuilder: (BuildContext context, int index) {
return Container(
decoration: BoxDecoration(
color: _selYearIndex == index
? Color(0xFFF7F7F7)
: Colors.white,
borderRadius: BorderRadius.horizontal(
left: Radius.circular(8))),
alignment: Alignment.center,
child: Text('${dateTime.year + index}年'),
);
},
),
),
//月
Container(
height: 300,
width: 80,
child: Swiper(
controller: _monthController,
onTap: (e){
print(getDays(_selYearIndex+dateTime.year, _selMonthIndex+1));
},
onIndexChanged: (index) {
_selMonthIndex = index;
print(getDays(_selYearIndex+dateTime.year, _selMonthIndex));
setState(() {});
},
scrollDirection: Axis.vertical,
scale: 0.5,
viewportFraction: 0.35,
itemCount: 12,
itemBuilder: (BuildContext context, int index) {
return Container(
color: _selMonthIndex == index
? Color(0xFFF7F7F7)
: Colors.white,
alignment: Alignment.center,
child: Text('${index+1}月')
);
},
),
),
//日
Container(
height: 300,
width: 80,
child: Swiper(
onIndexChanged: (index) {
_selDayIndex = index;
setState(() {});
},
scrollDirection: Axis.vertical,
scale: 0.5,
viewportFraction: 0.35,
// itemCount: 5,
itemCount: getDays(_selYearIndex+dateTime.year, _selMonthIndex),
itemBuilder: (BuildContext context, int index) {
return Container(
decoration: BoxDecoration(
color: _selDayIndex == index
? Color(0xFFF7F7F7)
: Colors.white,
borderRadius: BorderRadius.horizontal(right: Radius.circular(8))
),
alignment: Alignment.center,
child: Text('${index+1}')
);
},
),
)
],
)),
),
],
),
),
),
);
}
}