Profile Page and Back Button Click

merge-requests/439/merge
Mirza.Shafique 5 years ago
parent 6261f01ab6
commit d664a216c6

@ -1497,4 +1497,6 @@ const Map localizedValues = {
"years": {"en": "Years", "ar": "سنوات"}, "years": {"en": "Years", "ar": "سنوات"},
"respirationBPM": { "en": "bpm", "ar": "نفس" }, "respirationBPM": { "en": "bpm", "ar": "نفس" },
"extremeObese": {"en": "Extreme Obese", "ar": "السمنة المفرطة"}, "extremeObese": {"en": "Extreme Obese", "ar": "السمنة المفرطة"},
"selectLanguage": { "en": "Please select any language:", "ar": ":الرجاء تحديد أي لغة" },
"recAlert": { "en": "How do you want to receive alerts?", "ar": "كيف تريد تلقي التنبيهات؟" },
}; };

@ -102,13 +102,18 @@ class _LandingPageState extends State<LandingPage> with WidgetsBindingObserver {
LocationUtils locationUtils; LocationUtils locationUtils;
Future<bool> onWillPop() { Future<bool> onWillPop() {
DateTime now = DateTime.now(); if (currentTab != 0) {
if (currentBackPressTime == null || now.difference(currentBackPressTime) > Duration(seconds: 2)) { changeCurrentTab(0);
currentBackPressTime = now;
AppToast.showToast(message: TranslationBase.of(context).pressAgain);
return Future.value(false); return Future.value(false);
} else {
DateTime now = DateTime.now();
if (currentBackPressTime == null || now.difference(currentBackPressTime) > Duration(seconds: 2)) {
currentBackPressTime = now;
AppToast.showToast(message: TranslationBase.of(context).pressAgain);
return Future.value(false);
}
return Future.value(true);
} }
return Future.value(true);
} }
changeCurrentTab(int tab) { changeCurrentTab(int tab) {

@ -50,17 +50,20 @@ class _VitalSingChartAndDetialsState extends State<VitalSingChartAndDetials> {
return SingleChildScrollView( return SingleChildScrollView(
child: Column( child: Column(
children: <Widget>[ children: <Widget>[
Card( Container(
shape: cardRadius(12), height: 400,
elevation: 1, child: Card(
margin: EdgeInsets.only(left: 16, top: 16, right: 16, bottom: 8), shape: cardRadius(12),
// child: ShowChart( elevation: 1,
// title: widget.name, margin: EdgeInsets.only(left: 16, top: 16, right: 16, bottom: 8),
// timeSeries: timeSeriesData, child: ShowChart(
// indexes: timeSeriesData.length ~/ 5.5, title: widget.name,
// horizontalInterval: 8, timeSeries: timeSeriesData,
// ), indexes: timeSeriesData.length ~/ 5.5,
child: SyncFuChart(), horizontalInterval: 8,
),
// child: SyncFuChart(),
),
), ),
Card( Card(
shape: cardRadius(12), shape: cardRadius(12),

@ -2,9 +2,11 @@ import 'package:diplomaticquarterapp/core/viewModels/dashboard_view_model.dart';
import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart';
import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart';
import 'package:diplomaticquarterapp/services/authentication/auth_provider.dart'; import 'package:diplomaticquarterapp/services/authentication/auth_provider.dart';
import 'package:diplomaticquarterapp/theme/colors.dart';
import 'package:diplomaticquarterapp/uitl/app_toast.dart'; import 'package:diplomaticquarterapp/uitl/app_toast.dart';
import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart'; import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart';
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
import 'package:diplomaticquarterapp/uitl/utils_new.dart';
import 'package:diplomaticquarterapp/widgets/buttons/defaultButton.dart'; import 'package:diplomaticquarterapp/widgets/buttons/defaultButton.dart';
import 'package:diplomaticquarterapp/widgets/text/app_texts_widget.dart'; import 'package:diplomaticquarterapp/widgets/text/app_texts_widget.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
@ -16,8 +18,7 @@ class ProfileSettings extends StatefulWidget {
_ProfileSettings createState() => _ProfileSettings(); _ProfileSettings createState() => _ProfileSettings();
} }
class _ProfileSettings extends State<ProfileSettings> class _ProfileSettings extends State<ProfileSettings> with TickerProviderStateMixin {
with TickerProviderStateMixin {
bool smsAlert = true; bool smsAlert = true;
bool emailAlert = true; bool emailAlert = true;
int language = 1; int language = 1;
@ -25,6 +26,7 @@ class _ProfileSettings extends State<ProfileSettings>
TextEditingController emergencyContact = new TextEditingController(); TextEditingController emergencyContact = new TextEditingController();
TextEditingController emailController = new TextEditingController(); TextEditingController emailController = new TextEditingController();
TextEditingController emergencyContactName = new TextEditingController(); TextEditingController emergencyContactName = new TextEditingController();
@override @override
void initState() { void initState() {
Future.delayed(new Duration(seconds: 0), () { Future.delayed(new Duration(seconds: 0), () {
@ -37,199 +39,300 @@ class _ProfileSettings extends State<ProfileSettings>
Widget build(BuildContext context) { Widget build(BuildContext context) {
return BaseView<DashboardViewModel>( return BaseView<DashboardViewModel>(
onModelReady: (model) => {}, onModelReady: (model) => {},
builder: (_, model, wi) => Container( builder: (_, model, wi) => Container(
child: model.user != null child: model.user != null
? ListView(scrollDirection: Axis.vertical, children: <Widget>[ ? Column(
Container( children: [
color: Theme.of(context).textTheme.headline2.color, Expanded(
padding: EdgeInsets.all(15), child: SingleChildScrollView(
child: Row( child: Padding(
mainAxisAlignment: MainAxisAlignment.spaceBetween, padding: const EdgeInsets.all(12.0),
children: [ child: Column(
AppText( crossAxisAlignment: CrossAxisAlignment.start,
TranslationBase.of(context).fileNo, children: <Widget>[
color: Colors.black, Card(
), shape: cardRadius(8),
AppText( margin: EdgeInsets.zero,
model.user.patientID.toString(), elevation: 3,
color: Colors.black, child: Padding(
), padding: const EdgeInsets.all(12.0),
], child: Row(
mainAxisAlignment: MainAxisAlignment.start,
children: [
Text(
TranslationBase.of(context).fileNo + ": ",
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.w600,
letterSpacing: -0.64,
),
),
Text(
model.user.patientID.toString(),
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.w600,
letterSpacing: -0.64,
),
),
],
),
),
),
mHeight(12),
Text(
TranslationBase.of(context).languageSetting,
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.w600,
letterSpacing: -0.64,
),
),
Text(
TranslationBase.of(context).selectLanguage,
style: TextStyle(
fontSize: 12,
fontWeight: FontWeight.w600,
letterSpacing: -0.48,
),
),
Row(
children: [
Expanded(
child: Row(
children: [
new Radio(
value: 2,
groupValue: language,
onChanged: (value) {
setState(() {
language = value;
});
},
),
Text(
TranslationBase.of(context).english,
style: TextStyle(
fontSize: 12,
letterSpacing: -0.48,
),
),
],
),
),
Expanded(
child: Row(
children: [
Radio(
value: 1,
groupValue: language,
onChanged: (value) {
setState(() {
language = value;
});
},
),
Text(
TranslationBase.of(context).arabic,
style: TextStyle(
fontSize: 12,
letterSpacing: -0.48,
),
),
],
),
),
],
),
mHeight(12),
Text(
TranslationBase.of(context).alert,
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.w600,
letterSpacing: -0.64,
),
),
Text(
TranslationBase.of(context).recAlert,
style: TextStyle(
fontSize: 12,
fontWeight: FontWeight.w600,
letterSpacing: -0.48,
),
),
Row(
children: [
Checkbox(
value: emailAlert,
onChanged: (value) {
setState(() {
emailAlert = value;
});
},
activeColor: CustomColors.accentColor,
),
Text(
TranslationBase.of(context).emailAlert,
style: TextStyle(
fontSize: 12,
letterSpacing: -0.48,
),
),
],
),
Row(
children: [
Checkbox(
value: smsAlert,
onChanged: (value) {
setState(() {
smsAlert = value;
});
},
activeColor: CustomColors.accentColor,
),
Text(
TranslationBase.of(context).smsAlert,
style: TextStyle(
fontSize: 12,
letterSpacing: -0.48,
),
),
],
),
mHeight(16),
Text(
TranslationBase.of(context).contactInfo,
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.w600,
letterSpacing: -0.64,
),
),
mHeight(12),
inputWidget(TranslationBase.of(context).email, "", emailController),
mHeight(8),
inputWidget(TranslationBase.of(context).emergencyName, "", emergencyContactName),
mHeight(8),
inputWidget(TranslationBase.of(context).emergencyContact, "", emergencyContact),
mHeight(8),
],
),
), ),
), ),
SizedBox( ),
height: 1, Container(
width: MediaQuery.of(context).size.width, width: double.infinity,
child: Container( child: Card(
color: Colors.grey[300], margin: EdgeInsets.zero,
elevation: 20,
child: Padding(
padding: const EdgeInsets.only(left: 16, right: 16, bottom: 16, top: 16),
child: DefaultButton(
TranslationBase.of(context).save,
() {
saveSettings();
},
),
), ),
), ),
Padding( ),
child: AppText( ],
TranslationBase.of(context).languageSetting, )
fontWeight: FontWeight.bold), : Center(
padding: EdgeInsets.all(10), child: AppText(TranslationBase.of(context).loginToUseService),
),
),
);
}
Widget inputWidget(String _labelText, String _hintText, TextEditingController _controller, {String prefix, bool isEnable = true, bool hasSelection = false}) {
return Container(
padding: EdgeInsets.only(left: 16, right: 16, bottom: 15, top: 15),
alignment: Alignment.center,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(15),
color: Colors.white,
border: Border.all(
color: Color(0xffefefef),
width: 1,
),
),
child: InkWell(
onTap: hasSelection ? () {} : null,
child: Row(
children: [
Expanded(
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
_labelText,
style: TextStyle(
fontSize: 11,
fontWeight: FontWeight.w600,
color: Color(0xff2B353E),
letterSpacing: -0.44,
), ),
Container( ),
color: Theme.of(context).textTheme.headline2.color, TextField(
padding: EdgeInsets.only( enabled: isEnable,
top: 0, left: 10, right: 10, bottom: 0), scrollPadding: EdgeInsets.zero,
child: Row( keyboardType: TextInputType.number,
mainAxisAlignment: MainAxisAlignment.spaceBetween, controller: _controller,
children: [ // onChanged: (value) => {validateForm()},
AppText(TranslationBase.of(context).english), style: TextStyle(
new Radio( fontSize: 14,
value: 2, height: 21 / 14,
groupValue: language, fontWeight: FontWeight.w400,
onChanged: (value) { color: Color(0xff2B353E),
setState(() { letterSpacing: -0.44,
language = value;
});
},
)
],
)),
Container(
color: Theme.of(context).textTheme.headline2.color,
padding: EdgeInsets.only(
top: 0, left: 10, right: 10, bottom: 0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
AppText(TranslationBase.of(context).arabic),
new Radio(
value: 1,
groupValue: language,
onChanged: (value) {
setState(() {
language = value;
});
},
)
],
)),
Padding(
child: AppText(TranslationBase.of(context).alert),
padding: EdgeInsets.all(10),
), ),
Container( decoration: InputDecoration(
color: Theme.of(context).textTheme.headline2.color, isDense: true,
padding: EdgeInsets.only( hintText: _hintText,
top: 0, left: 10, right: 10, bottom: 0), hintStyle: TextStyle(
child: Row( fontSize: 14,
mainAxisAlignment: MainAxisAlignment.spaceBetween, height: 21 / 14,
children: [ fontWeight: FontWeight.w400,
AppText(TranslationBase.of(context).emailAlert), color: Color(0xff575757),
Switch( letterSpacing: -0.56,
value: emailAlert, ),
onChanged: (value) { prefixIconConstraints: BoxConstraints(minWidth: 50),
setState(() { prefixIcon: prefix == null
emailAlert = value; ? null
}); : Text(
}, "+" + prefix,
activeTrackColor: Colors.lightGreenAccent, style: TextStyle(
activeColor: Colors.green, fontSize: 14,
) height: 21 / 14,
], fontWeight: FontWeight.w500,
)), color: Color(0xff2E303A),
Container( letterSpacing: -0.56,
color: Theme.of(context).textTheme.headline2.color,
padding: EdgeInsets.only(
top: 0, left: 10, right: 10, bottom: 0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
AppText(TranslationBase.of(context).smsAlert),
Switch(
value: smsAlert,
onChanged: (value) {
setState(() {
smsAlert = value;
});
},
activeTrackColor: Colors.lightGreenAccent,
activeColor: Colors.green,
)
],
)),
Padding(
child: AppText(TranslationBase.of(context).contactInfo),
padding: EdgeInsets.all(10),
),
Container(
color: Theme.of(context).textTheme.headline2.color,
padding: EdgeInsets.only(
top: 0, left: 10, right: 10, bottom: 0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
AppText(TranslationBase.of(context).email),
TextField(
controller: emailController,
decoration: InputDecoration(
suffixIcon: Icon(Icons.edit),
))
],
)),
Container(
color: Theme.of(context).textTheme.headline2.color,
padding: EdgeInsets.only(
top: 0, left: 10, right: 10, bottom: 0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
AppText(TranslationBase.of(context).emergencyName),
TextField(
controller: emergencyContactName,
decoration: InputDecoration(
suffixIcon: Icon(Icons.edit),
))
],
)),
Container(
color: Theme.of(context).textTheme.headline2.color,
padding: EdgeInsets.only(
top: 0, left: 10, right: 10, bottom: 0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
AppText(
TranslationBase.of(context).emergencyContact),
TextField(
controller: emergencyContact,
decoration: InputDecoration(
suffixIcon: Icon(Icons.edit),
), ),
) ),
], contentPadding: EdgeInsets.zero,
)), border: InputBorder.none,
Container( focusedBorder: InputBorder.none,
padding: EdgeInsets.all(10), enabledBorder: InputBorder.none,
child: Row( ),
children: <Widget>[ ),
Expanded( ],
child: DefaultButton( ),
TranslationBase.of(context).save, ),
() { if (hasSelection) Icon(Icons.keyboard_arrow_down_outlined),
saveSettings(); ],
}, ),
)), ),
], );
))
])
: Center(
child:
AppText(TranslationBase.of(context).loginToUseService),
)));
} }
getSettings(context) { getSettings(context) {
GifLoaderDialogUtils.showMyDialog(context); GifLoaderDialogUtils.showMyDialog(context);
authService.getSettings().then((result) => { authService.getSettings().then((result) => {GifLoaderDialogUtils.hideDialog(context), setValue(result["PateintInfoForUpdateList"][0])});
GifLoaderDialogUtils.hideDialog(context),
setValue(result["PateintInfoForUpdateList"][0])
});
} }
setValue(value) { setValue(value) {
@ -252,10 +355,6 @@ class _ProfileSettings extends State<ProfileSettings>
request["IsEmailAlertRequired"] = this.emailAlert; request["IsEmailAlertRequired"] = this.emailAlert;
request["IsSMSAlertRequired"] = this.smsAlert; request["IsSMSAlertRequired"] = this.smsAlert;
request["PreferredLanguage"] = this.language.toString(); request["PreferredLanguage"] = this.language.toString();
authService.saveSettings(request).then((result) => { authService.saveSettings(request).then((result) => {AppToast.showSuccessToast(message: TranslationBase.of(context).profileUpdate), GifLoaderDialogUtils.hideDialog(context)});
AppToast.showSuccessToast(
message: TranslationBase.of(context).profileUpdate),
GifLoaderDialogUtils.hideDialog(context)
});
} }
} }

@ -1,7 +1,9 @@
import 'package:diplomaticquarterapp/config/config.dart'; import 'package:diplomaticquarterapp/config/config.dart';
import 'package:diplomaticquarterapp/pages/settings/general_setting.dart'; import 'package:diplomaticquarterapp/pages/settings/general_setting.dart';
import 'package:diplomaticquarterapp/pages/settings/profile_setting.dart'; import 'package:diplomaticquarterapp/pages/settings/profile_setting.dart';
import 'package:diplomaticquarterapp/theme/colors.dart';
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
import 'package:diplomaticquarterapp/widgets/others/arrow_back.dart'; import 'package:diplomaticquarterapp/widgets/others/arrow_back.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -9,6 +11,7 @@ class Settings extends StatefulWidget {
final int type; final int type;
Settings({this.type = 0}); Settings({this.type = 0});
@override @override
_Settings createState() => _Settings(); _Settings createState() => _Settings();
} }
@ -18,8 +21,7 @@ class _Settings extends State<Settings> with TickerProviderStateMixin {
@override @override
void initState() { void initState() {
_tabController = _tabController = new TabController(length: 2, vsync: this, initialIndex: widget.type);
new TabController(length: 2, vsync: this, initialIndex: widget.type);
if (widget.type == 1) { if (widget.type == 1) {
_tabController.animateTo(1); _tabController.animateTo(1);
@ -31,45 +33,45 @@ class _Settings extends State<Settings> with TickerProviderStateMixin {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
AppGlobal.context = context; AppGlobal.context = context;
return Scaffold( return AppScaffold(
appBar: AppBar( isShowAppBar: false,
actions: [ isShowDecPage: false,
IconButton( showNewAppBarTitle: true,
icon: Icon(Icons.info, color: Colors.white), showNewAppBar: true,
onPressed: () { appBarTitle: TranslationBase.of(context).settings,
//openInfoPage() backgroundColor: Color(0xFFF7F7F7),
}, body: Column(
) children: [
], TabBar(
bottom: TabBar( // isScrollable: true,
// isScrollable: true,
indicatorWeight: 5.0, indicatorWeight: 3.0,
//indicatorSize: TabBarIndicatorSize.label, //indicatorSize: TabBarIndicatorSize.label,
// indicatorSize: TabBarIndicatorSize.tab, // indicatorSize: TabBarIndicatorSize.tab,
indicatorColor: Theme.of(context).primaryColor, indicatorColor: CustomColors.accentColor,
// labelColor: Theme.of(context).primaryColor, labelColor: Colors.black,
tabs: [ unselectedLabelColor: CustomColors.grey,
Tab(text: TranslationBase.of(context).general), // labelColor: Theme.of(context).primaryColor,
Tab( tabs: [
text: TranslationBase.of(context).profile, Tab(text: TranslationBase.of(context).general),
) Tab(
], text: TranslationBase.of(context).profile,
controller: _tabController, )
), ],
title: Text(TranslationBase.of(context).settings, controller: _tabController,
style: TextStyle(color: Colors.white)), ),
leading: Builder( Expanded(
builder: (BuildContext context) { child: TabBarView(
return ArrowBack(); physics: NeverScrollableScrollPhysics(),
}, children: [
), GeneralSettings(),
ProfileSettings(),
],
controller: _tabController),
),
],
), ),
body: TabBarView(
physics: NeverScrollableScrollPhysics(),
children: [GeneralSettings(), ProfileSettings()],
controller: _tabController),
); );
} }
} }

@ -2361,6 +2361,9 @@ class TranslationBase {
String get selectSlot => localizedValues["selectSlot"][locale.languageCode]; String get selectSlot => localizedValues["selectSlot"][locale.languageCode];
String get selectLanguage => localizedValues["selectLanguage"][locale.languageCode];
String get recAlert => localizedValues["recAlert"][locale.languageCode];
} }
class TranslationBaseDelegate extends LocalizationsDelegate<TranslationBase> { class TranslationBaseDelegate extends LocalizationsDelegate<TranslationBase> {

@ -1,69 +1,52 @@
import 'package:flutter/material.dart'; // import 'package:flutter/material.dart';
import 'package:syncfusion_flutter_charts/charts.dart'; // import 'package:syncfusion_flutter_charts/charts.dart';
import 'package:syncfusion_flutter_charts/sparkcharts.dart'; // import 'package:syncfusion_flutter_charts/sparkcharts.dart';
//
class SyncFuChart extends StatelessWidget { // class SyncFuChart extends StatelessWidget {
// List<_SalesData> data = [
List<_SalesData> data = [ // _SalesData('Jan', 35),
_SalesData('Jan', 35), // _SalesData('Feb', 28),
_SalesData('Feb', 28), // _SalesData('Mar', 34),
_SalesData('Mar', 34), // _SalesData('Apr', 32),
_SalesData('Apr', 32), // _SalesData('May', 40),
_SalesData('May', 40), // ];
]; //
// @override
@override // Widget build(BuildContext context) {
Widget build(BuildContext context) { // return Scaffold(
return Scaffold( // body: Column(
appBar: AppBar( // children: [
title: const Text('Syncfusion Flutter chart'), // //Initialize the chart widget
), // SfCartesianChart(
body: Column( //
children: [ // primaryXAxis: CategoryAxis(),
//Initialize the chart widget // primaryYAxis: CategoryAxis(minimum: 28),
SfCartesianChart( // // Chart title
primaryXAxis: CategoryAxis(), // title: ChartTitle(text: 'Half yearly sales analysis'),
// Chart title // // Enable legend
title: ChartTitle(text: 'Half yearly sales analysis'), // legend: Legend(isVisible: true),
// Enable legend // // Enable tooltip
legend: Legend(isVisible: true), // tooltipBehavior: TooltipBehavior(enable: true),
// Enable tooltip // series: <ChartSeries<_SalesData, String>>[
tooltipBehavior: TooltipBehavior(enable: true), // LineSeries<_SalesData, String>(
series: <ChartSeries<_SalesData, String>>[ // dataSource: data,
LineSeries<_SalesData, String>( // xValueMapper: (_SalesData sales, _) => sales.year,
dataSource: data, // yValueMapper: (_SalesData sales, _) => sales.sales,
xValueMapper: (_SalesData sales, _) => sales.year, // name: 'Sales',
yValueMapper: (_SalesData sales, _) => sales.sales, // // Enable data label
name: 'Sales', // dataLabelSettings: DataLabelSettings(isVisible: true),
// Enable data label // ),
dataLabelSettings: DataLabelSettings(isVisible: true)) // ],
]), // ),
Expanded( // ],
child: Padding( // ),
padding: const EdgeInsets.all(8.0), // );
//Initialize the spark charts widget // }
child: SfSparkLineChart.custom( // }
//Enable the trackball //
trackball: SparkChartTrackball(activationMode: SparkChartActivationMode.tap), // class _SalesData {
//Enable marker // _SalesData(this.year, this.sales);
marker: SparkChartMarker(displayMode: SparkChartMarkerDisplayMode.all), //
//Enable data label // final String year;
labelDisplayMode: SparkChartLabelDisplayMode.all, // final double sales;
xValueMapper: (int index) => data[index].year, // }
yValueMapper: (int index) => data[index].sales,
dataCount: 5,
),
),
)
],
),
);
}
}
class _SalesData {
_SalesData(this.year, this.sales);
final String year;
final double sales;
}

@ -104,7 +104,7 @@ dependencies:
# Calendar # Calendar
# table_calendar: ^2.3.0 # table_calendar: ^2.3.0
syncfusion_flutter_calendar: ^18.4.49 syncfusion_flutter_calendar: ^18.4.49
syncfusion_flutter_charts: any # syncfusion_flutter_charts: any
# SVG Images # SVG Images
flutter_svg: ^0.18.0 flutter_svg: ^0.18.0

Loading…
Cancel
Save