Last active
April 14, 2021 10:54
-
-
Save nhancv/400d415a629fb67927cc5cfb40b677b4 to your computer and use it in GitHub Desktop.
Flutter picker widget
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import 'package:flutter/cupertino.dart'; | |
import 'package:flutter/material.dart'; | |
import 'package:flutter/services.dart'; | |
import 'package:nft/services/safety/base_stateful.dart'; | |
import 'package:nft/utils/app_extension.dart'; | |
import 'package:nft/utils/app_style.dart'; | |
import 'package:nft/widgets/w_bottom_action_sheet.dart'; | |
import 'package:nft/widgets/w_button_inkwell.dart'; | |
import 'package:nft/widgets/w_divider_line.dart'; | |
/// Use: final DateTime dateTime = await WPickerDate.showPicker(context); | |
class WPickerDate extends StatefulWidget { | |
const WPickerDate({Key key, this.initDateTime}) : super(key: key); | |
final DateTime initDateTime; | |
static Future<DateTime> showPicker(BuildContext context, | |
{DateTime initDateTime}) { | |
return showCupertinoModalPopup<DateTime>( | |
context: context, | |
builder: (BuildContext context) { | |
return WPickerDate( | |
initDateTime: initDateTime, | |
); | |
}); | |
} | |
@override | |
_WPickerDateState createState() => _WPickerDateState(); | |
} | |
class _WPickerDateState extends BaseStateful<WPickerDate> { | |
DateTime selected = DateTime.now(); | |
@override | |
Widget build(BuildContext context) { | |
super.build(context); | |
return WBottomActionSheet( | |
body: Container( | |
child: Column( | |
children: <Widget>[ | |
Container( | |
height: 50, | |
alignment: Alignment.center, | |
child: Text( | |
'Pick a time', | |
style: normalTextStyle(17.SP, color: const Color(0xFF8F8F8F)), | |
), | |
), | |
const WDividerLine(), | |
Container( | |
height: 200, | |
child: CupertinoDatePicker( | |
initialDateTime: widget.initDateTime ?? selected, | |
mode: CupertinoDatePickerMode.time, | |
onDateTimeChanged: (DateTime value) { | |
HapticFeedback.selectionClick(); | |
setState(() { | |
selected = value; | |
}); | |
}, | |
), | |
), | |
const WDividerLine(), | |
WButtonInkwell( | |
child: Container( | |
height: 57, | |
alignment: Alignment.center, | |
child: Text( | |
'Confirm', | |
style: normalTextStyle(17.SP, color: const Color(0xFF0080FA)), | |
), | |
), | |
onPressed: () { | |
Navigator.of(context).pop(selected); | |
}, | |
), | |
], | |
), | |
), | |
); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import 'package:flutter/cupertino.dart'; | |
import 'package:flutter/material.dart'; | |
import 'package:flutter/services.dart'; | |
import 'package:nft/services/safety/base_stateful.dart'; | |
import 'package:nft/utils/app_extension.dart'; | |
import 'package:nft/utils/app_style.dart'; | |
import 'package:nft/widgets/w_bottom_action_sheet.dart'; | |
import 'package:nft/widgets/w_button_inkwell.dart'; | |
import 'package:nft/widgets/w_divider_line.dart'; | |
/// Use: final Duration duration = await WPickerDate.showPicker(context); | |
class WPickerTime extends StatefulWidget { | |
const WPickerTime({Key key, this.initDuration}) : super(key: key); | |
final Duration initDuration; | |
static Future<Duration> showPicker(BuildContext context, | |
{Duration initDuration}) { | |
return showCupertinoModalPopup<Duration>( | |
context: context, | |
builder: (BuildContext context) { | |
return WPickerTime( | |
initDuration: initDuration, | |
); | |
}); | |
} | |
@override | |
_WPickerTimeState createState() => _WPickerTimeState(); | |
} | |
class _WPickerTimeState extends BaseStateful<WPickerTime> { | |
Duration selected = const Duration(minutes: 1); | |
@override | |
Widget build(BuildContext context) { | |
super.build(context); | |
final bool isTimeValid = selected > Duration.zero; | |
return WBottomActionSheet( | |
body: Container( | |
child: Column( | |
children: <Widget>[ | |
Container( | |
height: 50, | |
alignment: Alignment.center, | |
child: Text( | |
context.strings.textPickDurationHint, | |
style: normalTextStyle(17.SP, color: const Color(0xFF8F8F8F)), | |
), | |
), | |
const WDividerLine(), | |
Container( | |
height: 200, | |
child: CupertinoTimerPicker( | |
initialTimerDuration: widget.initDuration ?? selected, | |
mode: CupertinoTimerPickerMode.hm, | |
onTimerDurationChanged: (Duration value) { | |
HapticFeedback.selectionClick(); | |
setState(() { | |
selected = value; | |
}); | |
}, | |
), | |
), | |
const WDividerLine(), | |
WButtonInkwell( | |
child: Container( | |
height: 57, | |
alignment: Alignment.center, | |
child: Text( | |
'Confirm', | |
style: normalTextStyle(17.SP, | |
color: const Color(0xFF0080FA) | |
.withOpacity(isTimeValid ? 1 : 0.4)), | |
), | |
), | |
onPressed: isTimeValid | |
? () { | |
Navigator.of(context).pop(selected); | |
} | |
: null, | |
), | |
], | |
), | |
), | |
); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import 'package:flutter/cupertino.dart'; | |
import 'package:flutter/material.dart'; | |
import 'package:flutter/services.dart'; | |
import 'package:nft/services/safety/base_stateful.dart'; | |
import 'package:nft/utils/app_extension.dart'; | |
import 'package:nft/utils/app_style.dart'; | |
import 'package:nft/widgets/w_bottom_action_sheet.dart'; | |
import 'package:nft/widgets/w_button_inkwell.dart'; | |
import 'package:nft/widgets/w_divider_line.dart'; | |
/// Use: final int index = await WPickerValue.showPicker(context, initialIndex: 0, initValues: <String>[]); | |
class WPickerValue extends StatefulWidget { | |
const WPickerValue({Key key, this.initialIndex, this.initValues}) | |
: super(key: key); | |
final int initialIndex; | |
final List<String> initValues; | |
static Future<int> showPicker(BuildContext context, | |
{int initialIndex = 0, List<String> initValues}) { | |
return showCupertinoModalPopup<int>( | |
context: context, | |
builder: (BuildContext context) { | |
return WPickerValue( | |
initialIndex: initialIndex, | |
initValues: initValues, | |
); | |
}); | |
} | |
@override | |
_WPickerValueState createState() => _WPickerValueState(); | |
} | |
class _WPickerValueState extends BaseStateful<WPickerValue> { | |
int selected = 0; | |
@override | |
Widget build(BuildContext context) { | |
super.build(context); | |
final List<Widget> children = widget.initValues == null | |
? <Widget>[] | |
: widget.initValues | |
.map( | |
(String e) => Container( | |
alignment: Alignment.center, | |
child: Text(e, | |
style: normalTextStyle( | |
20.SP, | |
color: Colors.black, | |
)), | |
), | |
) | |
.toList(); | |
const double itemExtent = 50; | |
final double height = | |
children.isNotEmpty ? (children.length * itemExtent) : itemExtent; | |
return WBottomActionSheet( | |
body: Container( | |
child: Column( | |
children: <Widget>[ | |
Container( | |
height: 50, | |
alignment: Alignment.center, | |
child: Text( | |
'Pick a value', | |
style: normalTextStyle( | |
17.SP, | |
color: const Color(0xFF8F8F8F), | |
), | |
), | |
), | |
const WDividerLine(), | |
Container( | |
height: height, | |
child: CupertinoPicker( | |
onSelectedItemChanged: (int index) { | |
HapticFeedback.selectionClick(); | |
setState(() { | |
selected = index; | |
}); | |
}, | |
itemExtent: itemExtent, | |
children: children, | |
scrollController: FixedExtentScrollController( | |
initialItem: widget.initialIndex ?? 0), | |
), | |
), | |
const WDividerLine(), | |
WButtonInkwell( | |
child: Container( | |
height: 57, | |
alignment: Alignment.center, | |
child: Text( | |
'Confirm', | |
style: mediumTextStyle( | |
17.SP, | |
color: const Color(0xFF0080FA), | |
), | |
), | |
), | |
onPressed: () { | |
Navigator.of(context).pop(selected); | |
}, | |
), | |
], | |
), | |
), | |
); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment