Skip to content

Instantly share code, notes, and snippets.

@nhancv
Last active April 14, 2021 10:54
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nhancv/400d415a629fb67927cc5cfb40b677b4 to your computer and use it in GitHub Desktop.
Save nhancv/400d415a629fb67927cc5cfb40b677b4 to your computer and use it in GitHub Desktop.
Flutter picker widget
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);
},
),
],
),
),
);
}
}
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,
),
],
),
),
);
}
}
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