diff --git a/packages/syncfusion_flutter_barcodes/CHANGELOG.md b/packages/syncfusion_flutter_barcodes/CHANGELOG.md
index 97fa8292d..f05e00385 100644
--- a/packages/syncfusion_flutter_barcodes/CHANGELOG.md
+++ b/packages/syncfusion_flutter_barcodes/CHANGELOG.md
@@ -1,3 +1,8 @@
+## [20.3.50] - 10/18/2022
+
+**Bugs**
+* #FB38178 - Now, the QR code generated for the input string contains spaces with `medium` [errorCorrectionLevel](https://pub.dev/documentation/syncfusion_flutter_barcodes/latest/barcodes/QRCode/errorCorrectionLevel.html) and `07` [codeVersion](https://pub.dev/documentation/syncfusion_flutter_barcodes/latest/barcodes/QRCode/codeVersion.html) will be scannable.
+
## [18.3.35] - 10/01/2020
No changes.
@@ -99,4 +104,4 @@ Initial release.
* **One-dimensional barcodes** - Barcode Generator supports different one-dimensional barcode symbologies such as Code128, EAN8, EAN13, UPA-C, UPA-E, Code39, Code39 Extended, Code93 and Codabar.
* **Two-dimensional barcode** - Barcode Generator supports popular QR Code and Data Matrix.
* **Barcode customization** - Customize the visual appearance of barcodes using the backgroundColor and barColor properties, and adjust the size of smallest line or dot of the code using the module property.
-* **Text customization** -Configure to display the barcode value and customize the position and style of the barcode text.
\ No newline at end of file
+* **Text customization** -Configure to display the barcode value and customize the position and style of the barcode text.
diff --git a/packages/syncfusion_flutter_barcodes/README.md b/packages/syncfusion_flutter_barcodes/README.md
index 0a6ae4f48..2ed755483 100644
--- a/packages/syncfusion_flutter_barcodes/README.md
+++ b/packages/syncfusion_flutter_barcodes/README.md
@@ -36,9 +36,6 @@ Explore the full capabilities of our Flutter widgets on your device by installin
-
-
-
@@ -127,11 +124,11 @@ The following screenshot illustrates the result of the previous code sample.
### Support and feedback
-* For any other queries, reach our [Syncfusion support team](https://www.syncfusion.com/support/directtrac/incidents/newincident) or post the queries through the [Community forums](https://www.syncfusion.com/forums) and submit a feature request or a bug through our [Feedback portal](https://www.syncfusion.com/feedback/flutter).
+* For any other queries, reach our [Syncfusion support team](https://support.syncfusion.com/support/tickets/create) or post the queries through the [Community forums](https://www.syncfusion.com/forums) and submit a feature request or a bug through our [Feedback portal](https://www.syncfusion.com/feedback/flutter).
* To renew the subscription, click [renew](https://www.syncfusion.com/sales/products) or contact our sales team at sales@syncfusion.com | Toll Free: 1-888-9 DOTNET.
### About Syncfusion
Founded in 2001 and headquartered in Research Triangle Park, N.C., Syncfusion has more than 20,000 customers and more than 1 million users, including large financial institutions, Fortune 500 companies, and global IT consultancies.
-Today we provide 1,000+ controls and frameworks for web ([ASP.NET Core](https://www.syncfusion.com/aspnet-core-ui-controls), [ASP.NET MVC](https://www.syncfusion.com/aspnet-mvc-ui-controls), [ASP.NET WebForms](https://www.syncfusion.com/jquery/aspnet-web-forms-ui-controls), [JavaScript](https://www.syncfusion.com/javascript-ui-controls), [Angular](https://www.syncfusion.com/angular-ui-components), [React](https://www.syncfusion.com/react-ui-components), [Vue](https://www.syncfusion.com/vue-ui-components), and [Blazor](https://www.syncfusion.com/blazor-components)), mobile ([Xamarin](https://www.syncfusion.com/xamarin-ui-controls), [.NET MAUI](https://www.syncfusion.com/maui-controls), [Flutter](https://www.syncfusion.com/flutter-widgets), [UWP](https://www.syncfusion.com/uwp-ui-controls), and [JavaScript](https://www.syncfusion.com/javascript-ui-controls)), and desktop development ([WinForms](https://www.syncfusion.com/winforms-ui-controls), [WPF](https://www.syncfusion.com/wpf-ui-controls), [UWP](https://www.syncfusion.com/uwp-ui-controls), [.NET MAUI](https://www.syncfusion.com/maui-controls) and [WinUI](https://www.syncfusion.com/winui-controls)). We provide ready-to- deploy enterprise software for dashboards, reports, data integration, and big data processing. Many customers have saved millions in licensing fees by deploying our software.
\ No newline at end of file
+Today we provide 1,000+ controls and frameworks for web ([ASP.NET Core](https://www.syncfusion.com/aspnet-core-ui-controls), [ASP.NET MVC](https://www.syncfusion.com/aspnet-mvc-ui-controls), [ASP.NET WebForms](https://www.syncfusion.com/jquery/aspnet-web-forms-ui-controls), [JavaScript](https://www.syncfusion.com/javascript-ui-controls), [Angular](https://www.syncfusion.com/angular-ui-components), [React](https://www.syncfusion.com/react-ui-components), [Vue](https://www.syncfusion.com/vue-ui-components), [Flutter](https://www.syncfusion.com/flutter-widgets), and [Blazor](https://www.syncfusion.com/blazor-components)), mobile ([Xamarin](https://www.syncfusion.com/xamarin-ui-controls), [.NET MAUI](https://www.syncfusion.com/maui-controls), [Flutter](https://www.syncfusion.com/flutter-widgets), [UWP](https://www.syncfusion.com/uwp-ui-controls), and [JavaScript](https://www.syncfusion.com/javascript-ui-controls)), and desktop development ([Flutter](https://www.syncfusion.com/flutter-widgets), [WinForms](https://www.syncfusion.com/winforms-ui-controls), [WPF](https://www.syncfusion.com/wpf-ui-controls), [UWP](https://www.syncfusion.com/uwp-ui-controls), [.NET MAUI](https://www.syncfusion.com/maui-controls), and [WinUI](https://www.syncfusion.com/winui-controls)). We provide ready-to- deploy enterprise software for dashboards, reports, data integration, and big data processing. Many customers have saved millions in licensing fees by deploying our software.
\ No newline at end of file
diff --git a/packages/syncfusion_flutter_barcodes/example/linux/flutter/generated_plugin_registrant.cc b/packages/syncfusion_flutter_barcodes/example/linux/flutter/generated_plugin_registrant.cc
index d38195aa0..e71a16d23 100644
--- a/packages/syncfusion_flutter_barcodes/example/linux/flutter/generated_plugin_registrant.cc
+++ b/packages/syncfusion_flutter_barcodes/example/linux/flutter/generated_plugin_registrant.cc
@@ -2,6 +2,8 @@
// Generated file. Do not edit.
//
+// clang-format off
+
#include "generated_plugin_registrant.h"
diff --git a/packages/syncfusion_flutter_barcodes/example/linux/flutter/generated_plugin_registrant.h b/packages/syncfusion_flutter_barcodes/example/linux/flutter/generated_plugin_registrant.h
index 9bf747894..e0f0a47bc 100644
--- a/packages/syncfusion_flutter_barcodes/example/linux/flutter/generated_plugin_registrant.h
+++ b/packages/syncfusion_flutter_barcodes/example/linux/flutter/generated_plugin_registrant.h
@@ -2,6 +2,8 @@
// Generated file. Do not edit.
//
+// clang-format off
+
#ifndef GENERATED_PLUGIN_REGISTRANT_
#define GENERATED_PLUGIN_REGISTRANT_
diff --git a/packages/syncfusion_flutter_barcodes/example/linux/flutter/generated_plugins.cmake b/packages/syncfusion_flutter_barcodes/example/linux/flutter/generated_plugins.cmake
index 51436ae8c..2e1de87a7 100644
--- a/packages/syncfusion_flutter_barcodes/example/linux/flutter/generated_plugins.cmake
+++ b/packages/syncfusion_flutter_barcodes/example/linux/flutter/generated_plugins.cmake
@@ -5,6 +5,9 @@
list(APPEND FLUTTER_PLUGIN_LIST
)
+list(APPEND FLUTTER_FFI_PLUGIN_LIST
+)
+
set(PLUGIN_BUNDLED_LIBRARIES)
foreach(plugin ${FLUTTER_PLUGIN_LIST})
@@ -13,3 +16,8 @@ foreach(plugin ${FLUTTER_PLUGIN_LIST})
list(APPEND PLUGIN_BUNDLED_LIBRARIES $)
list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries})
endforeach(plugin)
+
+foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST})
+ add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/linux plugins/${ffi_plugin})
+ list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries})
+endforeach(ffi_plugin)
diff --git a/packages/syncfusion_flutter_barcodes/example/pubspec.yaml b/packages/syncfusion_flutter_barcodes/example/pubspec.yaml
index f9456b13a..8ee2a082f 100644
--- a/packages/syncfusion_flutter_barcodes/example/pubspec.yaml
+++ b/packages/syncfusion_flutter_barcodes/example/pubspec.yaml
@@ -14,7 +14,7 @@ description: A new Flutter project.
version: 1.0.0
environment:
- sdk: ">=2.12.0 <3.0.0"
+ sdk: ">=2.17.0 <3.0.0"
dependencies:
flutter:
diff --git a/packages/syncfusion_flutter_barcodes/example/windows/flutter/generated_plugins.cmake b/packages/syncfusion_flutter_barcodes/example/windows/flutter/generated_plugins.cmake
index 4d10c2518..b93c4c30c 100644
--- a/packages/syncfusion_flutter_barcodes/example/windows/flutter/generated_plugins.cmake
+++ b/packages/syncfusion_flutter_barcodes/example/windows/flutter/generated_plugins.cmake
@@ -5,6 +5,9 @@
list(APPEND FLUTTER_PLUGIN_LIST
)
+list(APPEND FLUTTER_FFI_PLUGIN_LIST
+)
+
set(PLUGIN_BUNDLED_LIBRARIES)
foreach(plugin ${FLUTTER_PLUGIN_LIST})
@@ -13,3 +16,8 @@ foreach(plugin ${FLUTTER_PLUGIN_LIST})
list(APPEND PLUGIN_BUNDLED_LIBRARIES $)
list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries})
endforeach(plugin)
+
+foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST})
+ add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/windows plugins/${ffi_plugin})
+ list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries})
+endforeach(ffi_plugin)
diff --git a/packages/syncfusion_flutter_barcodes/lib/src/barcode_generator/renderers/two_dimensional/error_correction_codewords.dart b/packages/syncfusion_flutter_barcodes/lib/src/barcode_generator/renderers/two_dimensional/error_correction_codewords.dart
index a2d8ee406..3e61dc94c 100644
--- a/packages/syncfusion_flutter_barcodes/lib/src/barcode_generator/renderers/two_dimensional/error_correction_codewords.dart
+++ b/packages/syncfusion_flutter_barcodes/lib/src/barcode_generator/renderers/two_dimensional/error_correction_codewords.dart
@@ -1616,7 +1616,7 @@ class ErrorCorrectionCodeWords {
/// Converts decimal to binary value
List _convertDecimalToBinary(List decimalRepresentation) {
final List toBinary = [];
- for (int i = 0; i < eccw; i++) {
+ for (int i = 0; i < decimalRepresentation.length; i++) {
final String temp = decimalRepresentation[i].toRadixString(2);
String text = '';
@@ -1679,7 +1679,8 @@ class ErrorCorrectionCodeWords {
}
}
- eccw = leadTermSource.length;
+ // QR code is not scannable when the input string contains spaces.
+ // eccw = leadTermSource.length;
final List returnValue = [];
for (int i = 0; i < leadTermSource.length; i++) {
returnValue.add(leadTermSource.entries.elementAt(i).value);
diff --git a/packages/syncfusion_flutter_barcodes/pubspec.yaml b/packages/syncfusion_flutter_barcodes/pubspec.yaml
index 5da01d92d..6ecc1eda6 100644
--- a/packages/syncfusion_flutter_barcodes/pubspec.yaml
+++ b/packages/syncfusion_flutter_barcodes/pubspec.yaml
@@ -1,15 +1,15 @@
name: syncfusion_flutter_barcodes
description: Flutter Barcodes generator library is used to generate and display data in the machine-readable, industry-standard 1D and 2D barcodes.
-version: 20.2.36
+version: 20.4.38
homepage: https://github.com/syncfusion/flutter-widgets/tree/master/packages/syncfusion_flutter_barcodes
environment:
- sdk: ">=2.12.0 <3.0.0"
+ sdk: ">=2.17.0 <3.0.0"
dependencies:
flutter:
sdk: flutter
- syncfusion_flutter_core: ^20.2.36
+ syncfusion_flutter_core: ^20.4.38
dev_dependencies:
flutter_test:
diff --git a/packages/syncfusion_flutter_calendar/CHANGELOG.md b/packages/syncfusion_flutter_calendar/CHANGELOG.md
index 00479a04d..66f408a75 100644
--- a/packages/syncfusion_flutter_calendar/CHANGELOG.md
+++ b/packages/syncfusion_flutter_calendar/CHANGELOG.md
@@ -1,3 +1,11 @@
+## [20.3.56]
+**Features**
+* Provided text style customization support for the text in the placeholder (`No events` and `No selected date`) in the month agenda view and (`No events`) in the schedule view of the flutter event calendar.
+
+## [20.2.43]
+**Enhancements**
+* Now, we have improved the behavior of the `appointmentBuilder` details `date` value to hold the start date of the appointment view in the Flutter event calendar.
+
## [20.2.36]
**Features**
* Now, we have improved the behavior of the month header of ScheduleView with a minimum date in the Flutter event calendar.
diff --git a/packages/syncfusion_flutter_calendar/README.md b/packages/syncfusion_flutter_calendar/README.md
index f38a450c8..a4bf4656c 100644
--- a/packages/syncfusion_flutter_calendar/README.md
+++ b/packages/syncfusion_flutter_calendar/README.md
@@ -91,7 +91,7 @@ The Flutter Calendar widget has built-in configurable views such as day, week, w
* **Week numbers** - Display the week numbers of the year in the month, week, and work week views of the Calendar.
-
+
* **Quick view navigation** - Navigate among calendar views easily using the header date picker views button in the calendar header and clicking month cell and view headers.
@@ -133,15 +133,12 @@ Explore the full capabilities of our Flutter widgets on your device by installin
-
-
+
+
-
-
-
@@ -316,11 +313,11 @@ class Meeting {
## Support and Feedback
-* For any other queries, reach our [Syncfusion support team](https://www.syncfusion.com/support/directtrac/incidents/newincident) or post the queries through the [Community forums](https://www.syncfusion.com/forums) and submit a feature request or a bug through our [Feedback portal](https://www.syncfusion.com/feedback/flutter).
+* For any other queries, reach our [Syncfusion support team](https://support.syncfusion.com/support/tickets/create) or post the queries through the [Community forums](https://www.syncfusion.com/forums) and submit a feature request or a bug through our [Feedback portal](https://www.syncfusion.com/feedback/flutter).
* To renew the subscription, click [renew](https://www.syncfusion.com/sales/products) or contact our sales team at salessupport@syncfusion.com | Toll Free: 1-888-9 DOTNET.
## About Syncfusion
Founded in 2001 and headquartered in Research Triangle Park, N.C., Syncfusion has more than 20,000 customers and more than 1 million users, including large financial institutions, Fortune 500 companies, and global IT consultancies.
-Today we provide 1,000+ controls and frameworks for web ([ASP.NET Core](https://www.syncfusion.com/aspnet-core-ui-controls), [ASP.NET MVC](https://www.syncfusion.com/aspnet-mvc-ui-controls), [ASP.NET WebForms](https://www.syncfusion.com/jquery/aspnet-web-forms-ui-controls), [JavaScript](https://www.syncfusion.com/javascript-ui-controls), [Angular](https://www.syncfusion.com/angular-ui-components), [React](https://www.syncfusion.com/react-ui-components), [Vue](https://www.syncfusion.com/vue-ui-components), and [Blazor](https://www.syncfusion.com/blazor-components), mobile ([Xamarin](https://www.syncfusion.com/xamarin-ui-controls), [.NET MAUI](https://www.syncfusion.com/maui-controls), [Flutter](https://www.syncfusion.com/flutter-widgets), [UWP](https://www.syncfusion.com/uwp-ui-controls), and [JavaScript](https://www.syncfusion.com/javascript-ui-controls)), and desktop development ([WinForms](https://www.syncfusion.com/winforms-ui-controls), [WPF](https://www.syncfusion.com/wpf-ui-controls), [UWP](https://www.syncfusion.com/uwp-ui-controls), [.NET MAUI](https://www.syncfusion.com/maui-controls) and [WinUI](https://www.syncfusion.com/winui-controls)). We provide ready-to deploy enterprise software for dashboards, reports, data integration, and big data processing. Many customers have saved millions in licensing fees by deploying our software.
+Today we provide 1,000+ controls and frameworks for web ([ASP.NET Core](https://www.syncfusion.com/aspnet-core-ui-controls), [ASP.NET MVC](https://www.syncfusion.com/aspnet-mvc-ui-controls), [ASP.NET WebForms](https://www.syncfusion.com/jquery/aspnet-web-forms-ui-controls), [JavaScript](https://www.syncfusion.com/javascript-ui-controls), [Angular](https://www.syncfusion.com/angular-ui-components), [React](https://www.syncfusion.com/react-ui-components), [Vue](https://www.syncfusion.com/vue-ui-components), [Flutter](https://www.syncfusion.com/flutter-widgets), and [Blazor](https://www.syncfusion.com/blazor-components)), mobile ([Xamarin](https://www.syncfusion.com/xamarin-ui-controls), [.NET MAUI](https://www.syncfusion.com/maui-controls), [Flutter](https://www.syncfusion.com/flutter-widgets), [UWP](https://www.syncfusion.com/uwp-ui-controls), and [JavaScript](https://www.syncfusion.com/javascript-ui-controls)), and desktop development ([Flutter](https://www.syncfusion.com/flutter-widgets), [WinForms](https://www.syncfusion.com/winforms-ui-controls), [WPF](https://www.syncfusion.com/wpf-ui-controls), [UWP](https://www.syncfusion.com/uwp-ui-controls), [.NET MAUI](https://www.syncfusion.com/maui-controls), and [WinUI](https://www.syncfusion.com/winui-controls)). We provide ready-to deploy enterprise software for dashboards, reports, data integration, and big data processing. Many customers have saved millions in licensing fees by deploying our software.
\ No newline at end of file
diff --git a/packages/syncfusion_flutter_calendar/example/linux/flutter/generated_plugin_registrant.cc b/packages/syncfusion_flutter_calendar/example/linux/flutter/generated_plugin_registrant.cc
index d38195aa0..e71a16d23 100644
--- a/packages/syncfusion_flutter_calendar/example/linux/flutter/generated_plugin_registrant.cc
+++ b/packages/syncfusion_flutter_calendar/example/linux/flutter/generated_plugin_registrant.cc
@@ -2,6 +2,8 @@
// Generated file. Do not edit.
//
+// clang-format off
+
#include "generated_plugin_registrant.h"
diff --git a/packages/syncfusion_flutter_calendar/example/linux/flutter/generated_plugin_registrant.h b/packages/syncfusion_flutter_calendar/example/linux/flutter/generated_plugin_registrant.h
index 9bf747894..e0f0a47bc 100644
--- a/packages/syncfusion_flutter_calendar/example/linux/flutter/generated_plugin_registrant.h
+++ b/packages/syncfusion_flutter_calendar/example/linux/flutter/generated_plugin_registrant.h
@@ -2,6 +2,8 @@
// Generated file. Do not edit.
//
+// clang-format off
+
#ifndef GENERATED_PLUGIN_REGISTRANT_
#define GENERATED_PLUGIN_REGISTRANT_
diff --git a/packages/syncfusion_flutter_calendar/example/linux/flutter/generated_plugins.cmake b/packages/syncfusion_flutter_calendar/example/linux/flutter/generated_plugins.cmake
index 51436ae8c..2e1de87a7 100644
--- a/packages/syncfusion_flutter_calendar/example/linux/flutter/generated_plugins.cmake
+++ b/packages/syncfusion_flutter_calendar/example/linux/flutter/generated_plugins.cmake
@@ -5,6 +5,9 @@
list(APPEND FLUTTER_PLUGIN_LIST
)
+list(APPEND FLUTTER_FFI_PLUGIN_LIST
+)
+
set(PLUGIN_BUNDLED_LIBRARIES)
foreach(plugin ${FLUTTER_PLUGIN_LIST})
@@ -13,3 +16,8 @@ foreach(plugin ${FLUTTER_PLUGIN_LIST})
list(APPEND PLUGIN_BUNDLED_LIBRARIES $)
list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries})
endforeach(plugin)
+
+foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST})
+ add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/linux plugins/${ffi_plugin})
+ list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries})
+endforeach(ffi_plugin)
diff --git a/packages/syncfusion_flutter_calendar/example/pubspec.yaml b/packages/syncfusion_flutter_calendar/example/pubspec.yaml
index 2ce47036f..110702420 100644
--- a/packages/syncfusion_flutter_calendar/example/pubspec.yaml
+++ b/packages/syncfusion_flutter_calendar/example/pubspec.yaml
@@ -3,7 +3,7 @@ description: Syncfusion calendar example.
version: 1.0.0+1
environment:
- sdk: ">=2.12.0 <3.0.0"
+ sdk: ">=2.17.0 <3.0.0"
dependencies:
flutter:
@@ -11,7 +11,7 @@ dependencies:
cupertino_icons: ^1.0.2
syncfusion_flutter_calendar:
- path: ../../syncfusion_flutter_calendar
+ path: ../
dev_dependencies:
flutter_test:
@@ -19,4 +19,4 @@ dev_dependencies:
flutter:
- uses-material-design: true
\ No newline at end of file
+ uses-material-design: true
diff --git a/packages/syncfusion_flutter_calendar/example/windows/flutter/generated_plugin_registrant.cc b/packages/syncfusion_flutter_calendar/example/windows/flutter/generated_plugin_registrant.cc
index 4bfa0f3a3..8b6d4680a 100644
--- a/packages/syncfusion_flutter_calendar/example/windows/flutter/generated_plugin_registrant.cc
+++ b/packages/syncfusion_flutter_calendar/example/windows/flutter/generated_plugin_registrant.cc
@@ -2,6 +2,8 @@
// Generated file. Do not edit.
//
+// clang-format off
+
#include "generated_plugin_registrant.h"
diff --git a/packages/syncfusion_flutter_calendar/example/windows/flutter/generated_plugin_registrant.h b/packages/syncfusion_flutter_calendar/example/windows/flutter/generated_plugin_registrant.h
index 9846246b4..dc139d85a 100644
--- a/packages/syncfusion_flutter_calendar/example/windows/flutter/generated_plugin_registrant.h
+++ b/packages/syncfusion_flutter_calendar/example/windows/flutter/generated_plugin_registrant.h
@@ -2,6 +2,8 @@
// Generated file. Do not edit.
//
+// clang-format off
+
#ifndef GENERATED_PLUGIN_REGISTRANT_
#define GENERATED_PLUGIN_REGISTRANT_
diff --git a/packages/syncfusion_flutter_calendar/example/windows/flutter/generated_plugins.cmake b/packages/syncfusion_flutter_calendar/example/windows/flutter/generated_plugins.cmake
index 4d10c2518..b93c4c30c 100644
--- a/packages/syncfusion_flutter_calendar/example/windows/flutter/generated_plugins.cmake
+++ b/packages/syncfusion_flutter_calendar/example/windows/flutter/generated_plugins.cmake
@@ -5,6 +5,9 @@
list(APPEND FLUTTER_PLUGIN_LIST
)
+list(APPEND FLUTTER_FFI_PLUGIN_LIST
+)
+
set(PLUGIN_BUNDLED_LIBRARIES)
foreach(plugin ${FLUTTER_PLUGIN_LIST})
@@ -13,3 +16,8 @@ foreach(plugin ${FLUTTER_PLUGIN_LIST})
list(APPEND PLUGIN_BUNDLED_LIBRARIES $)
list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries})
endforeach(plugin)
+
+foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST})
+ add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/windows plugins/${ffi_plugin})
+ list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries})
+endforeach(ffi_plugin)
diff --git a/packages/syncfusion_flutter_calendar/lib/src/calendar/appointment_engine/appointment.dart b/packages/syncfusion_flutter_calendar/lib/src/calendar/appointment_engine/appointment.dart
index 8de70c329..11c013eb6 100644
--- a/packages/syncfusion_flutter_calendar/lib/src/calendar/appointment_engine/appointment.dart
+++ b/packages/syncfusion_flutter_calendar/lib/src/calendar/appointment_engine/appointment.dart
@@ -980,14 +980,17 @@ class Appointment with Diagnosticable {
@override
// ignore: avoid_equals_and_hash_code_on_mutable_classes
int get hashCode {
- return hashValues(
+ return Object.hash(
startTimeZone,
endTimeZone,
recurrenceRule,
isAllDay,
notes,
location,
- hashList(resourceIds),
+
+ /// Below condition is referred from text style class
+ /// https://api.flutter.dev/flutter/painting/TextStyle/hashCode.html
+ resourceIds == null ? null : Object.hashAll(resourceIds!),
recurrenceId,
id,
appointmentType,
@@ -995,7 +998,9 @@ class Appointment with Diagnosticable {
endTime,
subject,
color,
- hashList(recurrenceExceptionDates),
+ recurrenceExceptionDates == null
+ ? null
+ : Object.hashAll(recurrenceExceptionDates!),
);
}
diff --git a/packages/syncfusion_flutter_calendar/lib/src/calendar/appointment_engine/recurrence_helper.dart b/packages/syncfusion_flutter_calendar/lib/src/calendar/appointment_engine/recurrence_helper.dart
index eb699f9a9..0bc8a0ebe 100644
--- a/packages/syncfusion_flutter_calendar/lib/src/calendar/appointment_engine/recurrence_helper.dart
+++ b/packages/syncfusion_flutter_calendar/lib/src/calendar/appointment_engine/recurrence_helper.dart
@@ -743,7 +743,7 @@ class RecurrenceHelper {
final int nthWeekDay = _getWeekDay(byDayValue) % DateTime.daysPerWeek;
final int bySetPosValue = int.parse(bySetPosCount);
- void _updateValidDate() {
+ void updateValidDate() {
final DateTime monthStart = DateTime(addDate.year, addDate.month, 1,
recurrenceStartHour, recurrenceStartMinute, recurrenceStartSecond);
final int monthStartWeekday = monthStart.weekday % DateTime.daysPerWeek;
@@ -771,11 +771,11 @@ class RecurrenceHelper {
}
}
- _updateValidDate();
+ updateValidDate();
if (addDate.isBefore(recurrenceStartDate)) {
addDate = DateTime(addDate.year, addDate.month + monthlyMonthGap, 1,
recurrenceStartHour, recurrenceStartMinute, recurrenceStartSecond);
- _updateValidDate();
+ updateValidDate();
}
while (tempCount < recCount ||
@@ -796,7 +796,7 @@ class RecurrenceHelper {
addDate = DateTime(addDate.year, addDate.month + monthlyMonthGap, 1,
recurrenceStartHour, recurrenceStartMinute, recurrenceStartSecond);
- _updateValidDate();
+ updateValidDate();
tempCount++;
}
}
@@ -968,7 +968,7 @@ class RecurrenceHelper {
final int bySetPosValue = int.parse(bySetPosCount);
final int nthWeekDay = _getWeekDay(byDayValue) % DateTime.daysPerWeek;
- void _updateValidNextDate() {
+ void updateValidNextDate() {
while (true) {
DateTime monthStart = DateTime(
addDate.year,
@@ -1019,7 +1019,7 @@ class RecurrenceHelper {
}
}
- _updateValidNextDate();
+ updateValidNextDate();
while (tempCount < recCount ||
(endDate != null &&
(addDate.isBefore(endDate) || addDate == endDate))) {
@@ -1045,7 +1045,7 @@ class RecurrenceHelper {
recurrenceStartSecond);
tempCount++;
- _updateValidNextDate();
+ updateValidNextDate();
}
}
diff --git a/packages/syncfusion_flutter_calendar/lib/src/calendar/appointment_engine/recurrence_properties.dart b/packages/syncfusion_flutter_calendar/lib/src/calendar/appointment_engine/recurrence_properties.dart
index d805255fc..412938573 100644
--- a/packages/syncfusion_flutter_calendar/lib/src/calendar/appointment_engine/recurrence_properties.dart
+++ b/packages/syncfusion_flutter_calendar/lib/src/calendar/appointment_engine/recurrence_properties.dart
@@ -1,5 +1,4 @@
import 'package:flutter/foundation.dart';
-import 'package:flutter/material.dart';
import 'package:syncfusion_flutter_datepicker/datepicker.dart'
show IterableDiagnostics;
@@ -718,14 +717,14 @@ class RecurrenceProperties with Diagnosticable {
@override
// ignore: avoid_equals_and_hash_code_on_mutable_classes
int get hashCode {
- return hashValues(
+ return Object.hash(
recurrenceType,
recurrenceCount,
startDate,
endDate,
interval,
recurrenceRange,
- hashList(weekDays),
+ Object.hashAll(weekDays),
week,
dayOfMonth,
dayOfWeek,
diff --git a/packages/syncfusion_flutter_calendar/lib/src/calendar/appointment_layout/agenda_view_layout.dart b/packages/syncfusion_flutter_calendar/lib/src/calendar/appointment_layout/agenda_view_layout.dart
index 227086d90..f8d0144b3 100644
--- a/packages/syncfusion_flutter_calendar/lib/src/calendar/appointment_layout/agenda_view_layout.dart
+++ b/packages/syncfusion_flutter_calendar/lib/src/calendar/appointment_layout/agenda_view_layout.dart
@@ -30,6 +30,7 @@ class AgendaViewLayout extends StatefulWidget {
this.appointmentBuilder,
this.width,
this.height,
+ this.placeholderTextStyle,
this.calendar);
/// Defines the month view customization details.
@@ -84,6 +85,9 @@ class AgendaViewLayout extends StatefulWidget {
/// Defines the calendar widget.
final SfCalendar calendar;
+ /// Defines the text style of the no events and no selected date.
+ final TextStyle placeholderTextStyle;
+
@override
// ignore: library_private_types_in_public_api
_AgendaViewLayoutState createState() => _AgendaViewLayoutState();
@@ -159,6 +163,7 @@ class _AgendaViewLayoutState extends State {
_appointmentCollection,
widget.width,
widget.height,
+ widget.placeholderTextStyle,
widgets: _children);
}
@@ -254,6 +259,7 @@ class _AgendaViewRenderWidget extends MultiChildRenderObjectWidget {
this.appointmentCollection,
this.width,
this.height,
+ this.placeholderTextStyle,
{List widgets = const []})
: super(children: widgets);
@@ -273,26 +279,29 @@ class _AgendaViewRenderWidget extends MultiChildRenderObjectWidget {
final List appointmentCollection;
final double width;
final double height;
+ final TextStyle placeholderTextStyle;
@override
_AgendaViewRenderObject createRenderObject(BuildContext context) {
return _AgendaViewRenderObject(
- monthViewSettings,
- scheduleViewSettings,
- selectedDate,
- appointments,
- isRTL,
- locale,
- localizations,
- calendarTheme,
- agendaViewNotifier,
- appointmentTimeTextFormat,
- timeLabelWidth,
- textScaleFactor,
- isMobilePlatform,
- appointmentCollection,
- width,
- height);
+ monthViewSettings,
+ scheduleViewSettings,
+ selectedDate,
+ appointments,
+ isRTL,
+ locale,
+ localizations,
+ calendarTheme,
+ agendaViewNotifier,
+ appointmentTimeTextFormat,
+ timeLabelWidth,
+ textScaleFactor,
+ isMobilePlatform,
+ appointmentCollection,
+ width,
+ height,
+ placeholderTextStyle,
+ );
}
@override
@@ -313,7 +322,8 @@ class _AgendaViewRenderWidget extends MultiChildRenderObjectWidget {
..textScaleFactor = textScaleFactor
..appointmentCollection = appointmentCollection
..width = width
- ..height = height;
+ ..height = height
+ ..placeholderTextStyle = placeholderTextStyle;
}
}
@@ -334,7 +344,8 @@ class _AgendaViewRenderObject extends CustomCalendarRenderObject {
this.isMobilePlatform,
this._appointmentCollection,
this._width,
- this._height);
+ this._height,
+ this._placeholderTextStyle);
final bool isMobilePlatform;
@@ -351,6 +362,19 @@ class _AgendaViewRenderObject extends CustomCalendarRenderObject {
markNeedsLayout();
}
+ TextStyle _placeholderTextStyle;
+
+ TextStyle get placeholderTextStyle => _placeholderTextStyle;
+
+ set placeholderTextStyle(TextStyle value) {
+ if (_placeholderTextStyle == value) {
+ return;
+ }
+
+ _placeholderTextStyle = value;
+ markNeedsPaint();
+ }
+
double _width;
double get width => _width;
@@ -1172,8 +1196,7 @@ class _AgendaViewRenderObject extends CustomCalendarRenderObject {
text: selectedDate == null
? localizations.noSelectedDateCalendarLabel
: localizations.noEventsCalendarLabel,
- style: const TextStyle(
- color: Colors.grey, fontSize: 15, fontFamily: 'Roboto'),
+ style: placeholderTextStyle,
);
_updateTextPainterProperties(span);
diff --git a/packages/syncfusion_flutter_calendar/lib/src/calendar/appointment_layout/allday_appointment_layout.dart b/packages/syncfusion_flutter_calendar/lib/src/calendar/appointment_layout/allday_appointment_layout.dart
index d33226773..f73708124 100644
--- a/packages/syncfusion_flutter_calendar/lib/src/calendar/appointment_layout/allday_appointment_layout.dart
+++ b/packages/syncfusion_flutter_calendar/lib/src/calendar/appointment_layout/allday_appointment_layout.dart
@@ -145,6 +145,7 @@ class _AllDayAppointmentLayoutState extends State {
Widget build(BuildContext context) {
/// Create the widgets when appointment builder is not null.
if (_children.isEmpty && widget.calendar.appointmentBuilder != null) {
+ final DateTime initialVisibleDate = widget.visibleDates[0];
for (int i = 0; i < _appointmentCollection.length; i++) {
final AppointmentView appointmentView = _appointmentCollection[i];
@@ -156,10 +157,14 @@ class _AllDayAppointmentLayoutState extends State {
continue;
}
- final DateTime date = DateTime(
+ final DateTime appStartTime = DateTime(
appointmentView.appointment!.actualStartTime.year,
appointmentView.appointment!.actualStartTime.month,
appointmentView.appointment!.actualStartTime.day);
+ final DateTime date = appStartTime.isBefore(initialVisibleDate)
+ ? initialVisibleDate
+ : appStartTime;
+
final Widget child = widget.calendar.appointmentBuilder!(
context,
CalendarAppointmentDetails(
diff --git a/packages/syncfusion_flutter_calendar/lib/src/calendar/appointment_layout/appointment_layout.dart b/packages/syncfusion_flutter_calendar/lib/src/calendar/appointment_layout/appointment_layout.dart
index 98c124519..c9598f0a1 100644
--- a/packages/syncfusion_flutter_calendar/lib/src/calendar/appointment_layout/appointment_layout.dart
+++ b/packages/syncfusion_flutter_calendar/lib/src/calendar/appointment_layout/appointment_layout.dart
@@ -198,6 +198,7 @@ class _AppointmentLayoutState extends State {
Widget build(BuildContext context) {
/// Create the widgets when appointment builder is not null.
if (_children.isEmpty && widget.calendar.appointmentBuilder != null) {
+ final DateTime initialVisibleDate = widget.visibleDates[0];
for (int i = 0; i < _appointmentCollection.length; i++) {
final AppointmentView appointmentView = _appointmentCollection[i];
@@ -208,10 +209,16 @@ class _AppointmentLayoutState extends State {
continue;
}
- final DateTime date = DateTime(
+ final DateTime appStartTime = DateTime(
appointmentView.appointment!.actualStartTime.year,
appointmentView.appointment!.actualStartTime.month,
appointmentView.appointment!.actualStartTime.day);
+ final DateTime date = appointmentView.startIndex != -1
+ ? widget.visibleDates[appointmentView.startIndex]
+ : appStartTime.isBefore(initialVisibleDate)
+ ? initialVisibleDate
+ : appStartTime;
+
final Widget child = widget.calendar.appointmentBuilder!(
context,
CalendarAppointmentDetails(
@@ -723,6 +730,17 @@ class _AppointmentLayoutState extends State {
/// 8 PM to 9 PM and the calendar end time is 6 PM then skip the
/// rendering).
continue;
+ }
+
+ if (yPosition < 0 && yPosition + height > widget.height) {
+ /// Change the start position and height when appointment start time
+ /// before the calendar start time and appointment end time after the
+ /// calendar end time.(Eg., appointment start and end date as 6 AM to
+ /// 9 PM and the calendar start time is 8 AM and end time is 6 PM then
+ /// calculate the new size from 8 AM to 6 MM, if we does not calculate
+ /// the new size then the appointment text drawn on hidden place).
+ height = widget.height;
+ yPosition = 0;
} else if (yPosition + height > widget.height) {
/// Change the height when appointment end time greater than calendar
/// time slot end time(Eg., calendar end time is 4 PM and appointment
diff --git a/packages/syncfusion_flutter_calendar/lib/src/calendar/common/calendar_view_helper.dart b/packages/syncfusion_flutter_calendar/lib/src/calendar/common/calendar_view_helper.dart
index 95fb43e14..a7edf467c 100644
--- a/packages/syncfusion_flutter_calendar/lib/src/calendar/common/calendar_view_helper.dart
+++ b/packages/syncfusion_flutter_calendar/lib/src/calendar/common/calendar_view_helper.dart
@@ -1031,7 +1031,7 @@ class CalendarAppointment {
otherAppointment.isAllDay == isAllDay &&
otherAppointment.notes == notes &&
otherAppointment.location == location &&
- !CalendarViewHelper.isCollectionEqual(
+ CalendarViewHelper.isCollectionEqual(
otherAppointment.resourceIds, resourceIds) &&
otherAppointment.recurrenceId == recurrenceId &&
otherAppointment.id == id &&
@@ -1047,14 +1047,17 @@ class CalendarAppointment {
@override
// ignore: avoid_equals_and_hash_code_on_mutable_classes
int get hashCode {
- return hashValues(
+ return Object.hash(
startTimeZone,
endTimeZone,
recurrenceRule,
isAllDay = false,
notes,
location,
- hashList(resourceIds),
+
+ /// Below condition is referred from text style class
+ /// https://api.flutter.dev/flutter/painting/TextStyle/hashCode.html
+ resourceIds == null ? null : Object.hashAll(resourceIds!),
recurrenceId,
id,
data,
@@ -1062,7 +1065,9 @@ class CalendarAppointment {
endTime,
subject,
color,
- hashList(recurrenceExceptionDates),
+ recurrenceExceptionDates == null
+ ? null
+ : Object.hashAll(recurrenceExceptionDates!),
);
}
}
@@ -1203,15 +1208,20 @@ class CalendarTimeRegion {
@override
// ignore: avoid_equals_and_hash_code_on_mutable_classes
int get hashCode {
- return hashValues(
+ return Object.hash(
startTime,
endTime,
color,
recurrenceRule,
textStyle,
enablePointerInteraction,
- hashList(recurrenceExceptionDates),
- hashList(resourceIds),
+
+ /// Below condition is referred from text style class
+ /// https://api.flutter.dev/flutter/painting/TextStyle/hashCode.html
+ recurrenceExceptionDates == null
+ ? null
+ : Object.hashAll(recurrenceExceptionDates!),
+ resourceIds == null ? null : Object.hashAll(resourceIds!),
text,
iconData,
timeZone);
diff --git a/packages/syncfusion_flutter_calendar/lib/src/calendar/resource_view/calendar_resource.dart b/packages/syncfusion_flutter_calendar/lib/src/calendar/resource_view/calendar_resource.dart
index 350daf335..5f6c5085b 100644
--- a/packages/syncfusion_flutter_calendar/lib/src/calendar/resource_view/calendar_resource.dart
+++ b/packages/syncfusion_flutter_calendar/lib/src/calendar/resource_view/calendar_resource.dart
@@ -263,7 +263,7 @@ class CalendarResource with Diagnosticable {
@override
int get hashCode {
- return hashValues(displayName, id, image, color);
+ return Object.hash(displayName, id, image, color);
}
@override
diff --git a/packages/syncfusion_flutter_calendar/lib/src/calendar/settings/drag_and_drop_settings.dart b/packages/syncfusion_flutter_calendar/lib/src/calendar/settings/drag_and_drop_settings.dart
index edf8ac267..7ed094732 100644
--- a/packages/syncfusion_flutter_calendar/lib/src/calendar/settings/drag_and_drop_settings.dart
+++ b/packages/syncfusion_flutter_calendar/lib/src/calendar/settings/drag_and_drop_settings.dart
@@ -251,7 +251,7 @@ class DragAndDropSettings with Diagnosticable {
@override
int get hashCode {
- return hashValues(allowNavigation, allowScroll, showTimeIndicator,
+ return Object.hash(allowNavigation, allowScroll, showTimeIndicator,
timeIndicatorStyle, indicatorTimeFormat, autoNavigateDelay);
}
}
diff --git a/packages/syncfusion_flutter_calendar/lib/src/calendar/settings/header_style.dart b/packages/syncfusion_flutter_calendar/lib/src/calendar/settings/header_style.dart
index 864e28fcc..2c78b4057 100644
--- a/packages/syncfusion_flutter_calendar/lib/src/calendar/settings/header_style.dart
+++ b/packages/syncfusion_flutter_calendar/lib/src/calendar/settings/header_style.dart
@@ -142,6 +142,6 @@ class CalendarHeaderStyle with Diagnosticable {
@override
int get hashCode {
- return hashValues(textStyle, textAlign, backgroundColor);
+ return Object.hash(textStyle, textAlign, backgroundColor);
}
}
diff --git a/packages/syncfusion_flutter_calendar/lib/src/calendar/settings/month_view_settings.dart b/packages/syncfusion_flutter_calendar/lib/src/calendar/settings/month_view_settings.dart
index b26aa318b..e5c241510 100644
--- a/packages/syncfusion_flutter_calendar/lib/src/calendar/settings/month_view_settings.dart
+++ b/packages/syncfusion_flutter_calendar/lib/src/calendar/settings/month_view_settings.dart
@@ -665,7 +665,7 @@ class MonthViewSettings with Diagnosticable {
@override
int get hashCode {
- return hashValues(
+ return Object.hash(
dayFormat,
monthCellStyle,
agendaStyle,
@@ -743,7 +743,9 @@ class AgendaStyle with Diagnosticable {
{this.appointmentTextStyle,
this.dayTextStyle,
this.dateTextStyle,
- this.backgroundColor});
+ this.backgroundColor,
+ this.placeholderTextStyle = const TextStyle(
+ color: Colors.grey, fontSize: 15, fontFamily: 'Roboto')});
/// The text style for the text in the [Appointment] view in [SfCalendar]
/// month agenda view.
@@ -798,6 +800,34 @@ class AgendaStyle with Diagnosticable {
/// ```
final TextStyle? appointmentTextStyle;
+ /// The text style for the text in the placeholder (no event text and
+ /// no selected date text) of the [SfCalendar] month agenda view.
+ ///
+ /// See also:
+ /// * [MonthViewSettings], to customize the month view of the calendar.
+ /// * [ScheduleViewSettings], to customize the schedule view of the calendar.
+ /// * [AgendaStyle], to customize the month agenda view of the calendar.
+ ///
+ /// ``` dart
+ ///
+ /// Widget build(BuildContext context) {
+ /// return Container(
+ /// child: SfCalendar(
+ /// view: CalendarView.month,
+ /// monthViewSettings: const MonthViewSettings(showAgenda: true,
+ /// agendaStyle: AgendaStyle(
+ /// placeholderTextStyle:TextStyle(
+ /// color: Colors.white,
+ /// fontSize: 20,
+ /// backgroundColor:
+ /// Colors.red),)),
+ /// ),
+ /// );
+ /// }
+ ///
+ ///
+ final TextStyle placeholderTextStyle;
+
/// The text style for the text in the day text of [SfCalendar] month agenda
/// view.
///
@@ -967,7 +997,8 @@ class AgendaStyle with Diagnosticable {
return otherStyle.appointmentTextStyle == appointmentTextStyle &&
otherStyle.dayTextStyle == dayTextStyle &&
otherStyle.dateTextStyle == dateTextStyle &&
- otherStyle.backgroundColor == backgroundColor;
+ otherStyle.backgroundColor == backgroundColor &&
+ otherStyle.placeholderTextStyle == placeholderTextStyle;
}
@override
@@ -980,15 +1011,18 @@ class AgendaStyle with Diagnosticable {
properties
.add(DiagnosticsProperty('dayTextStyle', dayTextStyle));
properties.add(ColorProperty('backgroundColor', backgroundColor));
+ properties.add(DiagnosticsProperty(
+ 'placeholderTextStyle', placeholderTextStyle));
}
@override
int get hashCode {
- return hashValues(
+ return Object.hash(
appointmentTextStyle,
dayTextStyle,
dateTextStyle,
backgroundColor,
+ placeholderTextStyle,
);
}
}
@@ -1558,7 +1592,7 @@ class MonthCellStyle with Diagnosticable {
@override
int get hashCode {
- return hashValues(
+ return Object.hash(
textStyle,
trailingDatesTextStyle,
leadingDatesTextStyle,
diff --git a/packages/syncfusion_flutter_calendar/lib/src/calendar/settings/resource_view_settings.dart b/packages/syncfusion_flutter_calendar/lib/src/calendar/settings/resource_view_settings.dart
index b75e601bb..f52e7d9e1 100644
--- a/packages/syncfusion_flutter_calendar/lib/src/calendar/settings/resource_view_settings.dart
+++ b/packages/syncfusion_flutter_calendar/lib/src/calendar/settings/resource_view_settings.dart
@@ -252,7 +252,7 @@ class ResourceViewSettings with Diagnosticable {
@override
int get hashCode {
- return hashValues(
+ return Object.hash(
size, visibleResourceCount, showAvatar, displayNameTextStyle);
}
}
diff --git a/packages/syncfusion_flutter_calendar/lib/src/calendar/settings/schedule_view_settings.dart b/packages/syncfusion_flutter_calendar/lib/src/calendar/settings/schedule_view_settings.dart
index 8567b733c..32ee8a5c1 100644
--- a/packages/syncfusion_flutter_calendar/lib/src/calendar/settings/schedule_view_settings.dart
+++ b/packages/syncfusion_flutter_calendar/lib/src/calendar/settings/schedule_view_settings.dart
@@ -52,7 +52,9 @@ class ScheduleViewSettings with Diagnosticable {
this.hideEmptyScheduleWeek = false,
this.monthHeaderSettings = const MonthHeaderSettings(),
this.weekHeaderSettings = const WeekHeaderSettings(),
- this.dayHeaderSettings = const DayHeaderSettings()})
+ this.dayHeaderSettings = const DayHeaderSettings(),
+ this.placeholderTextStyle = const TextStyle(
+ color: Colors.grey, fontSize: 15, fontFamily: 'Roboto')})
: assert(appointmentItemHeight >= -1);
/// Sets the style to customize month label in [SfCalendar] schedule view.
@@ -223,6 +225,32 @@ class ScheduleViewSettings with Diagnosticable {
/// ```
final TextStyle? appointmentTextStyle;
+ /// The text style for the text in the placeholder (no event
+ /// text) of the [SfCalendar] schedule view.
+ ///
+ /// See also:
+ /// * [MonthViewSettings], to customize the month view of the calendar.
+ /// * [ScheduleViewSettings], to customize the schedule view of the calendar.
+ /// * [AgendaStyle], to customize the month agenda view of the calendar.
+ ///
+ /// ``` dart
+ ///
+ /// Widget build(BuildContext context) {
+ /// return Container(
+ /// child: SfCalendar(
+ /// view: CalendarView.schedule,
+ /// scheduleViewSettings: const ScheduleViewSettings(
+ /// placeholderTextStyle: TextStyle(
+ /// color: Colors.white,
+ /// fontSize: 20,
+ /// backgroundColor: Colors.red)),
+ /// ),
+ /// );
+ /// }
+ ///
+ ///
+ final TextStyle placeholderTextStyle;
+
/// The height for each appointment view to layout within this in schedule
/// view of [SfCalendar],.
///
@@ -304,7 +332,8 @@ class ScheduleViewSettings with Diagnosticable {
otherStyle.hideEmptyScheduleWeek == hideEmptyScheduleWeek &&
otherStyle.monthHeaderSettings == monthHeaderSettings &&
otherStyle.weekHeaderSettings == weekHeaderSettings &&
- otherStyle.dayHeaderSettings == dayHeaderSettings;
+ otherStyle.dayHeaderSettings == dayHeaderSettings &&
+ otherStyle.placeholderTextStyle == placeholderTextStyle;
}
@override
@@ -322,17 +351,20 @@ class ScheduleViewSettings with Diagnosticable {
.add(DoubleProperty('appointmentItemHeight', appointmentItemHeight));
properties.add(DiagnosticsProperty(
'hideEmptyScheduleWeek', hideEmptyScheduleWeek));
+ properties.add(DiagnosticsProperty(
+ 'placeholderTextStyle', placeholderTextStyle));
}
@override
int get hashCode {
- return hashValues(
+ return Object.hash(
appointmentTextStyle,
appointmentItemHeight,
hideEmptyScheduleWeek,
monthHeaderSettings,
weekHeaderSettings,
- dayHeaderSettings);
+ dayHeaderSettings,
+ placeholderTextStyle);
}
}
@@ -597,7 +629,7 @@ class MonthHeaderSettings with Diagnosticable {
@override
int get hashCode {
- return hashValues(
+ return Object.hash(
monthFormat, height, textAlign, backgroundColor, monthTextStyle);
}
}
@@ -917,7 +949,7 @@ class WeekHeaderSettings with Diagnosticable {
@override
int get hashCode {
- return hashValues(startDateFormat, endDateFormat, height, textAlign,
+ return Object.hash(startDateFormat, endDateFormat, height, textAlign,
backgroundColor, weekTextStyle);
}
}
@@ -1151,6 +1183,6 @@ class DayHeaderSettings with Diagnosticable {
@override
int get hashCode {
- return hashValues(dayFormat, width, dayTextStyle, dateTextStyle);
+ return Object.hash(dayFormat, width, dayTextStyle, dateTextStyle);
}
}
diff --git a/packages/syncfusion_flutter_calendar/lib/src/calendar/settings/time_region.dart b/packages/syncfusion_flutter_calendar/lib/src/calendar/settings/time_region.dart
index 5bbc766f2..b4d126104 100644
--- a/packages/syncfusion_flutter_calendar/lib/src/calendar/settings/time_region.dart
+++ b/packages/syncfusion_flutter_calendar/lib/src/calendar/settings/time_region.dart
@@ -598,15 +598,20 @@ class TimeRegion with Diagnosticable {
@override
int get hashCode {
- return hashValues(
+ return Object.hash(
startTime,
endTime,
color,
recurrenceRule,
textStyle,
enablePointerInteraction,
- hashList(recurrenceExceptionDates),
- hashList(resourceIds),
+
+ /// Below condition is referred from text style class
+ /// https://api.flutter.dev/flutter/painting/TextStyle/hashCode.html
+ recurrenceExceptionDates == null
+ ? null
+ : Object.hashAll(recurrenceExceptionDates!),
+ resourceIds == null ? null : Object.hashAll(resourceIds!),
text,
iconData,
timeZone);
diff --git a/packages/syncfusion_flutter_calendar/lib/src/calendar/settings/time_slot_view_settings.dart b/packages/syncfusion_flutter_calendar/lib/src/calendar/settings/time_slot_view_settings.dart
index ce62d247a..46303fa87 100644
--- a/packages/syncfusion_flutter_calendar/lib/src/calendar/settings/time_slot_view_settings.dart
+++ b/packages/syncfusion_flutter_calendar/lib/src/calendar/settings/time_slot_view_settings.dart
@@ -744,10 +744,10 @@ class TimeSlotViewSettings with Diagnosticable {
@override
int get hashCode {
- return hashValues(
+ return Object.hash(
startHour,
endHour,
- hashList(nonWorkingDays),
+ Object.hashAll(nonWorkingDays),
timeInterval,
timeIntervalHeight,
timeIntervalWidth,
diff --git a/packages/syncfusion_flutter_calendar/lib/src/calendar/settings/view_header_style.dart b/packages/syncfusion_flutter_calendar/lib/src/calendar/settings/view_header_style.dart
index 0c13a6dc8..b3b30836d 100644
--- a/packages/syncfusion_flutter_calendar/lib/src/calendar/settings/view_header_style.dart
+++ b/packages/syncfusion_flutter_calendar/lib/src/calendar/settings/view_header_style.dart
@@ -161,7 +161,7 @@ class ViewHeaderStyle with Diagnosticable {
@override
int get hashCode {
- return hashValues(
+ return Object.hash(
backgroundColor,
dayTextStyle,
dateTextStyle,
diff --git a/packages/syncfusion_flutter_calendar/lib/src/calendar/settings/week_number_style.dart b/packages/syncfusion_flutter_calendar/lib/src/calendar/settings/week_number_style.dart
index c2a6196d1..6cae76fa5 100644
--- a/packages/syncfusion_flutter_calendar/lib/src/calendar/settings/week_number_style.dart
+++ b/packages/syncfusion_flutter_calendar/lib/src/calendar/settings/week_number_style.dart
@@ -106,7 +106,7 @@ class WeekNumberStyle with Diagnosticable {
@override
int get hashCode {
- return hashValues(
+ return Object.hash(
backgroundColor,
textStyle,
);
diff --git a/packages/syncfusion_flutter_calendar/lib/src/calendar/sfcalendar.dart b/packages/syncfusion_flutter_calendar/lib/src/calendar/sfcalendar.dart
index 572ef676c..35485b580 100644
--- a/packages/syncfusion_flutter_calendar/lib/src/calendar/sfcalendar.dart
+++ b/packages/syncfusion_flutter_calendar/lib/src/calendar/sfcalendar.dart
@@ -3444,7 +3444,7 @@ class _SfCalendarState extends State
/// current date view added or not.
bool isCurrentDateHighlightAdded = !isNeedCurrentDateHighlight;
- CalendarDetails _triggerDisplayDateDetails(DateTime date) {
+ CalendarDetails triggerDisplayDateDetails(DateTime date) {
if ((!_isRTL && viewPadding >= position.dx) ||
(_isRTL && _minWidth - viewPadding < position.dx)) {
/// Return calendar details while the [getCalendarDetailsAtOffset]
@@ -3491,7 +3491,7 @@ class _SfCalendarState extends State
appointmentViewHeaderHeight + dividerHeight;
if (topPosition <= yPosition &&
topPosition + displayDateHeight > yPosition) {
- return _triggerDisplayDateDetails(scheduleDisplayDate);
+ return triggerDisplayDateDetails(scheduleDisplayDate);
}
topPosition += displayDateHeight;
@@ -3514,7 +3514,7 @@ class _SfCalendarState extends State
/// because display date view height as single appointment view height
final double todayHeight = appointmentViewHeaderHeight + dividerHeight;
if (topPosition <= yPosition && topPosition + todayHeight > yPosition) {
- return _triggerDisplayDateDetails(scheduleCurrentDate);
+ return triggerDisplayDateDetails(scheduleCurrentDate);
}
topPosition += todayHeight;
@@ -3557,7 +3557,7 @@ class _SfCalendarState extends State
appointmentViewHeaderHeight + dividerHeight;
if (topPosition <= yPosition &&
topPosition + displayDateHeight > yPosition) {
- return _triggerDisplayDateDetails(scheduleDisplayDate);
+ return triggerDisplayDateDetails(scheduleDisplayDate);
}
topPosition += displayDateHeight;
@@ -3575,7 +3575,7 @@ class _SfCalendarState extends State
appointmentViewHeaderHeight + dividerHeight;
if (topPosition <= yPosition &&
topPosition + currentDateHeight > yPosition) {
- return _triggerDisplayDateDetails(scheduleCurrentDate);
+ return triggerDisplayDateDetails(scheduleCurrentDate);
}
topPosition += currentDateHeight;
@@ -3678,7 +3678,7 @@ class _SfCalendarState extends State
appointmentViewHeaderHeight + dividerHeight;
if (topPosition <= yPosition &&
topPosition + displayDateHeight > yPosition) {
- return _triggerDisplayDateDetails(scheduleDisplayDate);
+ return triggerDisplayDateDetails(scheduleDisplayDate);
}
topPosition += displayDateHeight;
@@ -3696,7 +3696,7 @@ class _SfCalendarState extends State
appointmentViewHeaderHeight + dividerHeight;
if (topPosition <= yPosition &&
topPosition + currentDateHeight > yPosition) {
- return _triggerDisplayDateDetails(scheduleCurrentDate);
+ return triggerDisplayDateDetails(scheduleCurrentDate);
}
topPosition += currentDateHeight;
@@ -3735,7 +3735,7 @@ class _SfCalendarState extends State
appointmentViewHeaderHeight + dividerHeight;
if (topPosition <= yPosition &&
topPosition + displayDateHeight > yPosition) {
- return _triggerDisplayDateDetails(scheduleDisplayDate);
+ return triggerDisplayDateDetails(scheduleDisplayDate);
}
topPosition += displayDateHeight;
@@ -3749,7 +3749,7 @@ class _SfCalendarState extends State
appointmentViewHeaderHeight + dividerHeight;
if (topPosition <= yPosition &&
topPosition + currentDateHeight > yPosition) {
- return _triggerDisplayDateDetails(scheduleCurrentDate);
+ return triggerDisplayDateDetails(scheduleCurrentDate);
}
topPosition += currentDateHeight;
@@ -3879,7 +3879,7 @@ class _SfCalendarState extends State
/// loads the time zone data base to handle the time zone for calendar
Future _loadDataBase() async {
final ByteData byteData =
- await rootBundle.load('packages/timezone/data/2020a.tzf');
+ await rootBundle.load('packages/timezone/data/latest_all.tzf');
initializeDatabase(byteData.buffer.asUint8List());
_timeZoneLoaded = true;
return true;
@@ -3984,6 +3984,10 @@ class _SfCalendarState extends State
void _handleScheduleViewScrolled() {
_removeDatePicker();
+ if (_view != CalendarView.schedule) {
+ return;
+ }
+
double widgetPosition = 0;
final double scrolledPosition = _agendaScrollController!.position.pixels;
@@ -4524,7 +4528,7 @@ class _SfCalendarState extends State
appEndDate = addDuration(appEndDate, Duration(days: value)) as DateTime;
- void _addNewAppointmentWeekDate(DateTime date) {
+ void addNewAppointmentWeekDate(DateTime date) {
/// Add newly added appointment dates into previous and next date
/// collection based on the DateTime range. And it will ignore
/// the dates which is same as previous date or next date.
@@ -4540,7 +4544,7 @@ class _SfCalendarState extends State
DateTime appCurrentDate = appDate;
while (appCurrentDate.isBefore(appEndDate) ||
isSameDate(appCurrentDate, appEndDate)) {
- _addNewAppointmentWeekDate(appCurrentDate);
+ addNewAppointmentWeekDate(appCurrentDate);
appCurrentDate = addDuration(
appCurrentDate, const Duration(days: DateTime.daysPerWeek))
as DateTime;
@@ -5876,7 +5880,7 @@ class _SfCalendarState extends State
allDayEventCount = _getAllDayCount(currentAppointments);
}
- void _addMonthHeaderView() {
+ void addMonthHeaderView() {
/// Assign the intersection point based on previous view end position.
scheduleViewDetails._intersectPoint = currentIndex >= 0
? previousHeight + interSectPoint + viewTopPadding
@@ -5892,7 +5896,7 @@ class _SfCalendarState extends State
}
}
- void _addDisplayOrCurrentDateView({bool isDisplayDate = true}) {
+ void addDisplayOrCurrentDateView({bool isDisplayDate = true}) {
final double highlightViewStartPosition = currentIndex >= 0
? previousHeight + interSectPoint
: -(previousHeight + height - interSectPoint);
@@ -5935,7 +5939,7 @@ class _SfCalendarState extends State
if (!isDisplayDateHighlightAdded &&
currentDate.isAfter(scheduleDisplayDate) &&
currentDate.month != scheduleDisplayDate.month) {
- _addDisplayOrCurrentDateView();
+ addDisplayOrCurrentDateView();
}
/// Check the current date view not added in widget and appointment
@@ -5949,7 +5953,7 @@ class _SfCalendarState extends State
if (!isCurrentDateHighlightAdded &&
currentDate.isAfter(scheduleCurrentDate) &&
currentDate.month != scheduleCurrentDate.month) {
- _addDisplayOrCurrentDateView(isDisplayDate: false);
+ addDisplayOrCurrentDateView(isDisplayDate: false);
}
/// Check if the view intersection point not set and the current week date
@@ -5958,21 +5962,21 @@ class _SfCalendarState extends State
if (scheduleViewDetails._intersectPoint == -1 &&
(startDate.month != currentDate.month ||
startDate.year != currentDate.year)) {
- _addMonthHeaderView();
+ addMonthHeaderView();
}
/// Check the display date view not added in widget and appointment
/// date is after of display date then add the display date view.
if (!isDisplayDateHighlightAdded &&
currentDate.isAfter(scheduleDisplayDate)) {
- _addDisplayOrCurrentDateView();
+ addDisplayOrCurrentDateView();
}
/// Check the current date view not added in widget and appointment
/// date is after of current date then add the current date view.
if (!isCurrentDateHighlightAdded &&
currentDate.isAfter(scheduleCurrentDate)) {
- _addDisplayOrCurrentDateView(isDisplayDate: false);
+ addDisplayOrCurrentDateView(isDisplayDate: false);
}
final double totalPadding = (eventsCount + 1) * padding;
@@ -6055,6 +6059,7 @@ class _SfCalendarState extends State
widget.appointmentBuilder,
_minWidth - viewPadding,
panelHeight,
+ widget.monthViewSettings.agendaStyle.placeholderTextStyle,
widget),
)),
onTapUp: (TapUpDetails details) {
@@ -9035,6 +9040,8 @@ class _SfCalendarState extends State
widget.appointmentBuilder,
width,
height,
+ widget
+ .monthViewSettings.agendaStyle.placeholderTextStyle,
widget),
onTapUp: (TapUpDetails details) {
_handleTapForAgenda(details, null);
@@ -9145,6 +9152,8 @@ class _SfCalendarState extends State
widget.appointmentBuilder,
width - _agendaDateViewWidth,
painterHeight,
+ widget.monthViewSettings.agendaStyle
+ .placeholderTextStyle,
widget),
],
),
@@ -9460,6 +9469,7 @@ class _CalendarHeaderViewState extends State<_CalendarHeaderView> {
context,
style: widget.headerStyle.textStyle ??
widget.calendarTheme.headerTextStyle);
+
headerTextWidth = headerTextSize.width +
padding +
(widget.showDatePickerButton ? headerIconTextWidth : 0);
@@ -9468,6 +9478,18 @@ class _CalendarHeaderViewState extends State<_CalendarHeaderView> {
: headerTextSize.height;
}
+ if (weekNumberEnabled) {
+ final Size weekNumberPanelSize = _getTextWidgetWidth(
+ '${widget.localizations.weeknumberLabel}$weekNumberString ',
+ widget.height,
+ widget.width,
+ context,
+ style: weekNumberTextStyle);
+ weekNumberTextWidth = weekNumberPanelSize.width + padding;
+ weekNumberPanelWidth = weekNumberTextWidth;
+ weekNumberPanelHeight = weekNumberPanelSize.height;
+ }
+
final Color? highlightColor = CalendarViewHelper.getTodayHighlightTextColor(
widget.todayHighlightColor ?? widget.calendarTheme.todayHighlightColor,
widget.todayTextStyle,
@@ -9501,10 +9523,13 @@ class _CalendarHeaderViewState extends State<_CalendarHeaderView> {
/// Assign divider width when today icon text shown.
dividerWidth = widget.showDatePickerButton ? 10 : 0;
- double totalWidth =
- widget.width - totalArrowWidth - dividerWidth - todayIconWidth;
+ final double totalWidth = widget.width -
+ totalArrowWidth -
+ dividerWidth -
+ todayIconWidth -
+ headerTextWidth -
+ weekNumberPanelWidth;
- totalWidth -= headerTextWidth;
final Map calendarViewsWidth =
{};
double allowedViewsWidth = 0;
@@ -9594,41 +9619,38 @@ class _CalendarHeaderViewState extends State<_CalendarHeaderView> {
? maxHeaderHeight
: widget.height;
- headerWidth = widget.width -
- calendarViewWidth -
- todayIconWidth -
- dividerWidth -
- totalArrowWidth;
-
if (weekNumberEnabled) {
- weekNumberPanelWidth = (headerWidth - headerTextWidth) + padding;
- final double minimumWeekNumberWidth = headerWidth / 4;
- if (weekNumberPanelWidth < minimumWeekNumberWidth) {
- weekNumberPanelWidth = minimumWeekNumberWidth + padding;
- headerWidth = headerTextWidth - weekNumberPanelWidth;
- } else {
- headerWidth = headerTextWidth;
- }
- final Size weekNumberPanelSize = _getTextWidgetWidth(
- '${widget.localizations.weeknumberLabel}$weekNumberString ',
- headerHeight,
- weekNumberPanelWidth,
- context,
- style: weekNumberTextStyle);
- weekNumberTextWidth = weekNumberPanelSize.width > weekNumberPanelWidth
- ? weekNumberPanelWidth
- : weekNumberPanelSize.width + padding;
- weekNumberPanelHeight = weekNumberPanelSize.height;
- final double occupiedWidth = widget.width -
+ /// Header will render based on its text width while week number enabled.
+ /// because the week number panel occupies the empty space to align the
+ /// today button and calendar view button on right side end.
+ headerWidth = headerTextWidth;
+ final double remainingWidth = widget.width -
calendarViewWidth -
todayIconWidth -
dividerWidth -
totalArrowWidth -
weekNumberPanelWidth -
headerWidth;
- if (occupiedWidth < 0) {
- headerWidth += occupiedWidth;
+ if (remainingWidth < 0) {
+ /// Clip the header text while the calendar view button, today button,
+ /// arrows and week number does not have space to render.
+ headerWidth += remainingWidth;
+ } else {
+ /// Assign the week number panel width is available space other than
+ /// header text width, calendar view button width, today button,
+ /// arrows width to align the today button and calendar view button
+ /// on right side end.
+ weekNumberPanelWidth += remainingWidth;
}
+ } else {
+ /// Assign the header panel width is available space other than
+ /// calendar view button width, today button, arrows width to align the
+ /// today button and calendar view button on right side end.
+ headerWidth = widget.width -
+ calendarViewWidth -
+ todayIconWidth -
+ dividerWidth -
+ totalArrowWidth;
}
final List dates = widget.visibleDates;
@@ -9652,7 +9674,7 @@ class _CalendarHeaderViewState extends State<_CalendarHeaderView> {
prevArrowColor = prevArrowColor.withOpacity(prevArrowColor.opacity * 0.5);
}
- MainAxisAlignment _getAlignmentFromTextAlign() {
+ MainAxisAlignment getAlignmentFromTextAlign() {
if (widget.headerStyle.textAlign == TextAlign.left ||
widget.headerStyle.textAlign == TextAlign.start) {
return MainAxisAlignment.start;
@@ -9673,7 +9695,7 @@ class _CalendarHeaderViewState extends State<_CalendarHeaderView> {
(widget.headerStyle.textAlign == TextAlign.center ||
widget.headerStyle.textAlign == TextAlign.justify);
- Alignment _getHeaderAlignment() {
+ Alignment getHeaderAlignment() {
if (widget.headerStyle.textAlign == TextAlign.left ||
widget.headerStyle.textAlign == TextAlign.start) {
return widget.isRTL ? Alignment.centerRight : Alignment.centerLeft;
@@ -9733,7 +9755,7 @@ class _CalendarHeaderViewState extends State<_CalendarHeaderView> {
alignment: Alignment.centerLeft,
padding: const EdgeInsets.symmetric(horizontal: 5),
child: Row(
- mainAxisAlignment: _getAlignmentFromTextAlign(),
+ mainAxisAlignment: getAlignmentFromTextAlign(),
children: widget.showDatePickerButton
? [
Flexible(
@@ -9766,7 +9788,7 @@ class _CalendarHeaderViewState extends State<_CalendarHeaderView> {
)),
)
: Container(
- alignment: _getHeaderAlignment(),
+ alignment: getHeaderAlignment(),
color: headerBackgroundColor,
width: isCenterAlignment && headerWidth > 200 ? 200 : headerWidth,
height: headerHeight,
@@ -9801,9 +9823,13 @@ class _CalendarHeaderViewState extends State<_CalendarHeaderView> {
? Colors.grey.withOpacity(0.3)
: headerBackgroundColor,
),
- width: isCenterAlignment && headerTextWidth > 200
- ? 200
- : headerTextWidth,
+
+ /// Padding value is from parent container padding
+ /// value const EdgeInsets.all(2).
+ width: (isCenterAlignment && headerTextWidth > 200
+ ? 200
+ : headerTextWidth) -
+ padding,
height: headerHeight,
alignment: Alignment.center,
padding: const EdgeInsets.symmetric(horizontal: 5),
@@ -9847,7 +9873,7 @@ class _CalendarHeaderViewState extends State<_CalendarHeaderView> {
width:
isCenterAlignment ? weekNumberTextWidth : weekNumberPanelWidth,
height: weekNumberPanelHeight,
- alignment: _getHeaderAlignment(),
+ alignment: getHeaderAlignment(),
child: Container(
decoration: BoxDecoration(
borderRadius:
@@ -10472,8 +10498,7 @@ class _ScheduleLabelPainter extends CustomPainter {
final TextSpan span = TextSpan(
text: _localizations.noEventsCalendarLabel,
style: scheduleViewSettings.weekHeaderSettings.weekTextStyle ??
- const TextStyle(
- color: Colors.grey, fontSize: 15, fontFamily: 'Roboto'),
+ scheduleViewSettings.placeholderTextStyle,
);
double xPosition = 10;
diff --git a/packages/syncfusion_flutter_calendar/lib/src/calendar/views/calendar_view.dart b/packages/syncfusion_flutter_calendar/lib/src/calendar/views/calendar_view.dart
index cbfe6589f..5be572291 100644
--- a/packages/syncfusion_flutter_calendar/lib/src/calendar/views/calendar_view.dart
+++ b/packages/syncfusion_flutter_calendar/lib/src/calendar/views/calendar_view.dart
@@ -417,14 +417,17 @@ class _CustomCalendarScrollViewState extends State
_position = 0;
}
- if (widget.calendar.monthViewSettings.numberOfWeeksInView !=
- oldWidget.calendar.monthViewSettings.numberOfWeeksInView ||
- !CalendarViewHelper.isCollectionEqual(
- widget.calendar.timeSlotViewSettings.nonWorkingDays,
- oldWidget.calendar.timeSlotViewSettings.nonWorkingDays) ||
+ if ((widget.view == CalendarView.month &&
+ widget.calendar.monthViewSettings.numberOfWeeksInView !=
+ oldWidget.calendar.monthViewSettings.numberOfWeeksInView) ||
widget.calendar.firstDayOfWeek != oldWidget.calendar.firstDayOfWeek ||
- widget.calendar.timeSlotViewSettings.numberOfDaysInView !=
- oldWidget.calendar.timeSlotViewSettings.numberOfDaysInView ||
+ (widget.view != CalendarView.month &&
+ (!CalendarViewHelper.isCollectionEqual(
+ widget.calendar.timeSlotViewSettings.nonWorkingDays,
+ oldWidget.calendar.timeSlotViewSettings.nonWorkingDays) ||
+ widget.calendar.timeSlotViewSettings.numberOfDaysInView !=
+ oldWidget
+ .calendar.timeSlotViewSettings.numberOfDaysInView)) ||
widget.isRTL != oldWidget.isRTL) {
_updateVisibleDates();
_position = 0;
@@ -784,7 +787,6 @@ class _CustomCalendarScrollViewState extends State
widget.width,
widget.height,
currentState.widget.visibleDates.length,
- currentState._allDayHeight,
widget.isMobilePlatform);
_dragDetails.value.appointmentView = appointmentView;
_dragDifferenceOffset = null;
@@ -923,7 +925,6 @@ class _CustomCalendarScrollViewState extends State
widget.width,
widget.height,
currentState.widget.visibleDates.length,
- currentState._allDayHeight,
widget.isMobilePlatform);
if (isTimelineView) {
_updateAutoScrollDragTimelineView(
@@ -1018,7 +1019,7 @@ class _CustomCalendarScrollViewState extends State
_dragDetails.value.position.value!.dy <=
viewHeaderHeight + allDayHeight &&
currentState._scrollController!.position.pixels != 0) {
- Future _updateScrollPosition() async {
+ Future updateScrollPosition() async {
double scrollPosition =
currentState._scrollController!.position.pixels -
timeIntervalHeight;
@@ -1048,14 +1049,14 @@ class _CustomCalendarScrollViewState extends State
_dragDetails.value.position.value!.dy <=
viewHeaderHeight + allDayHeight &&
currentState._scrollController!.position.pixels != 0) {
- _updateScrollPosition();
+ updateScrollPosition();
} else if (_timer != null) {
_timer!.cancel();
_timer = null;
}
}
- _updateScrollPosition();
+ updateScrollPosition();
} else if (_timer != null) {
_timer!.cancel();
_timer = null;
@@ -1079,7 +1080,7 @@ class _CustomCalendarScrollViewState extends State
widget.height &&
currentState._scrollController!.position.pixels !=
currentState._scrollController!.position.maxScrollExtent) {
- Future _updateScrollPosition() async {
+ Future updateScrollPosition() async {
double scrollPosition =
currentState._scrollController!.position.pixels +
timeIntervalHeight;
@@ -1115,14 +1116,14 @@ class _CustomCalendarScrollViewState extends State
widget.height &&
currentState._scrollController!.position.pixels !=
currentState._scrollController!.position.maxScrollExtent) {
- _updateScrollPosition();
+ updateScrollPosition();
} else if (_timer != null) {
_timer!.cancel();
_timer = null;
}
}
- _updateScrollPosition();
+ updateScrollPosition();
} else if (_timer != null) {
_timer!.cancel();
_timer = null;
@@ -1269,7 +1270,7 @@ class _CustomCalendarScrollViewState extends State
._scrollController!.position.maxScrollExtent) ||
(!widget.isRTL &&
currentState._scrollController!.position.pixels != 0))) {
- Future _updateScrollPosition() async {
+ Future updateScrollPosition() async {
double scrollPosition =
currentState._scrollController!.position.pixels -
timeIntervalHeight;
@@ -1313,7 +1314,7 @@ class _CustomCalendarScrollViewState extends State
(!widget.isRTL &&
currentState._scrollController!.position.pixels !=
0))) {
- _updateScrollPosition();
+ updateScrollPosition();
} else if (_timer != null) {
_timer!.cancel();
_timer = null;
@@ -1334,7 +1335,7 @@ class _CustomCalendarScrollViewState extends State
}
}
- _updateScrollPosition();
+ updateScrollPosition();
} else if (_timer != null) {
_timer!.cancel();
_timer = null;
@@ -1382,7 +1383,7 @@ class _CustomCalendarScrollViewState extends State
currentState._scrollController!.position.pixels !=
currentState
._scrollController!.position.maxScrollExtent))) {
- Future _updateScrollPosition() async {
+ Future updateScrollPosition() async {
double scrollPosition =
currentState._scrollController!.position.pixels +
timeIntervalHeight;
@@ -1430,7 +1431,7 @@ class _CustomCalendarScrollViewState extends State
currentState._scrollController!.position.pixels !=
currentState._scrollController!.position
.maxScrollExtent))) {
- _updateScrollPosition();
+ updateScrollPosition();
} else if (_timer != null) {
_timer!.cancel();
_timer = null;
@@ -1451,7 +1452,7 @@ class _CustomCalendarScrollViewState extends State
}
}
- _updateScrollPosition();
+ updateScrollPosition();
} else if (_timer != null) {
_timer!.cancel();
_timer = null;
@@ -1509,7 +1510,7 @@ class _CustomCalendarScrollViewState extends State
currentState
._timelineViewVerticalScrollController!.position.pixels !=
0) {
- Future _updateScrollPosition() async {
+ Future updateScrollPosition() async {
double scrollPosition = currentState
._timelineViewVerticalScrollController!.position.pixels -
resourceItemHeight;
@@ -1531,14 +1532,14 @@ class _CustomCalendarScrollViewState extends State
currentState._timelineViewVerticalScrollController!.position
.pixels !=
0) {
- _updateScrollPosition();
+ updateScrollPosition();
} else if (_timer != null) {
_timer!.cancel();
_timer = null;
}
}
- _updateScrollPosition();
+ updateScrollPosition();
} else if (_timer != null) {
_timer!.cancel();
_timer = null;
@@ -1564,7 +1565,7 @@ class _CustomCalendarScrollViewState extends State
._timelineViewVerticalScrollController!.position.pixels !=
currentState._timelineViewVerticalScrollController!.position
.maxScrollExtent) {
- Future _updateScrollPosition() async {
+ Future updateScrollPosition() async {
double scrollPosition = currentState
._timelineViewVerticalScrollController!.position.pixels +
resourceItemHeight;
@@ -1593,14 +1594,14 @@ class _CustomCalendarScrollViewState extends State
.pixels !=
currentState._timelineViewVerticalScrollController!
.position.maxScrollExtent) {
- _updateScrollPosition();
+ updateScrollPosition();
} else if (_timer != null) {
_timer!.cancel();
_timer = null;
}
}
- _updateScrollPosition();
+ updateScrollPosition();
} else if (_timer != null) {
_timer!.cancel();
_timer = null;
@@ -1958,7 +1959,6 @@ class _CustomCalendarScrollViewState extends State
widget.width,
widget.height,
currentState.widget.visibleDates.length,
- currentState._allDayHeight,
widget.isMobilePlatform);
double xPosition = details.dx;
double yPosition = appointmentPosition.dy;
@@ -2543,8 +2543,20 @@ class _CustomCalendarScrollViewState extends State
void _handlePointerSignal(PointerSignalEvent event) {
final _CalendarViewState? viewKey = _getCurrentViewByVisibleDates();
if (event is PointerScrollEvent && viewKey != null) {
- final double scrolledPosition =
+ double scrolledPosition =
widget.isRTL ? -event.scrollDelta.dx : event.scrollDelta.dx;
+
+ /// Check the scrolling is vertical and timeline view does not have
+ /// vertical scroll view then scroll the vertical movement on
+ /// Horizontal direction.
+ if (event.scrollDelta.dy.abs() > event.scrollDelta.dx.abs() &&
+ viewKey._timelineViewVerticalScrollController!.position
+ .maxScrollExtent ==
+ 0) {
+ scrolledPosition =
+ widget.isRTL ? -event.scrollDelta.dy : event.scrollDelta.dy;
+ }
+
final double targetScrollOffset = math.min(
math.max(
viewKey._scrollController!.position.pixels + scrolledPosition,
@@ -3080,7 +3092,8 @@ class _CustomCalendarScrollViewState extends State
);
_children[index] = view;
- } // check and update the visible appointments in the view
+ }
+ // check and update the visible appointments in the view
else if (!CalendarViewHelper.isCollectionEqual(
appointmentLayout.visibleAppointments.value,
_updateCalendarStateDetails.visibleAppointments)) {
@@ -3118,6 +3131,43 @@ class _CustomCalendarScrollViewState extends State
},
key: viewKey,
);
+ _children[index] = view;
+ } else if (view.calendar != widget.calendar) {
+ /// Update the calendar view when calendar properties like appointment
+ /// text style dynamically changed.
+ view = _CalendarView(
+ widget.calendar,
+ widget.view,
+ visibleDates,
+ widget.width,
+ widget.height,
+ widget.agendaSelectedDate,
+ widget.locale,
+ widget.calendarTheme,
+ view.regions,
+ view.blackoutDates,
+ _focusNode,
+ widget.removePicker,
+ widget.calendar.allowViewNavigation,
+ widget.controller,
+ widget.resourcePanelScrollController,
+ widget.resourceCollection,
+ widget.textScaleFactor,
+ widget.isMobilePlatform,
+ widget.minDate,
+ widget.maxDate,
+ widget.localizations,
+ widget.timelineMonthWeekNumberNotifier,
+ _dragDetails,
+ (UpdateCalendarStateDetails details) {
+ _updateCalendarViewStateDetails(details);
+ },
+ (UpdateCalendarStateDetails details) {
+ _getCalendarViewStateDetails(details);
+ },
+ key: viewKey,
+ );
+
_children[index] = view;
} else if (view.visibleDates == _currentViewVisibleDates) {
/// Remove the appointment selection when the selected
@@ -3378,9 +3428,12 @@ class _CustomCalendarScrollViewState extends State
} else if (_currentChildIndex == 2) {
_currentChildIndex = 0;
}
+
+ // resets position to zero on the swipe end to avoid the
+ // unwanted date updates.
+ _position = 0;
});
- _resetPosition();
_updateAppointmentPainter();
}
@@ -3412,9 +3465,12 @@ class _CustomCalendarScrollViewState extends State
} else if (_currentChildIndex == 2) {
_currentChildIndex = 1;
}
+
+ // resets position to zero on the swipe end to avoid the
+ // unwanted date updates.
+ _position = 0;
});
- _resetPosition();
_updateAppointmentPainter();
}
@@ -3629,15 +3685,6 @@ class _CustomCalendarScrollViewState extends State
_updateAppointmentPainter();
}
- // resets position to zero on the swipe end to avoid the unwanted date updates
- void _resetPosition() {
- SchedulerBinding.instance.addPostFrameCallback((_) {
- if (_position.abs() == widget.width || _position.abs() == widget.height) {
- _position = 0;
- }
- });
- }
-
void _updateScrollPosition() {
SchedulerBinding.instance.addPostFrameCallback((_) {
if (_previousViewKey.currentState == null ||
@@ -5608,7 +5655,6 @@ class _CalendarViewState extends State<_CalendarView>
widget.width,
widget.height,
widget.visibleDates.length,
- _allDayHeight,
widget.isMobilePlatform);
if (widget.view != CalendarView.month) {
_horizontalLinesCount = CalendarViewHelper.getHorizontalLinesCount(
@@ -5678,6 +5724,8 @@ class _CalendarViewState extends State<_CalendarView>
_scrollToPosition();
}
+ widget.getCalendarState(_updateCalendarStateDetails);
+
/// Method called to update all day height, when the view changed from
/// day to week views to avoid the blank space at the bottom of the view.
final bool isCurrentView =
@@ -5691,7 +5739,6 @@ class _CalendarViewState extends State<_CalendarView>
widget.width,
widget.height,
widget.visibleDates.length,
- _allDayHeight,
widget.isMobilePlatform);
/// Clear the all day panel selection when the calendar view changed
@@ -5722,7 +5769,6 @@ class _CalendarViewState extends State<_CalendarView>
/// When view switched from any other view to timeline view, and resource
/// enabled the selection must render the first resource view.
- widget.getCalendarState(_updateCalendarStateDetails);
if (!CalendarViewHelper.isTimelineView(oldWidget.view) &&
_updateCalendarStateDetails.selectedDate != null &&
CalendarViewHelper.isResourceEnabled(
@@ -5904,6 +5950,31 @@ class _CalendarViewState extends State<_CalendarView>
final bool isCurrentView =
_updateCalendarStateDetails.currentViewVisibleDates ==
widget.visibleDates;
+
+ // Check and update the time interval height while the all day panel
+ // appointments updated(all day height is default value) for current view.
+ if (isCurrentView && _updateCalendarStateDetails.allDayPanelHeight != 0) {
+ final bool isDayView = CalendarViewHelper.isDayView(
+ widget.view,
+ widget.calendar.timeSlotViewSettings.numberOfDaysInView,
+ widget.calendar.timeSlotViewSettings.nonWorkingDays,
+ widget.calendar.monthViewSettings.numberOfWeeksInView);
+ final double viewHeaderHeight = CalendarViewHelper.getViewHeaderHeight(
+ widget.calendar.viewHeaderHeight, widget.view);
+ // Default all day height is 0 on week and work week view
+ // Default all day height is view header height on day view.
+ final double defaultAllDayHeight = isDayView ? viewHeaderHeight : 0;
+ if (_allDayHeight == defaultAllDayHeight) {
+ _timeIntervalHeight = _getTimeIntervalHeight(
+ widget.calendar,
+ widget.view,
+ widget.width,
+ widget.height,
+ widget.visibleDates.length,
+ widget.isMobilePlatform);
+ }
+ }
+
_updateAllDayHeight(isCurrentView);
return MouseRegion(
@@ -6120,7 +6191,6 @@ class _CalendarViewState extends State<_CalendarView>
widget.width,
widget.height,
visibleDatesCount,
- _allDayHeight,
widget.isMobilePlatform);
double timeToPosition = 0;
final bool isTimelineView = CalendarViewHelper.isTimelineView(widget.view);
@@ -6646,7 +6716,6 @@ class _CalendarViewState extends State<_CalendarView>
widget.width,
widget.height,
widget.visibleDates.length,
- _allDayHeight,
widget.isMobilePlatform);
final double overAllHeight = _timeIntervalHeight * _horizontalLinesCount!;
@@ -6943,7 +7012,6 @@ class _CalendarViewState extends State<_CalendarView>
widget.width,
widget.height,
widget.visibleDates.length,
- _allDayHeight,
widget.isMobilePlatform);
if (isTimelineView) {
@@ -7249,7 +7317,6 @@ class _CalendarViewState extends State<_CalendarView>
widget.width,
widget.height,
widget.visibleDates.length,
- _allDayHeight,
widget.isMobilePlatform);
final double timeLabelWidth = CalendarViewHelper.getTimeLabelWidth(
@@ -7556,7 +7623,6 @@ class _CalendarViewState extends State<_CalendarView>
widget.width,
widget.height,
widget.visibleDates.length,
- _allDayHeight,
widget.isMobilePlatform);
if (yPosition! <= viewHeaderHeight + allDayPanelHeight &&
@@ -7569,7 +7635,7 @@ class _CalendarViewState extends State<_CalendarView>
if (yPosition != null &&
yPosition! <= viewHeaderHeight + allDayPanelHeight &&
_scrollController!.offset != 0) {
- Future _updateScrollPosition() async {
+ Future updateScrollPosition() async {
double scrollPosition =
_scrollController!.position.pixels - timeIntervalHeight;
if (scrollPosition < 0) {
@@ -7621,14 +7687,14 @@ class _CalendarViewState extends State<_CalendarView>
if (yPosition != null &&
yPosition! <= viewHeaderHeight + allDayPanelHeight &&
_scrollController!.offset != 0) {
- _updateScrollPosition();
+ updateScrollPosition();
} else if (_autoScrollTimer != null) {
_autoScrollTimer!.cancel();
_autoScrollTimer = null;
}
}
- _updateScrollPosition();
+ updateScrollPosition();
} else if (_autoScrollTimer != null) {
_autoScrollTimer!.cancel();
_autoScrollTimer = null;
@@ -7646,7 +7712,7 @@ class _CalendarViewState extends State<_CalendarView>
yPosition! >= widget.height &&
_scrollController!.position.pixels !=
_scrollController!.position.maxScrollExtent) {
- Future _updateScrollPosition() async {
+ Future updateScrollPosition() async {
double scrollPosition =
_scrollController!.position.pixels + timeIntervalHeight;
if (scrollPosition > _scrollController!.position.maxScrollExtent) {
@@ -7700,14 +7766,14 @@ class _CalendarViewState extends State<_CalendarView>
yPosition! >= widget.height &&
_scrollController!.position.pixels !=
_scrollController!.position.maxScrollExtent) {
- _updateScrollPosition();
+ updateScrollPosition();
} else if (_autoScrollTimer != null) {
_autoScrollTimer!.cancel();
_autoScrollTimer = null;
}
}
- _updateScrollPosition();
+ updateScrollPosition();
} else if (_autoScrollTimer != null) {
_autoScrollTimer!.cancel();
_autoScrollTimer = null;
@@ -7747,7 +7813,7 @@ class _CalendarViewState extends State<_CalendarView>
_scrollController!.position.pixels !=
_scrollController!.position.maxScrollExtent) ||
(!_isRTL && _scrollController!.position.pixels != 0))) {
- Future _updateScrollPosition() async {
+ Future updateScrollPosition() async {
double scrollPosition =
_scrollController!.position.pixels - timeIntervalHeight;
if (_isRTL) {
@@ -7804,14 +7870,14 @@ class _CalendarViewState extends State<_CalendarView>
_scrollController!.position.pixels !=
_scrollController!.position.maxScrollExtent) ||
(!_isRTL && _scrollController!.position.pixels != 0))) {
- _updateScrollPosition();
+ updateScrollPosition();
} else if (_autoScrollTimer != null) {
_autoScrollTimer!.cancel();
_autoScrollTimer = null;
}
}
- _updateScrollPosition();
+ updateScrollPosition();
} else if (_autoScrollTimer != null) {
_autoScrollTimer!.cancel();
_autoScrollTimer = null;
@@ -7833,7 +7899,7 @@ class _CalendarViewState extends State<_CalendarView>
_scrollController!.position.pixels !=
_scrollController!.position.maxScrollExtent) ||
(_isRTL && _scrollController!.position.pixels != 0))) {
- Future _updateScrollPosition() async {
+ Future updateScrollPosition() async {
double scrollPosition =
_scrollController!.position.pixels + timeIntervalHeight;
if (_isRTL) {
@@ -7890,14 +7956,14 @@ class _CalendarViewState extends State<_CalendarView>
_scrollController!.position.pixels !=
_scrollController!.position.maxScrollExtent) ||
(_isRTL && _scrollController!.position.pixels != 0))) {
- _updateScrollPosition();
+ updateScrollPosition();
} else if (_autoScrollTimer != null) {
_autoScrollTimer!.cancel();
_autoScrollTimer = null;
}
}
- _updateScrollPosition();
+ updateScrollPosition();
} else if (_autoScrollTimer != null) {
_autoScrollTimer!.cancel();
_autoScrollTimer = null;
@@ -7945,7 +8011,6 @@ class _CalendarViewState extends State<_CalendarView>
widget.width,
widget.height,
widget.visibleDates.length,
- _allDayHeight,
widget.isMobilePlatform);
double minimumTimeIntervalSize = timeIntervalSize / 4;
if (minimumTimeIntervalSize < 20) {
@@ -7986,7 +8051,6 @@ class _CalendarViewState extends State<_CalendarView>
widget.width,
widget.height,
widget.visibleDates.length,
- _allDayHeight,
widget.isMobilePlatform);
double minimumTimeIntervalSize = timeIntervalSize /
(widget.view == CalendarView.timelineMonth ? 2 : 4);
@@ -8063,7 +8127,6 @@ class _CalendarViewState extends State<_CalendarView>
widget.width,
widget.height,
widget.visibleDates.length,
- _allDayHeight,
widget.isMobilePlatform);
late DateTime resizingTime;
CalendarResource? resource;
@@ -9145,8 +9208,15 @@ class _CalendarViewState extends State<_CalendarView>
widget.calendar.onSelectionChanged);
if (canRaiseLongPress || canRaiseTap || canRaiseSelectionChanged) {
- final DateTime selectedDate =
- _getDateFromPosition(xDetails, yDetails - viewHeaderHeight, 0)!;
+ final DateTime? selectedDate =
+ _getDateFromPosition(xDetails, yDetails - viewHeaderHeight, 0);
+
+ /// Restrict the tap/long press callback while interact after
+ /// the timeslots.
+ if (selectedDate == null) {
+ return null;
+ }
+
final int timeInterval = CalendarViewHelper.getTimeInterval(
widget.calendar.timeSlotViewSettings);
if (appointmentView == null) {
@@ -9752,10 +9822,16 @@ class _CalendarViewState extends State<_CalendarView>
yPosition,
timeLabelWidth);
+ /// Restrict the tap/long press callback while interact after
+ /// the timeslots.
+ if (selectedDate == null) {
+ return null;
+ }
+
if (!CalendarViewHelper.isDateTimeWithInDateTimeRange(
widget.calendar.minDate,
widget.calendar.maxDate,
- selectedDate!,
+ selectedDate,
timeInterval)) {
return null;
}
@@ -9848,7 +9924,6 @@ class _CalendarViewState extends State<_CalendarView>
widget.width,
widget.height,
widget.visibleDates.length,
- _allDayHeight,
widget.isMobilePlatform);
final double minuteHeight = timeIntervalSize /
@@ -9935,7 +10010,6 @@ class _CalendarViewState extends State<_CalendarView>
double width,
double height,
int visibleDatesCount,
- double allDayHeight,
bool isMobilePlatform) {
final bool isTimelineView = CalendarViewHelper.isTimelineView(view);
final bool isDayView = CalendarViewHelper.isDayView(
@@ -9955,20 +10029,40 @@ class _CalendarViewState extends State<_CalendarView>
double viewHeaderHeight =
CalendarViewHelper.getViewHeaderHeight(calendar.viewHeaderHeight, view);
+ double allDayViewHeight = 0;
+
+ final bool isCurrentView =
+ _updateCalendarStateDetails.currentViewVisibleDates ==
+ widget.visibleDates;
if (isDayView) {
- allDayHeight = _kAllDayLayoutHeight;
+ if (isCurrentView) {
+ allDayViewHeight = _kAllDayLayoutHeight > viewHeaderHeight &&
+ _updateCalendarStateDetails.allDayPanelHeight > viewHeaderHeight
+ ? _updateCalendarStateDetails.allDayPanelHeight >
+ _kAllDayLayoutHeight
+ ? _kAllDayLayoutHeight
+ : _updateCalendarStateDetails.allDayPanelHeight
+ : viewHeaderHeight;
+ if (allDayViewHeight < _updateCalendarStateDetails.allDayPanelHeight) {
+ allDayViewHeight += kAllDayAppointmentHeight;
+ }
+ } else {
+ allDayViewHeight = viewHeaderHeight;
+ }
+
viewHeaderHeight = 0;
- } else {
- allDayHeight = allDayHeight > _kAllDayLayoutHeight
- ? _kAllDayLayoutHeight
- : allDayHeight;
+ } else if (isCurrentView) {
+ allDayViewHeight =
+ _updateCalendarStateDetails.allDayPanelHeight > _kAllDayLayoutHeight
+ ? _kAllDayLayoutHeight
+ : _updateCalendarStateDetails.allDayPanelHeight;
}
switch (view) {
case CalendarView.day:
case CalendarView.week:
case CalendarView.workWeek:
- timeIntervalHeight = (height - allDayHeight - viewHeaderHeight) /
+ timeIntervalHeight = (height - allDayViewHeight - viewHeaderHeight) /
CalendarViewHelper.getHorizontalLinesCount(
calendar.timeSlotViewSettings, view);
break;
diff --git a/packages/syncfusion_flutter_calendar/pubspec.yaml b/packages/syncfusion_flutter_calendar/pubspec.yaml
index 78973ea81..dff67baca 100644
--- a/packages/syncfusion_flutter_calendar/pubspec.yaml
+++ b/packages/syncfusion_flutter_calendar/pubspec.yaml
@@ -1,18 +1,28 @@
name: syncfusion_flutter_calendar
description: The Flutter Calendar widget has nine built-in configurable views that provide basic functionalities for scheduling and representing appointments/events efficiently.
-version: 20.2.36
+version: 18.3.35
homepage: https://github.com/syncfusion/flutter-examples
environment:
- sdk: '>=2.12.0 <3.0.0'
+ sdk: '>=2.17.0 <3.0.0'
dependencies:
flutter:
sdk: flutter
- timezone: 0.8.0
- syncfusion_flutter_core: ^20.2.36
+ timezone: 0.9.0
+ syncfusion_flutter_core:
+ git:
+ url: https://SyncfusionBuild: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@github.com/essential-studio/flutter-core
+ path: syncfusion_flutter_core
+ branch: release/20.4.0.1
+ ref: release/20.4.0.1
- syncfusion_flutter_datepicker: ^20.2.36
+ syncfusion_flutter_datepicker:
+ git:
+ url: https://SyncfusionBuild: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@github.com/essential-studio/flutter-datepicker
+ path: flutter_datepicker/syncfusion_flutter_datepicker
+ branch: release/20.4.0.1
+ ref: release/20.4.0.1
intl: ">=0.15.0 <0.20.0"
@@ -22,4 +32,4 @@ dev_dependencies:
flutter:
assets:
- - packages/timezone/data/2020a.tzf
+ - packages/timezone/data/latest_all.tzf
diff --git a/packages/syncfusion_flutter_charts/CHANGELOG.md b/packages/syncfusion_flutter_charts/CHANGELOG.md
index e474d2db5..0ab9f8a3b 100644
--- a/packages/syncfusion_flutter_charts/CHANGELOG.md
+++ b/packages/syncfusion_flutter_charts/CHANGELOG.md
@@ -1,5 +1,74 @@
## Unreleased
+**Bugs**
+
+* #FB37705 - Now, the circular data label builder will render properly with connector lines.
+
+## [20.3.69] - 12/06/2022
+
+**Bugs**
+* #FB39502 - Now, the series is rendered with both the [primaryXAxis](https://pub.dev/documentation/syncfusion_flutter_charts/latest/charts/SfCartesianChart/primaryXAxis.html) and [primaryYAxis](https://pub.dev/documentation/syncfusion_flutter_charts/latest/charts/SfCartesianChart/primaryYAxis.html) as [LogarithmicAxis](https://pub.dev/documentation/syncfusion_flutter_charts/latest/charts/LogarithmicAxis-class.html).
+* #FB39157 - Now, the [onPointTap](https://pub.dev/documentation/syncfusion_flutter_charts/latest/charts/CartesianSeries/onPointTap.html) event returns the respective data point index while having the nearest x values.
+
+## [20.3.59] - 11/29/2022
+
+**Bugs**
+* #FB37704 - Now, the fast line series will render the line when the data points are outside of the range controller's.
+
+## [20.3.57] - 11/15/2022
+
+**Bugs**
+* #FB38884 - The null exception will no longer be thrown in the chart while dynamically enabling the [isVisibleInLegend](https://pub.dev/documentation/syncfusion_flutter_charts/latest/charts/CartesianSeries/isVisibleInLegend.html) property for the series.
+
+## [20.3.56] - 11/08/2022
+
+**Bugs**
+* #FB37724 - Now, the Null check operator exception will no longer be thrown when refreshing the chart in the [onLegendTapped](https://pub.dev/documentation/syncfusion_flutter_charts/latest/charts/SfCartesianChart/onLegendTapped.html) callback.
+* #FB38586 - Now, the plot band will render properly for the [LogarithmicAxis](https://pub.dev/documentation/syncfusion_flutter_charts/latest/charts/LogarithmicAxis-class.html).
+
+## [20.3.52] - 10/26/2022
+
+**Bugs**
+* #FB38235 - The Null exception will no longer be thrown in trackball when using the RangeAreaSeries and AreaSeries with different data sources.
+
+## [20.3.50] - 10/18/2022
+
+**Bugs**
+* #FB37724 - Now, the series visibility gets toggled properly when setting the series visibility using the [onLegendTapped](https://pub.dev/documentation/syncfusion_flutter_charts/latest/charts/SfCartesianChart/onLegendTapped.html) callback.
+* #FB37885 - Now, the candle series gets rendered properly when it starts updating data dynamically with a single data point.
+* #FB38196 - Now, there is no exception that occurs while calling the trackball public method [show](https://pub.dev/documentation/syncfusion_flutter_charts/latest/charts/TrackballBehavior/show.html) when there is no visible series in the chart.
+* #FB38080 - Now, the trackball tooltip with builder will activate properly when using the [show](https://pub.dev/documentation/syncfusion_flutter_charts/latest/charts/TrackballBehavior/show.html) public method if the trackball is already moved in the chart using user interaction.
+* #FB38046 - Now, the doughnut series with stroke border renders properly with CornerStyle as both sided curve.
+* #FB37274 - Now, Infinity or NaN toInt exception will no longer be thrown when rendering Bollinger band with mapping more number identical close point values.
+
+## [20.3.49] - 10/11/2022
+
+**Bugs**
+* #FB36732 - Now, while performing zooming and panning, the hidden series won't become visible.
+
+## [20.3.47] - 09/29/2022
+
+**Bugs**
+* #FB37559 - Now, the `NoSuchMethodError` exception will not be thrown when a tooltip is activated using the `showByIndex` method in circular charts.
+* #FB37311 - The FastLineSeries renders when all the y-values are the same.
+* #FB36534 – Now, the pie series will explode immediately.
+* #FB37039 - When panning the X-axis with `zoomMode` as `ZoomMode.X`, the Y-axis range does not change.
+* #I392604, G821 - Now, the candle series width will not decrease when having the MACD indicator.
+* #I373783 - Now, the hollow candle will not throw an exception when setting the visible range.
+
+## [20.2.44] - 08/16/2022
+
+**Bugs**
+* Now, the 'size should not be infinite' assertion failed exception will not be thrown when having the SVG image as an annotation at the start and end point in the chart.
+
+## [20.2.43] - 08/08/2022
+
+**Bugs**
+* Now, the startup animation will work for circular, funnel, and pyramid charts when having the [legendItemBuilder](https://pub.dev/documentation/syncfusion_flutter_charts/latest/charts/Legend/legendItemBuilder.html) in legend.
+* Now, the tooltip will display the correct value when using the logarithmic axis.
+
+## [20.2.36] - 07/01/2022
+
**Features**
* Provided the support to customize the date-time axis labels based on the interval type.
diff --git a/packages/syncfusion_flutter_charts/README.md b/packages/syncfusion_flutter_charts/README.md
index 5e1745d98..824caf187 100644
--- a/packages/syncfusion_flutter_charts/README.md
+++ b/packages/syncfusion_flutter_charts/README.md
@@ -84,15 +84,12 @@ Explore the full capabilities of our Flutter widgets on your device by installin
-
-
+
+
-
-
-
@@ -320,7 +317,7 @@ Widget build(BuildContext context) {
## Support and Feedback
-* For any other queries, reach our [Syncfusion support team](https://www.syncfusion.com/support/directtrac/incidents/newincident?utm_source=pubdev&utm_medium=listing&utm_campaign=flutter-charts-pubdev) or post the queries through the [Community forums](https://www.syncfusion.com/forums?utm_source=pubdev&utm_medium=listing&utm_campaign=flutter-charts-pubdev) and submit a feature request or a bug through our [Feedback portal](https://www.syncfusion.com/feedback/flutter?utm_source=pubdev&utm_medium=listing&utm_campaign=flutter-charts-pubdev).
+* For any other queries, reach our [Syncfusion support team](https://support.syncfusion.com/support/tickets/create?utm_source=pubdev&utm_medium=listing&utm_campaign=flutter-charts-pubdev) or post the queries through the [Community forums](https://www.syncfusion.com/forums?utm_source=pubdev&utm_medium=listing&utm_campaign=flutter-charts-pubdev) and submit a feature request or a bug through our [Feedback portal](https://www.syncfusion.com/feedback/flutter?utm_source=pubdev&utm_medium=listing&utm_campaign=flutter-charts-pubdev).
* To renew the subscription, click [renew](https://www.syncfusion.com/sales/products?utm_source=pubdev&utm_medium=listing&utm_campaign=flutter-charts-pubdev) or contact our sales team at salessupport@syncfusion.com | Toll Free: 1-888-9 DOTNET.
## About Syncfusion Flutter Widgets
@@ -330,4 +327,4 @@ The Syncfusion's [Flutter library](https://www.syncfusion.com/flutter-widgets?ut
Founded in 2001 and headquartered in Research Triangle Park, N.C., Syncfusion has more than 20,000 customers and more than 1 million users, including large financial institutions, Fortune 500 companies, and global IT consultancies.
-Today we provide 1,000+ controls and frameworks for web ([ASP.NET Core](https://www.syncfusion.com/aspnet-core-ui-controls?utm_source=pubdev&utm_medium=listing&utm_campaign=flutter-charts-pubdev), [ASP.NET MVC](https://www.syncfusion.com/aspnet-mvc-ui-controls?utm_source=pubdev&utm_medium=listing&utm_campaign=flutter-charts-pubdev), [ASP.NET WebForms](https://www.syncfusion.com/jquery/aspnet-web-forms-ui-controls?utm_source=pubdev&utm_medium=listing&utm_campaign=flutter-charts-pubdev), [JavaScript](https://www.syncfusion.com/javascript-ui-controls?utm_source=pubdev&utm_medium=listing&utm_campaign=flutter-charts-pubdev), [Angular](https://www.syncfusion.com/angular-ui-components?utm_source=pubdev&utm_medium=listing&utm_campaign=flutter-charts-pubdev), [React](https://www.syncfusion.com/react-ui-components?utm_source=pubdev&utm_medium=listing&utm_campaign=flutter-charts-pubdev), [Vue](https://www.syncfusion.com/vue-ui-components?utm_source=pubdev&utm_medium=listing&utm_campaign=flutter-charts-pubdev), and [Blazor](https://www.syncfusion.com/blazor-components?utm_source=pubdev&utm_medium=listing&utm_campaign=flutter-charts-pubdev), mobile ([Xamarin](https://www.syncfusion.com/xamarin-ui-controls?utm_source=pubdev&utm_medium=listing&utm_campaign=flutter-charts-pubdev), [Flutter](https://www.syncfusion.com/flutter-widgets?utm_source=pubdev&utm_medium=listing&utm_campaign=flutter-charts-pubdev), [UWP](https://www.syncfusion.com/uwp-ui-controls?utm_source=pubdev&utm_medium=listing&utm_campaign=flutter-charts-pubdev), and [JavaScript](https://www.syncfusion.com/javascript-ui-controls?utm_source=pubdev&utm_medium=listing&utm_campaign=flutter-charts-pubdev)), and desktop development ([WinForms](https://www.syncfusion.com/winforms-ui-controls?utm_source=pubdev&utm_medium=listing&utm_campaign=flutter-charts-pubdev), [WPF](https://www.syncfusion.com/wpf-ui-controls?utm_source=pubdev&utm_medium=listing&utm_campaign=flutter-charts-pubdev), [UWP](https://www.syncfusion.com/uwp-ui-controls?utm_source=pubdev&utm_medium=listing&utm_campaign=flutter-charts-pubdev) and [WinUI](https://www.syncfusion.com/winui-controls?utm_source=pubdev&utm_medium=listing&utm_campaign=flutter-charts-pubdev)). We provide ready-to deploy enterprise software for dashboards, reports, data integration, and big data processing. Many customers have saved millions in licensing fees by deploying our software.
\ No newline at end of file
+Today we provide 1,000+ controls and frameworks for web ([ASP.NET Core](https://www.syncfusion.com/aspnet-core-ui-controls?utm_source=pubdev&utm_medium=listing&utm_campaign=flutter-charts-pubdev), [ASP.NET MVC](https://www.syncfusion.com/aspnet-mvc-ui-controls?utm_source=pubdev&utm_medium=listing&utm_campaign=flutter-charts-pubdev), [ASP.NET WebForms](https://www.syncfusion.com/jquery/aspnet-web-forms-ui-controls?utm_source=pubdev&utm_medium=listing&utm_campaign=flutter-charts-pubdev), [JavaScript](https://www.syncfusion.com/javascript-ui-controls?utm_source=pubdev&utm_medium=listing&utm_campaign=flutter-charts-pubdev), [Angular](https://www.syncfusion.com/angular-ui-components?utm_source=pubdev&utm_medium=listing&utm_campaign=flutter-charts-pubdev), [React](https://www.syncfusion.com/react-ui-components?utm_source=pubdev&utm_medium=listing&utm_campaign=flutter-charts-pubdev), [Vue](https://www.syncfusion.com/vue-ui-components?utm_source=pubdev&utm_medium=listing&utm_campaign=flutter-charts-pubdev), [Flutter](https://www.syncfusion.com/flutter-widgets), and [Blazor](https://www.syncfusion.com/blazor-components?utm_source=pubdev&utm_medium=listing&utm_campaign=flutter-charts-pubdev)), mobile ([.NET MAUI](https://www.syncfusion.com/maui-controls?utm_source=pubdev&utm_medium=listing&utm_campaign=flutter-charts-pubdev), [Xamarin](https://www.syncfusion.com/xamarin-ui-controls?utm_source=pubdev&utm_medium=listing&utm_campaign=flutter-charts-pubdev), [Flutter](https://www.syncfusion.com/flutter-widgets?utm_source=pubdev&utm_medium=listing&utm_campaign=flutter-charts-pubdev), [UWP](https://www.syncfusion.com/uwp-ui-controls?utm_source=pubdev&utm_medium=listing&utm_campaign=flutter-charts-pubdev), and [JavaScript](https://www.syncfusion.com/javascript-ui-controls?utm_source=pubdev&utm_medium=listing&utm_campaign=flutter-charts-pubdev)), and desktop development ([.NET MAUI](https://www.syncfusion.com/maui-controls?utm_source=pubdev&utm_medium=listing&utm_campaign=flutter-charts-pubdev), [Flutter](https://www.syncfusion.com/flutter-widgets), [WinForms](https://www.syncfusion.com/winforms-ui-controls?utm_source=pubdev&utm_medium=listing&utm_campaign=flutter-charts-pubdev), [WPF](https://www.syncfusion.com/wpf-ui-controls?utm_source=pubdev&utm_medium=listing&utm_campaign=flutter-charts-pubdev), [UWP](https://www.syncfusion.com/uwp-ui-controls?utm_source=pubdev&utm_medium=listing&utm_campaign=flutter-charts-pubdev), and [WinUI](https://www.syncfusion.com/winui-controls?utm_source=pubdev&utm_medium=listing&utm_campaign=flutter-charts-pubdev)). We provide ready-to deploy enterprise software for dashboards, reports, data integration, and big data processing. Many customers have saved millions in licensing fees by deploying our software.
\ No newline at end of file
diff --git a/packages/syncfusion_flutter_charts/example/pubspec.lock b/packages/syncfusion_flutter_charts/example/pubspec.lock
index 5e0a8a337..e6b836f57 100644
--- a/packages/syncfusion_flutter_charts/example/pubspec.lock
+++ b/packages/syncfusion_flutter_charts/example/pubspec.lock
@@ -1,13 +1,27 @@
# Generated by pub
# See https://dart.dev/tools/pub/glossary#lockfile
packages:
+ async:
+ dependency: transitive
+ description:
+ name: async
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "2.9.0"
+ boolean_selector:
+ dependency: transitive
+ description:
+ name: boolean_selector
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "2.1.0"
characters:
dependency: transitive
description:
name: characters
url: "https://pub.dartlang.org"
source: hosted
- version: "1.2.0"
+ version: "1.2.1"
clock:
dependency: transitive
description:
@@ -29,11 +43,23 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.5"
+ fake_async:
+ dependency: transitive
+ description:
+ name: fake_async
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "1.3.1"
flutter:
dependency: "direct main"
description: flutter
source: sdk
version: "0.0.0"
+ flutter_test:
+ dependency: "direct dev"
+ description: flutter
+ source: sdk
+ version: "0.0.0"
intl:
dependency: transitive
description:
@@ -41,20 +67,27 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "0.17.0"
+ matcher:
+ dependency: transitive
+ description:
+ name: matcher
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "0.12.12"
material_color_utilities:
dependency: transitive
description:
name: material_color_utilities
url: "https://pub.dartlang.org"
source: hosted
- version: "0.1.4"
+ version: "0.1.5"
meta:
dependency: transitive
description:
name: meta
url: "https://pub.dartlang.org"
source: hosted
- version: "1.7.0"
+ version: "1.8.0"
path:
dependency: transitive
description:
@@ -67,6 +100,34 @@ packages:
description: flutter
source: sdk
version: "0.0.99"
+ source_span:
+ dependency: transitive
+ description:
+ name: source_span
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "1.9.0"
+ stack_trace:
+ dependency: transitive
+ description:
+ name: stack_trace
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "1.10.0"
+ stream_channel:
+ dependency: transitive
+ description:
+ name: stream_channel
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "2.1.0"
+ string_scanner:
+ dependency: transitive
+ description:
+ name: string_scanner
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "1.1.1"
syncfusion_flutter_charts:
dependency: "direct main"
description:
@@ -78,11 +139,25 @@ packages:
dependency: transitive
description:
path: syncfusion_flutter_core
- ref: "release/20.2.0.1"
- resolved-ref: c663ccc1422d1fc2dc15aeba68d1b37f22207444
- url: "https://SyncfusionBuild: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@github.com/essential-studio/flutter-core"
+ ref: "release/20.4.0.1"
+ resolved-ref: "11256e0c8e32c9a4aaaea91c8c0921a728edd229"
+ url: "https://SyncfusionBuild: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@github.com/essential-studio/flutter-core"
source: git
- version: "18.3.40"
+ version: "20.2.36"
+ term_glyph:
+ dependency: transitive
+ description:
+ name: term_glyph
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "1.2.1"
+ test_api:
+ dependency: transitive
+ description:
+ name: test_api
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "0.4.12"
vector_math:
dependency: transitive
description:
@@ -91,4 +166,4 @@ packages:
source: hosted
version: "2.1.2"
sdks:
- dart: ">=2.14.0 <3.0.0"
+ dart: ">=2.17.0 <3.0.0"
diff --git a/packages/syncfusion_flutter_charts/example/pubspec.yaml b/packages/syncfusion_flutter_charts/example/pubspec.yaml
index 3679c0b64..29cba666c 100644
--- a/packages/syncfusion_flutter_charts/example/pubspec.yaml
+++ b/packages/syncfusion_flutter_charts/example/pubspec.yaml
@@ -4,7 +4,7 @@ version: 1.0.0+1
publish_to: 'none'
environment:
- sdk: ">=2.12.0 <3.0.0"
+ sdk: ">=2.17.0 <3.0.0"
dependencies:
flutter:
@@ -13,6 +13,9 @@ dependencies:
path: ../
cupertino_icons: ^1.0.2
-flutter:
+dev_dependencies:
+ flutter_test:
+ sdk: flutter
+flutter:
uses-material-design: true
diff --git a/packages/syncfusion_flutter_charts/lib/src/chart/annotation/annotation_settings.dart b/packages/syncfusion_flutter_charts/lib/src/chart/annotation/annotation_settings.dart
index 7befebd27..96dffafdb 100644
--- a/packages/syncfusion_flutter_charts/lib/src/chart/annotation/annotation_settings.dart
+++ b/packages/syncfusion_flutter_charts/lib/src/chart/annotation/annotation_settings.dart
@@ -247,7 +247,7 @@ class CartesianChartAnnotation {
/// child: const Text('Annotation')),
/// x: 3,
/// y: 60,
- /// verticalAllignment: ChartAlignment.near
+ /// verticalAlignment: ChartAlignment.near
/// )
/// ],
/// )
@@ -290,6 +290,6 @@ class CartesianChartAnnotation {
xAxisName,
yAxisName
];
- return hashList(values);
+ return Object.hashAll(values);
}
}
diff --git a/packages/syncfusion_flutter_charts/lib/src/chart/axis/axis.dart b/packages/syncfusion_flutter_charts/lib/src/chart/axis/axis.dart
index 45e458fc7..6ed375f72 100644
--- a/packages/syncfusion_flutter_charts/lib/src/chart/axis/axis.dart
+++ b/packages/syncfusion_flutter_charts/lib/src/chart/axis/axis.dart
@@ -1127,7 +1127,7 @@ class AxisLabel {
renderText,
value
];
- return hashList(values);
+ return Object.hashAll(values);
}
List? _labelCollection;
@@ -1227,7 +1227,7 @@ class MajorTickLines {
@override
int get hashCode {
final List