Merge remote-tracking branch 'upstream/master'

This commit is contained in:
Phaung Phaung
2021-09-10 14:32:04 +06:30
88 changed files with 851 additions and 854 deletions

View File

@@ -54,7 +54,7 @@ Future<void> showConfirmDialog(
FlatButton(
color: Colors.grey[300],
child: Text(
AppTranslations.of(context).text('btn.cancel'),
AppTranslations.of(context)!.text('btn.cancel'),
style: Provider.of<LanguageModel>(context).isEng
? TextStyle()
: TextStyle(fontFamily: 'Myanmar3'),
@@ -67,7 +67,7 @@ Future<void> showConfirmDialog(
),
FlatButton(
color: primaryColor,
child: Text(AppTranslations.of(context).text('btn.ok'),
child: Text(AppTranslations.of(context)!.text('btn.ok'),
style: Provider.of<LanguageModel>(context).isEng
? TextStyle(
color: Colors.white,
@@ -367,7 +367,7 @@ Widget fcsButton(BuildContext context, String text,
}
String getLocalString(BuildContext context, String key) {
return AppTranslations.of(context).text(key);
return AppTranslations.of(context)!.text(key);
}
void showToast(GlobalKey key, String text) {

View File

@@ -5,7 +5,7 @@ import 'package:fcs/pages/widgets/local_text.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_icons/flutter_icons.dart';
import 'package:flutter_vector_icons/flutter_vector_icons.dart';
import 'package:provider/provider.dart';
class BottomWidgets extends StatelessWidget {

View File

@@ -3,20 +3,20 @@ import 'package:fcs/helpers/theme.dart';
import 'package:fcs/pages/delivery_address/delivery_address_row.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_icons/flutter_icons.dart';
import 'package:flutter_vector_icons/flutter_vector_icons.dart';
import 'callbacks.dart';
import 'display_text.dart';
import 'local_text.dart';
class DefaultDeliveryAddress extends StatelessWidget {
final DeliveryAddress deliveryAddress;
final String labelKey;
final OnTap onTap;
final IconData iconData;
final DeliveryAddress? deliveryAddress;
final String? labelKey;
final OnTap? onTap;
final IconData? iconData;
const DefaultDeliveryAddress(
{Key key, this.deliveryAddress, this.onTap, this.labelKey, this.iconData})
{Key? key, this.deliveryAddress, this.onTap, this.labelKey, this.iconData})
: super(key: key);
@override
@@ -37,7 +37,7 @@ class DefaultDeliveryAddress extends StatelessWidget {
onTap == null
? Container()
: GestureDetector(
onTap: () => onTap(),
onTap: () => onTap!(),
child: Chip(
label: LocalText(
context, "delivery_address.change_address",
@@ -50,8 +50,8 @@ class DefaultDeliveryAddress extends StatelessWidget {
child: deliveryAddress == null
? Container()
: DeliveryAddressRow(
key: ValueKey(deliveryAddress.id),
deliveryAddress: deliveryAddress),
key: ValueKey(deliveryAddress!.id),
deliveryAddress: deliveryAddress!),
),
],
);

View File

@@ -10,11 +10,11 @@ import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class DeliveryAddressSelection extends StatefulWidget {
final DeliveryAddress deliveryAddress;
final User user;
final DeliveryAddress? deliveryAddress;
final User? user;
const DeliveryAddressSelection({
Key key,
Key? key,
this.deliveryAddress,
this.user,
}) : super(key: key);
@@ -38,7 +38,7 @@ class _DeliveryAddressSelectionState extends State<DeliveryAddressSelection> {
Provider.of<DeliveryAddressModel>(context, listen: false);
var deliveryAddresses =
await addressModel.getDeliveryAddresses(widget.user.id);
await addressModel.getDeliveryAddresses(widget.user!.id);
setState(() {
this._deliveryAddresses = deliveryAddresses;
});
@@ -95,7 +95,7 @@ class _DeliveryAddressSelectionState extends State<DeliveryAddressSelection> {
padding: const EdgeInsets.all(10.0),
child: Icon(Icons.check,
color: widget.deliveryAddress != null &&
_deliveryAddress.id == widget.deliveryAddress.id
_deliveryAddress.id == widget.deliveryAddress!.id
? primaryColor
: Colors.black26),
),

View File

@@ -5,10 +5,10 @@ import 'package:flutter/material.dart';
import 'local_text.dart';
class DialogInput extends StatefulWidget {
final String value;
final String label;
final String? value;
final String? label;
const DialogInput({Key key, this.label, this.value}) : super(key: key);
const DialogInput({Key? key, this.label, this.value}) : super(key: key);
@override
_DialogInputState createState() => _DialogInputState();
}
@@ -24,7 +24,7 @@ class _DialogInputState extends State<DialogInput> {
void initState() {
super.initState();
if (widget.value != null) {
_controller.text = widget.value;
_controller.text = widget.value!;
_focusNode.addListener(() {
if (_focusNode.hasFocus) {
_controller.selection = TextSelection(
@@ -41,7 +41,7 @@ class _DialogInputState extends State<DialogInput> {
child: AlertDialog(
title: LocalText(
context,
widget.label,
widget.label!,
fontSize: 20,
color: primaryColor,
),
@@ -77,7 +77,7 @@ class _DialogInputState extends State<DialogInput> {
fontWeight: FontWeight.bold,
),
onPressed: () async {
if (!_formKey.currentState.validate()) return;
if (!_formKey.currentState!.validate()) return;
_save();
})
],

View File

@@ -6,13 +6,13 @@ import 'package:flutter/material.dart';
import 'local_text.dart';
class DiscountDropdown<T> extends StatelessWidget {
final Function(T) callback;
final IconData iconData;
final T selectedValue;
final List<T> values;
final Function(T)? callback;
final IconData? iconData;
final T? selectedValue;
final List<T>? values;
const DiscountDropdown(
{Key key, this.callback, this.iconData, this.selectedValue, this.values})
{Key? key, this.callback, this.iconData, this.selectedValue, this.values})
: super(key: key);
@override
@@ -46,11 +46,11 @@ class DiscountDropdown<T> extends StatelessWidget {
height: 1,
color: primaryColor,
),
onChanged: (T newValue) {
callback(newValue);
onChanged: (T? newValue) {
callback!(newValue!);
},
isExpanded: true,
items: values.map<DropdownMenuItem<T>>((T value) {
items: values!.map<DropdownMenuItem<T>>((T value) {
return DropdownMenuItem<T>(
value: value,
child: Text(value == null ? "" : (value as Discount).code,

View File

@@ -4,12 +4,12 @@ import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/widgets.dart';
class DisplayImageSource {
String url;
File file;
String? url;
File? file;
DisplayImageSource({this.url, this.file});
ImageProvider get imageProvider =>
file == null ? CachedNetworkImageProvider(url) : FileImage(file);
ImageProvider? get imageProvider =>
file == null ? CachedNetworkImageProvider(url!) : FileImage(file!);
@override
bool operator ==(other) {

View File

@@ -62,7 +62,7 @@ class DisplayText extends StatelessWidget {
labelTextKey == null
? Container()
: Text(
AppTranslations.of(context).text(labelTextKey!),
AppTranslations.of(context)!.text(labelTextKey!),
style: labelStyle,
),
text == null

View File

@@ -5,10 +5,10 @@ import 'package:flutter/material.dart';
import 'callbacks.dart';
class FcsExpansionTile extends StatefulWidget {
final ValueChanged<bool> onExpansionChanged;
final CallBack onEditPress;
final List<Widget> children;
final Widget title;
final ValueChanged<bool>? onExpansionChanged;
final CallBack? onEditPress;
final List<Widget>? children;
final Widget? title;
final bool isEdit;
const FcsExpansionTile(
{this.onExpansionChanged,
@@ -21,7 +21,7 @@ class FcsExpansionTile extends StatefulWidget {
}
class _FcsExpansionTileState extends State<FcsExpansionTile> {
bool expanded;
bool? expanded;
@override
void initState() {
this.expanded = false;
@@ -39,22 +39,22 @@ class _FcsExpansionTileState extends State<FcsExpansionTile> {
expanded = value;
});
if (widget.onExpansionChanged != null)
widget.onExpansionChanged(value);
widget.onExpansionChanged!(value);
},
title: widget.title,
children: widget.children,
title: widget.title != null ? widget.title! : Container(),
children: widget.children != null ? widget.children! : [Container()],
trailing: widget.isEdit
? IconButton(
padding: EdgeInsets.all(0),
iconSize: 20,
onPressed: () =>
widget.onEditPress != null ? widget.onEditPress() : {},
widget.onEditPress != null ? widget.onEditPress!() : {},
icon: Icon(
Icons.edit,
color: primaryColor,
))
: AnimatedSwitcher(
child: expanded
child: expanded!
? Icon(
Icons.remove,
color: primaryColor,

View File

@@ -1,4 +1,4 @@
import 'package:flutter_icons/flutter_icons.dart';
import 'package:flutter_vector_icons/flutter_vector_icons.dart';
const cartonIconData = MaterialCommunityIcons.package;
const customFeeIconData = MaterialCommunityIcons.security;

View File

@@ -1,7 +1,7 @@
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter_icons/flutter_icons.dart';
import 'package:flutter_vector_icons/flutter_vector_icons.dart';
import 'package:image_picker/image_picker.dart';
import 'local_text.dart';
@@ -18,15 +18,15 @@ modelBottomSheet(BuildContext context, {final OnFile onFile}) {
}
class ImageFile extends StatefulWidget {
final OnFile onFile;
final OnFile? onFile;
const ImageFile({Key key, this.onFile}) : super(key: key);
const ImageFile({Key? key, this.onFile}) : super(key: key);
@override
_ImageFileState createState() => _ImageFileState();
}
class _ImageFileState extends State<ImageFile> {
File selectedFile;
File? selectedFile;
@override
Widget build(BuildContext context) {
return Container(
@@ -44,7 +44,7 @@ class _ImageFileState extends State<ImageFile> {
onTap: () async {
Navigator.pop(context);
selectedFile = await pickImage(ImageSource.gallery);
if (widget.onFile != null) widget.onFile(selectedFile);
if (widget.onFile != null) widget.onFile!(selectedFile!);
}),
new ListTile(
leading: CircleAvatar(
@@ -58,7 +58,7 @@ class _ImageFileState extends State<ImageFile> {
Navigator.pop(context);
selectedFile = await pickImage(ImageSource.camera);
if (widget.onFile != null) widget.onFile(selectedFile);
if (widget.onFile != null) widget.onFile!(selectedFile!);
},
),
new ListTile(
@@ -75,7 +75,7 @@ class _ImageFileState extends State<ImageFile> {
selectedFile = null;
});
if (widget.onFile != null) widget.onFile(selectedFile);
if (widget.onFile != null) widget.onFile!(selectedFile!);
},
),
],

View File

@@ -8,10 +8,10 @@ import 'show_img.dart';
typedef OnFile = void Function(File);
class ImageUrl extends StatefulWidget {
final String title;
final String url;
final String? title;
final String? url;
const ImageUrl({Key key, this.title, this.url}) : super(key: key);
const ImageUrl({Key? key, this.title, this.url}) : super(key: key);
@override
_ImageUrlState createState() => _ImageUrlState();
}
@@ -25,12 +25,12 @@ class _ImageUrlState extends State<ImageUrl> {
context,
MaterialPageRoute(
builder: (context) =>
ShowImage(url: widget.url, fileName: widget.title)),
ShowImage(url: widget.url!, fileName: widget.title!)),
)
},
child: Chip(
avatar: Icon(Icons.image),
label: Text(widget.title),
label: Text(widget.title!),
),
);
}

View File

@@ -10,19 +10,19 @@ class InputDate extends StatelessWidget {
final String labelTextKey;
final IconData iconData;
final TextEditingController controller;
final FormFieldValidator<String> validator;
final FormFieldValidator<String>? validator;
final int maxLines;
final bool withBorder;
final Color borderColor;
final TextInputType textInputType;
final Color? borderColor;
final TextInputType? textInputType;
final bool autoFocus;
final String dateFormatString;
const InputDate(
{Key key,
this.labelTextKey,
this.iconData,
this.controller,
{Key? key,
required this.labelTextKey,
required this.iconData,
required this.controller,
this.validator,
this.maxLines = 1,
this.withBorder = false,
@@ -72,7 +72,7 @@ class InputDate extends StatelessWidget {
),
labelText: labelTextKey == null
? null
: AppTranslations.of(context).text(labelTextKey),
: AppTranslations.of(context)!.text(labelTextKey),
labelStyle: languageModel.isEng
? newLabelStyle(color: Colors.black54, fontSize: 20)
: newLabelStyleMM(color: Colors.black54, fontSize: 20),

View File

@@ -6,20 +6,20 @@ import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class InputText extends StatelessWidget {
final String labelTextKey;
final IconData iconData;
final TextEditingController controller;
final FormFieldValidator<String> validator;
final String? labelTextKey;
final IconData? iconData;
final TextEditingController? controller;
final FormFieldValidator<String>? validator;
final int maxLines;
final bool withBorder;
final Color borderColor;
final TextInputType textInputType;
final Color? borderColor;
final TextInputType? textInputType;
final bool autoFocus;
final TextAlign textAlign;
final bool enabled;
const InputText(
{Key key,
{Key? key,
this.labelTextKey,
this.iconData,
this.controller,
@@ -30,7 +30,7 @@ class InputText extends StatelessWidget {
this.autoFocus = false,
this.textInputType,
this.enabled = true,
this.textAlign})
this.textAlign = TextAlign.start})
: super(key: key);
@override
Widget build(BuildContext context) {
@@ -46,7 +46,7 @@ class InputText extends StatelessWidget {
style: textStyle,
maxLines: maxLines,
keyboardType: textInputType,
textAlign: textAlign ?? TextAlign.start,
textAlign: textAlign,
decoration: new InputDecoration(
// hintText: '',
hintStyle: TextStyle(
@@ -54,7 +54,7 @@ class InputText extends StatelessWidget {
),
labelText: labelTextKey == null
? null
: AppTranslations.of(context).text(labelTextKey),
: AppTranslations.of(context)!.text(labelTextKey!),
labelStyle: languageModel.isEng
? newLabelStyle(color: Colors.black54, fontSize: 20)
: newLabelStyleMM(color: Colors.black54, fontSize: 20),

View File

@@ -7,18 +7,18 @@ import 'package:intl/intl.dart';
import 'package:provider/provider.dart';
class InputTime extends StatelessWidget {
final String labelTextKey;
final IconData iconData;
final TextEditingController controller;
final FormFieldValidator<String> validator;
final String? labelTextKey;
final IconData? iconData;
final TextEditingController? controller;
final FormFieldValidator<String>? validator;
final int maxLines;
final bool withBorder;
final Color borderColor;
final TextInputType textInputType;
final Color? borderColor;
final TextInputType? textInputType;
final bool autoFocus;
const InputTime(
{Key key,
{Key? key,
this.labelTextKey,
this.iconData,
this.controller,
@@ -45,14 +45,14 @@ class InputTime extends StatelessWidget {
try {
final format = DateFormat.jm(); //"6:00 AM"
initialDate =
TimeOfDay.fromDateTime(format.parse(controller.text));
TimeOfDay.fromDateTime(format.parse(controller!.text));
// var values = controller.text.split(":");
// initialDate = TimeOfDay(
// hour: int.parse(values[0]), minute: int.parse(values[1]));
} catch (e) {} // ignore error
}
TimeOfDay t = await showTimePicker(
TimeOfDay? t = await showTimePicker(
initialTime: initialDate,
context: context,
);
@@ -61,7 +61,7 @@ class InputTime extends StatelessWidget {
final now = new DateTime.now();
final dt =
DateTime(now.year, now.month, now.day, t.hour, t.minute);
controller.text = "${format.format(dt)}";
controller!.text = "${format.format(dt)}";
}
},
controller: controller,
@@ -77,7 +77,7 @@ class InputTime extends StatelessWidget {
),
labelText: labelTextKey == null
? null
: AppTranslations.of(context).text(labelTextKey),
: AppTranslations.of(context)!.text(labelTextKey!),
labelStyle: languageModel.isEng
? newLabelStyle(color: Colors.black54, fontSize: 20)
: newLabelStyleMM(color: Colors.black54, fontSize: 20),

View File

@@ -10,13 +10,13 @@ const MAX_INC = 50.0;
const MAX_FEET = 25.0;
class LengthPicker extends StatefulWidget {
final TextEditingController controller;
final String lableKey;
final TextEditingController? controller;
final String? lableKey;
final bool isReadOnly;
final bool displayFeet;
const LengthPicker(
{Key key,
{Key? key,
this.controller,
this.lableKey,
this.isReadOnly = false,
@@ -35,14 +35,14 @@ class _LengthPickerState extends State<LengthPicker> {
super.initState();
if (widget.controller != null) {
_setText();
widget.controller.addListener(() {
widget.controller!.addListener(() {
_setText();
});
}
}
_setText() {
double v = double.parse(widget.controller.text, (s) => 0);
double v = double.parse(widget.controller!.text, (s) => 0);
int _v = v.toInt();
int f = (v / 12).floor();
@@ -72,8 +72,8 @@ class _LengthPickerState extends State<LengthPicker> {
context: context,
builder: (BuildContext context) {
return LengthPickerDialog(
controller: widget.controller,
labelKey: widget.lableKey,
controller: widget.controller!,
labelKey: widget.lableKey!,
displayFeet: widget.displayFeet,
);
},
@@ -82,12 +82,12 @@ class _LengthPickerState extends State<LengthPicker> {
}
class LengthPickerDialog extends StatefulWidget {
final TextEditingController controller;
final String labelKey;
final bool displayFeet;
final TextEditingController? controller;
final String? labelKey;
final bool? displayFeet;
const LengthPickerDialog(
{Key key, this.controller, this.labelKey, this.displayFeet})
{Key? key, this.controller, this.labelKey, this.displayFeet})
: super(key: key);
@override
@@ -95,8 +95,8 @@ class LengthPickerDialog extends StatefulWidget {
}
class _LengthPickerDialogState extends State<LengthPickerDialog> {
int _valueFeet;
int _valueInc;
late int _valueFeet;
late int _valueInc;
TextEditingController inchInputController = TextEditingController();
TextEditingController feetInputController = TextEditingController();
final _focusNode = FocusNode();
@@ -107,9 +107,9 @@ class _LengthPickerDialogState extends State<LengthPickerDialog> {
_valueFeet = 0;
_valueInc = 0;
if (widget.controller != null) {
double v = double.parse(widget.controller.text, (s) => 0);
double v = double.parse(widget.controller!.text, (s) => 0);
_valueFeet = (v / 12).floor();
_valueInc = widget.displayFeet ? (v % 12).toInt() : v.toInt();
_valueInc = widget.displayFeet! ? (v % 12).toInt() : v.toInt();
inchInputController.text = _valueInc.toString();
feetInputController.text = _valueFeet.toString();
}
@@ -144,7 +144,7 @@ class _LengthPickerDialogState extends State<LengthPickerDialog> {
borderSide: BorderSide(color: primaryColor, width: 1.0),
),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(color: Colors.grey[400], width: 1.0),
borderSide: BorderSide(color: Colors.grey.shade400, width: 1.0),
),
),
),
@@ -196,7 +196,7 @@ class _LengthPickerDialogState extends State<LengthPickerDialog> {
borderSide: BorderSide(color: primaryColor, width: 1.0),
),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(color: Colors.grey[400], width: 1.0),
borderSide: BorderSide(color: Colors.grey.shade400, width: 1.0),
),
),
),
@@ -233,14 +233,14 @@ class _LengthPickerDialogState extends State<LengthPickerDialog> {
title: Center(
child: LocalText(
context,
widget.labelKey,
widget.labelKey!,
color: primaryColor,
fontSize: 16,
)),
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: widget.displayFeet
children: widget.displayFeet!
? [
Container(width: 100, child: feetBox),
Container(width: 100, child: inchBox),
@@ -252,7 +252,7 @@ class _LengthPickerDialogState extends State<LengthPickerDialog> {
SizedBox(
height: 10,
),
widget.displayFeet
widget.displayFeet!
? Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
@@ -295,11 +295,11 @@ class _LengthPickerDialogState extends State<LengthPickerDialog> {
),
Slider(
activeColor: primaryColor,
value: _valueInc.toDouble() > (widget.displayFeet ? 11 : MAX_INC)
value: _valueInc.toDouble() > (widget.displayFeet! ? 11 : MAX_INC)
? 0
: _valueInc.toDouble(),
min: 0,
max: widget.displayFeet ? 11 : MAX_INC,
max: widget.displayFeet! ? 11 : MAX_INC,
divisions: 100,
label: (_valueInc ?? 0).round().toString(),
onChanged: (double v) {
@@ -318,10 +318,10 @@ class _LengthPickerDialogState extends State<LengthPickerDialog> {
});
int _v = _valueInc.round() + _valueFeet.round() * 12;
if (widget.controller != null) {
widget.controller.text = _v.toString();
widget.controller!.text = _v.toString();
}
feetInputController.text =
widget.displayFeet ? _valueFeet.round().toString() : _v.toString();
widget.displayFeet! ? _valueFeet.round().toString() : _v.toString();
}
_updateInc(double v) {
@@ -330,8 +330,8 @@ class _LengthPickerDialogState extends State<LengthPickerDialog> {
});
int _v = _valueInc.round() + _valueFeet.round() * 12;
if (widget.controller != null) {
widget.controller.text =
widget.displayFeet ? _v.toString() : _valueInc.toString();
widget.controller!.text =
widget.displayFeet! ? _v.toString() : _valueInc.toString();
}
inchInputController.text = _valueInc.toString();
}
@@ -343,8 +343,8 @@ class _LengthPickerDialogState extends State<LengthPickerDialog> {
});
int _v = _valueInc.round() + _valueFeet.round() * 12;
if (widget.controller != null) {
widget.controller.text =
widget.displayFeet ? _v.toString() : _valueInc.toString();
widget.controller!.text =
widget.displayFeet! ? _v.toString() : _valueInc.toString();
}
}
@@ -355,7 +355,7 @@ class _LengthPickerDialogState extends State<LengthPickerDialog> {
});
int _v = _valueInc.round() + _valueFeet.round() * 12;
if (widget.controller != null) {
widget.controller.text = _v.toString();
widget.controller!.text = _v.toString();
}
}

View File

@@ -6,13 +6,13 @@ import 'package:flutter/material.dart';
import 'callbacks.dart';
class LocalButton extends StatelessWidget {
final CallBack callBack;
final IconData iconData;
final String textKey;
final Color color;
final CallBack? callBack;
final IconData? iconData;
final String? textKey;
final Color? color;
const LocalButton(
{Key key,
{Key? key,
this.callBack,
this.iconData,
this.textKey,
@@ -33,7 +33,7 @@ class LocalButton extends StatelessWidget {
minWidth: 900.0,
height: 100.0,
child: FlatButton(
onPressed: callBack == null ? null : () => callBack(),
onPressed: callBack == null ? null : () => callBack!(),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
@@ -48,7 +48,7 @@ class LocalButton extends StatelessWidget {
),
LocalText(
context,
textKey,
textKey!,
color: Colors.white,
fontSize: 16,
),

View File

@@ -5,15 +5,15 @@ import 'package:flutter/material.dart';
import 'local_text.dart';
class LocalDropdown<T> extends StatelessWidget {
final Function(T) callback;
final IconData iconData;
final T selectedValue;
final List<T> values;
final Function(T) display;
final String labelKey;
final Function(T)? callback;
final IconData? iconData;
final T? selectedValue;
final List<T>? values;
final Function(T)? display;
final String? labelKey;
const LocalDropdown(
{Key key,
{Key? key,
this.callback,
this.iconData,
this.selectedValue,
@@ -40,7 +40,7 @@ class LocalDropdown<T> extends StatelessWidget {
padding: const EdgeInsets.only(right: 18.0),
child: LocalText(
context,
labelKey,
labelKey!,
color: Colors.black54,
fontSize: 16,
),
@@ -53,20 +53,20 @@ class LocalDropdown<T> extends StatelessWidget {
height: 1,
color: Colors.grey,
),
onChanged: (T newValue) {
callback(newValue);
onChanged: (T? newValue) {
callback!(newValue!);
},
isExpanded: true,
items: values == null
? []
: values.map<DropdownMenuItem<T>>((T value) {
: values!.map<DropdownMenuItem<T>>((T value) {
return DropdownMenuItem<T>(
value: value,
child: Text(
value == null
? ""
: display != null
? display(value)
? display!(value)
: value.toString(),
overflow: TextOverflow.ellipsis,
style: TextStyle(color: primaryColor)),

View File

@@ -7,15 +7,15 @@ import 'local_popupmenu.dart';
typedef PopupMenuCallback = Function(LocalPopupMenu popupMenu);
class LocalPopupMenuButton extends StatefulWidget {
final PopupMenuCallback popupMenuCallback;
final List<LocalPopupMenu> popmenus;
final PopupMenuCallback? popupMenuCallback;
final List<LocalPopupMenu>? popmenus;
final bool multiSelect;
final bool selectable;
final IconData buttonIcon;
final IconData? buttonIcon;
final Color buttonColor;
const LocalPopupMenuButton(
{Key key,
{Key? key,
this.popupMenuCallback,
this.popmenus,
this.buttonIcon,
@@ -29,11 +29,11 @@ class LocalPopupMenuButton extends StatefulWidget {
}
class _LocalPopupMenuButtonState extends State<LocalPopupMenuButton> {
List<LocalPopupMenu> popmenus;
late List<LocalPopupMenu> popmenus;
@override
void initState() {
popmenus = widget.popmenus;
popmenus = widget.popmenus!;
super.initState();
}
@@ -64,7 +64,7 @@ class _LocalPopupMenuButtonState extends State<LocalPopupMenuButton> {
}
}
if (selected.enabled && widget.popupMenuCallback != null)
widget.popupMenuCallback(selected);
widget.popupMenuCallback!(selected);
},
icon: Container(
width: 30,

View File

@@ -1,11 +1,11 @@
class LocalPopupMenu {
int id;
String textKey;
String? textKey;
bool selected;
bool highlight;
bool enabled;
LocalPopupMenu(
{this.id,
{required this.id,
this.textKey,
this.selected = false,
this.highlight = false,

View File

@@ -3,15 +3,15 @@ import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
class LocalRadioButtons<T> extends StatelessWidget {
final Function(T) callback;
final IconData iconData;
final T selectedValue;
final List<T> values;
final Function(T)? callback;
final IconData? iconData;
final T? selectedValue;
final List<T>? values;
final bool readOnly;
final bool hideUnselected;
const LocalRadioButtons(
{Key key,
{Key? key,
this.callback,
this.iconData,
this.selectedValue,
@@ -26,19 +26,19 @@ class LocalRadioButtons<T> extends StatelessWidget {
}
List<Widget> getChildren() {
return values
return values!
.toList()
.map((e) => SizedBox(
height: 30,
child: InkWell(
onTap: () => callback(e),
onTap: () => callback!(e),
child: Row(children: <Widget>[
Radio<T>(
activeColor: primaryColor,
groupValue: selectedValue,
value: e,
onChanged: (T value) {
callback(value);
onChanged: (T? value) {
callback!(value!);
},
),
Text(e.toString()),
@@ -48,7 +48,7 @@ class LocalRadioButtons<T> extends StatelessWidget {
}
List<Widget> getReadonlyChildren() {
return values
return values!
.toList()
.map((e) => hideUnselected && e == selectedValue
? SizedBox(

View File

@@ -7,26 +7,26 @@ import 'package:fcs/helpers/theme.dart';
class LocalText extends Text {
final BuildContext context;
LocalText(this.context, String translationKey,
{Color color,
double fontSize,
FontWeight fontWeight,
List<String> translationVariables,
String text,
{Color? color,
double? fontSize,
FontWeight? fontWeight,
List<String>? translationVariables,
String? text,
bool underline = false})
: super(
text ??
AppTranslations.of(context).text(translationKey,
AppTranslations.of(context)!.text(translationKey,
translationVariables: translationVariables),
style: Provider.of<LanguageModel>(context, listen: false).isEng
? newLabelStyle(
color: color,
fontSize: fontSize,
fontWeight: fontWeight,
color: color!,
fontSize: fontSize!,
fontWeight: fontWeight!,
underline: underline)
: newLabelStyleMM(
color: color,
fontSize: fontSize,
fontWeight: fontWeight,
color: color!,
fontSize: fontSize!,
fontWeight: fontWeight!,
underline: underline));
}
@@ -35,10 +35,10 @@ class LocalLargeTitle extends Text {
LocalLargeTitle(
this.context,
String translationKey, {
Color color,
List<String> translationVariables,
Color? color,
List<String>? translationVariables,
}) : super(
AppTranslations.of(context).text(translationKey,
AppTranslations.of(context)!.text(translationKey,
translationVariables: translationVariables),
style: Provider.of<LanguageModel>(context).isEng
? TextStyle(color: color)
@@ -48,7 +48,7 @@ class LocalLargeTitle extends Text {
class TextLocalStyle extends Text {
final BuildContext context;
TextLocalStyle(this.context, String text,
{Color color, double fontSize, FontWeight fontWeight})
{Color? color, double? fontSize, FontWeight? fontWeight})
: super(text,
style: Provider.of<LanguageModel>(context).isEng
? TextStyle(

View File

@@ -4,10 +4,10 @@ import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
class LocalTitle extends StatelessWidget {
final String textKey;
final Widget trailing;
final String? textKey;
final Widget? trailing;
const LocalTitle({Key key, this.textKey, this.trailing}) : super(key: key);
const LocalTitle({Key? key, this.textKey, this.trailing}) : super(key: key);
@override
Widget build(BuildContext context) {
@@ -20,13 +20,13 @@ class LocalTitle extends StatelessWidget {
children: [
LocalText(
context,
textKey,
textKey!,
fontSize: 20,
fontWeight: FontWeight.bold,
color: primaryColor,
),
trailing != null ? Spacer() : Container(),
trailing != null ? trailing : Container()
trailing != null ? trailing! : Container()
],
),
),

View File

@@ -79,16 +79,16 @@ class MultiImgController {
}
List<File> get getUpdatedFile {
List<File> _addfiles = getAddedFile;
List<File?> _addfiles = getAddedFile;
this.imageFiles.addAll(_addfiles);
return this.imageFiles;
}
List<File> get getAddedFile {
List<File?> get getAddedFile {
return addedFiles.map((e) => e.file).toList();
}
List<String> get getDeletedUrl {
List<String?> get getDeletedUrl {
return removedFiles.map((e) => e.url).toList();
}
}

View File

@@ -8,7 +8,7 @@ import 'package:fcs/pages/widgets/show_img.dart';
import 'package:fcs/pages/widgets/show_multiple_img.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_icons/flutter_icons.dart';
import 'package:flutter_vector_icons/flutter_vector_icons.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:image_picker/image_picker.dart';
@@ -18,13 +18,13 @@ import 'multi_img_controller.dart';
typedef OnFile = void Function(File);
class MultiImageFile extends StatefulWidget {
final String title;
final String? title;
final bool enabled;
final ImageSource imageSource;
final MultiImgController controller;
final MultiImgController? controller;
const MultiImageFile(
{Key key,
{Key? key,
this.title,
this.enabled = true,
this.controller,
@@ -39,10 +39,10 @@ class _MultiImageFileState extends State<MultiImageFile> {
@override
void initState() {
super.initState();
fileContainers = widget.controller.fileContainers;
widget.controller.onChange(() {
fileContainers = widget.controller!.fileContainers;
widget.controller!.onChange(() {
setState(() {
this.fileContainers = widget.controller.fileContainers;
this.fileContainers = widget.controller!.fileContainers;
});
});
}
@@ -133,7 +133,7 @@ class _MultiImageFileState extends State<MultiImageFile> {
fit: BoxFit.cover,
width: 50,
height: 50,
imageUrl: fileContainers[index].url,
imageUrl: fileContainers[index].url!,
placeholder: (context, url) => Column(
mainAxisAlignment: MainAxisAlignment.center,
mainAxisSize: MainAxisSize.min,
@@ -150,7 +150,7 @@ class _MultiImageFileState extends State<MultiImageFile> {
: FittedBox(
fit: BoxFit.cover,
child: Image.file(
fileContainers[index].file,
fileContainers[index].file!,
),
),
),
@@ -189,13 +189,13 @@ class _MultiImageFileState extends State<MultiImageFile> {
fileContainer.file = selectedFile;
setState(() {
fileContainers.add(fileContainer);
widget.controller.addFile = fileContainer;
widget.controller!.addFile = fileContainer;
});
}
_fileRemove(DisplayImageSource fileContainer) {
setState(() {
widget.controller.removeFile = fileContainer;
widget.controller!.removeFile = fileContainer;
});
}
@@ -232,11 +232,11 @@ class _MultiImageFileState extends State<MultiImageFile> {
context,
MaterialPageRoute(
builder: (context) => ShowImage(
imageFile: fileContainer.file,
imageFile: fileContainer.file!,
url: fileContainer.file == null
? fileContainer.url
: null,
fileName: widget.title)),
? fileContainer.url!
: '',
fileName: widget.title!)),
)
},
child: Chip(
@@ -249,7 +249,7 @@ class _MultiImageFileState extends State<MultiImageFile> {
deleteIcon: Icon(
Icons.close,
),
label: Text(widget.title + " - ${index + 1}"),
label: Text("${widget.title}" + " - ${index + 1}"),
),
),
),
@@ -308,7 +308,7 @@ class _MultiImageFileState extends State<MultiImageFile> {
);
}
Widget actionIcon({OnTap onTap, Color color, IconData iconData}) {
Widget actionIcon({OnTap? onTap, Color? color, IconData? iconData}) {
return InkWell(
onTap: onTap,
child: ClipOval(

View File

@@ -5,9 +5,9 @@ import 'package:fcs/helpers/theme.dart' as theme;
class NumberCell extends StatelessWidget {
final int number;
final numberFormatter;
final TextStyle textStyle;
final TextStyle? textStyle;
NumberCell(this.number, {Key key, this.textStyle})
NumberCell(this.number, {Key? key, this.textStyle})
: numberFormatter = new NumberFormat("#,###"),
super(key: key);

View File

@@ -6,14 +6,14 @@ import 'package:provider/provider.dart';
class OfflineRedirect extends StatefulWidget {
final Widget child;
OfflineRedirect({@required this.child});
OfflineRedirect({required this.child});
@override
_OfflineRedirectState createState() => _OfflineRedirectState();
}
class _OfflineRedirectState extends State<OfflineRedirect> {
Timer offlineTimer;
Timer? offlineTimer;
@override
void initState() {
@@ -27,7 +27,7 @@ class _OfflineRedirectState extends State<OfflineRedirect> {
}
_startOfflineTimer() async {
if (offlineTimer != null && offlineTimer.isActive) return;
if (offlineTimer != null && offlineTimer!.isActive) return;
var _duration = new Duration(milliseconds: 500);
this.offlineTimer = new Timer.periodic(_duration, offlineNav);
}
@@ -41,7 +41,7 @@ class _OfflineRedirectState extends State<OfflineRedirect> {
}
void dispose() {
offlineTimer.cancel();
offlineTimer!.cancel();
super.dispose();
}

View File

@@ -11,10 +11,10 @@ import 'package:flutter_pdfview/flutter_pdfview.dart';
import 'package:share/share.dart';
class PDFScreen extends StatefulWidget {
final String title;
final String url;
final String? title;
final String? url;
PDFScreen({Key key, this.url, this.title}) : super(key: key);
PDFScreen({Key? key, this.url, this.title}) : super(key: key);
_PDFScreenState createState() => _PDFScreenState();
}
@@ -33,10 +33,10 @@ class _PDFScreenState extends State<PDFScreen> with WidgetsBindingObserver {
download();
}
File file;
File? file;
Future<void> download() async {
try {
File f = await PdfCacheMgr.pdfs.getSingleFile(widget.url);
File f = await PdfCacheMgr.pdfs.getSingleFile(widget.url!);
setState(() {
file = f;
});
@@ -89,23 +89,23 @@ class _PDFScreenState extends State<PDFScreen> with WidgetsBindingObserver {
fitPolicy: FitPolicy.BOTH,
preventLinkNavigation:
false, // if set to true the link is handled in flutter
onRender: (_pages) {
onRender: (int?_pages) {
print(('pages => $pages'));
setState(() {
pages = _pages;
pages = _pages!;
isReady = true;
});
},
onViewCreated: (PDFViewController pdfViewController) {
_controller.complete(pdfViewController);
},
onLinkHandler: (String uri) {
onLinkHandler: (String? uri) {
print('goto uri: $uri');
},
onPageChanged: (int page, int total) {
onPageChanged: (int? page, int? total) {
print('page change: $page/$total');
setState(() {
currentPage = page;
currentPage = page!;
});
},
),
@@ -116,8 +116,8 @@ class _PDFScreenState extends State<PDFScreen> with WidgetsBindingObserver {
}
_share() async {
final RenderBox box = context.findRenderObject();
await Share.shareFiles([file.path],
final RenderBox box = context.findRenderObject() as RenderBox;
await Share.shareFiles([file!.path],
mimeTypes: ["application/pdf"],
subject: "File",
sharePositionOrigin: box.localToGlobal(Offset.zero) & box.size);

View File

@@ -1,7 +1,7 @@
class PopupMenu {
int id;
String status;
PopupMenu({this.id, this.status});
PopupMenu({required this.id, required this.status});
}
List<PopupMenu> menuPopup = <PopupMenu>[

View File

@@ -4,7 +4,7 @@ import 'package:provider/provider.dart';
import 'package:fcs/helpers/theme.dart';
class LocalProgress extends Progress {
LocalProgress({bool inAsyncCall, Widget child})
LocalProgress({required bool inAsyncCall, required Widget child})
: super(
inAsyncCall: inAsyncCall,
child: child,

View File

@@ -6,12 +6,12 @@ import 'package:flutter/material.dart';
import 'package:photo_view/photo_view.dart';
class ShowImage extends StatefulWidget {
final String url;
final File imageFile;
final String fileName;
final String localImage;
final String? url;
final File? imageFile;
final String? fileName;
final String? localImage;
const ShowImage(
{Key key, this.imageFile, this.fileName, this.url, this.localImage})
{Key? key, this.imageFile, this.fileName, this.url, this.localImage})
: super(key: key);
@override
_ShowImageState createState() => _ShowImageState();
@@ -20,6 +20,13 @@ class ShowImage extends StatefulWidget {
class _ShowImageState extends State<ShowImage> {
@override
Widget build(BuildContext context) {
final ImageProvider<Object>? p;
if (widget.imageFile != null) {
p = FileImage(widget.imageFile!);
} else {
p = AssetImage(widget.localImage!);
}
return Scaffold(
appBar: AppBar(
leading: new IconButton(
@@ -35,11 +42,7 @@ class _ShowImageState extends State<ShowImage> {
backgroundDecoration: const BoxDecoration(
color: primaryColor,
),
imageProvider: widget.url != null
? NetworkImage(widget.url)
: widget.imageFile != null
? FileImage(widget.imageFile)
: AssetImage(widget.localImage),
imageProvider: widget.url != null ? NetworkImage(widget.url!) : p,
minScale: PhotoViewComputedScale.contained * 1)),
);
}