Skip to content

Commit 14c653b

Browse files
Anthony GordonAnthony Gordon
authored andcommitted
feat: release v7.16.0
1 parent 5b6522f commit 14c653b

7 files changed

Lines changed: 223 additions & 24 deletions

File tree

example/pubspec.lock

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@ packages:
55
dependency: transitive
66
description:
77
name: app_badge_plus
8-
sha256: ce3d8fdfcf39a1552cc8dea499ee3b4a86273ccf04c8de29e7960c739b045ae6
8+
sha256: "81130fe6150ce2a1f12af4bb7d6f646496d284d5f87f2c121af8258a453bbb3f"
99
url: "https://pub.dev"
1010
source: hosted
11-
version: "1.2.7"
11+
version: "1.2.8"
1212
args:
1313
dependency: transitive
1414
description:
@@ -85,10 +85,10 @@ packages:
8585
dependency: transitive
8686
description:
8787
name: connectivity_plus
88-
sha256: b8fe52979ff12432ecf8f0abf6ff70410b1bb734be1c9e4f2f86807ad7166c79
88+
sha256: "62ffa266d9a23b79fb3fcbc206afc00bb979417ba57b1324c546b5aab95ba057"
8989
url: "https://pub.dev"
9090
source: hosted
91-
version: "7.1.0"
91+
version: "7.1.1"
9292
connectivity_plus_platform_interface:
9393
dependency: transitive
9494
description:
@@ -373,6 +373,22 @@ packages:
373373
url: "https://pub.dev"
374374
source: hosted
375375
version: "0.20.2"
376+
jni:
377+
dependency: transitive
378+
description:
379+
name: jni
380+
sha256: c2230682d5bc2362c1c9e8d3c7f406d9cbba23ab3f2e203a025dd47e0fb2e68f
381+
url: "https://pub.dev"
382+
source: hosted
383+
version: "1.0.0"
384+
jni_flutter:
385+
dependency: transitive
386+
description:
387+
name: jni_flutter
388+
sha256: "8b59e590786050b1cd866677dddaf76b1ade5e7bc751abe04b86e84d379d3ba6"
389+
url: "https://pub.dev"
390+
source: hosted
391+
version: "1.0.1"
376392
leak_tracker:
377393
dependency: transitive
378394
description:
@@ -467,7 +483,7 @@ packages:
467483
path: ".."
468484
relative: true
469485
source: path
470-
version: "7.14.1"
486+
version: "7.15.0"
471487
objective_c:
472488
dependency: transitive
473489
description:
@@ -476,6 +492,14 @@ packages:
476492
url: "https://pub.dev"
477493
source: hosted
478494
version: "9.3.0"
495+
package_config:
496+
dependency: transitive
497+
description:
498+
name: package_config
499+
sha256: f096c55ebb7deb7e384101542bfba8c52696c1b56fca2eb62827989ef2353bbc
500+
url: "https://pub.dev"
501+
source: hosted
502+
version: "2.2.0"
479503
path:
480504
dependency: transitive
481505
description:
@@ -496,10 +520,10 @@ packages:
496520
dependency: transitive
497521
description:
498522
name: path_provider_android
499-
sha256: "149441ca6e4f38193b2e004c0ca6376a3d11f51fa5a77552d8bd4d2b0c0912ba"
523+
sha256: "69cbd515a62b94d32a7944f086b2f82b4ac40a1d45bebfc00813a430ab2dabcd"
500524
url: "https://pub.dev"
501525
source: hosted
502-
version: "2.2.23"
526+
version: "2.3.1"
503527
path_provider_foundation:
504528
dependency: transitive
505529
description:

lib/widgets/src/collection_view.dart

Lines changed: 85 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -448,12 +448,20 @@ class CollectionView<T> extends StatefulWidget {
448448
paginatedData = data,
449449
this.data = null;
450450

451+
/// Returns a [CollectionViewStateActions] instance for the given [stateName].
452+
static CollectionViewStateActions stateActions(String stateName) =>
453+
CollectionViewStateActions(stateName);
454+
451455
/// Resets the state.
456+
@Deprecated('Use CollectionView.stateActions(stateName).reset() instead')
452457
static void stateReset(String stateName) {
453458
updateState(stateName, data: {"action": "reset", "data": {}});
454459
}
455460

456461
/// Removes an item from the list at the given index.
462+
@Deprecated(
463+
'Use CollectionView.stateActions(stateName).removeFromIndex(index) instead',
464+
)
457465
static void removeFromIndex(String stateName, int index) {
458466
updateState(
459467
stateName,
@@ -465,17 +473,60 @@ class CollectionView<T> extends StatefulWidget {
465473
}
466474
}
467475

476+
/// State actions for [CollectionView].
477+
///
478+
/// Example usage:
479+
/// ```dart
480+
/// CollectionView.stateActions("my_list").reset();
481+
/// CollectionView.stateActions("my_list").addItem(newItem);
482+
/// CollectionView.stateActions("my_list").removeFromIndex(2);
483+
/// ```
484+
class CollectionViewStateActions extends StateActions {
485+
CollectionViewStateActions(super.state);
486+
487+
/// Resets the CollectionView, clearing data and re-fetching.
488+
void reset() {
489+
action("reset");
490+
}
491+
492+
/// Removes the item at [index] from the list.
493+
void removeFromIndex(int index) {
494+
action("removeFromIndex", data: {"index": index});
495+
}
496+
497+
/// Re-fetches data from the data callback.
498+
void refreshData() {
499+
action("refreshData");
500+
}
501+
502+
/// Appends [item] to the end of the list.
503+
void addItem(dynamic item) {
504+
action("addItem", data: {"item": item});
505+
}
506+
507+
/// Inserts [item] at [index] in the list.
508+
void insertItem(int index, dynamic item) {
509+
action("insertItem", data: {"index": index, "item": item});
510+
}
511+
512+
/// Replaces the item at [index] with [item].
513+
void updateItemAtIndex(int index, dynamic item) {
514+
action("updateItemAtIndex", data: {"index": index, "item": item});
515+
}
516+
}
517+
468518
class _CollectionViewState<T> extends NyState<CollectionView<T>> {
469519
List<T> _data = [];
520+
bool _syncDataInitialized = false;
470521
int _iteration = 1;
471522
final RefreshController _refreshController = RefreshController(
472523
initialRefresh: false,
473524
);
474525

475526
@override
476527
void initState() {
477-
super.initState();
478528
stateName = widget.stateName;
529+
super.initState();
479530
}
480531

481532
@override
@@ -487,6 +538,7 @@ class _CollectionViewState<T> extends NyState<CollectionView<T>> {
487538
@override
488539
get init => () {
489540
_iteration = 1;
541+
_syncDataInitialized = false;
490542

491543
if (widget.isPullable) {
492544
// Pullable mode - use paginatedData
@@ -562,6 +614,34 @@ class _CollectionViewState<T> extends NyState<CollectionView<T>> {
562614
_data.removeAt(index);
563615
setState(() {});
564616
},
617+
'refreshData': (_) async {
618+
_data = [];
619+
await reboot();
620+
},
621+
'addItem': (data) {
622+
if (data is! Map || !data.containsKey('item')) return;
623+
_data.add(data['item']);
624+
setState(() {});
625+
},
626+
'insertItem': (data) {
627+
if (data is! Map ||
628+
!data.containsKey('index') ||
629+
!data.containsKey('item'))
630+
return;
631+
int index = (data['index'] as int).clamp(0, _data.length);
632+
_data.insert(index, data['item']);
633+
setState(() {});
634+
},
635+
'updateItemAtIndex': (data) {
636+
if (data is! Map ||
637+
!data.containsKey('index') ||
638+
!data.containsKey('item'))
639+
return;
640+
int index = data['index'];
641+
if (index < 0 || index >= _data.length) return;
642+
_data[index] = data['item'];
643+
setState(() {});
644+
},
565645
};
566646

567647
/// Refresh the list (for pullable mode)
@@ -720,7 +800,10 @@ class _CollectionViewState<T> extends NyState<CollectionView<T>> {
720800
/// Build regular (non-pullable) view
721801
Widget _buildRegularView(Widget loadingWidget) {
722802
if (widget.data is! Future Function()) {
723-
_data = widget.data!() ?? [];
803+
if (!_syncDataInitialized) {
804+
_data = widget.data!() ?? [];
805+
_syncDataInitialized = true;
806+
}
724807
if (_data.isEmpty) {
725808
return _buildEmptyWidget();
726809
}

lib/widgets/src/input_field.dart

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1023,11 +1023,33 @@ class InputField extends StatefulWidget {
10231023
TextFieldStateActions(stateName);
10241024
}
10251025

1026-
/// Provides state management actions for [InputField] widgets.
1026+
/// State actions for [InputField].
10271027
///
1028-
/// Extends [FormStateActions] to provide text field-specific operations.
1028+
/// Example usage:
1029+
/// ```dart
1030+
/// InputField.stateActions("my_field").clear();
1031+
/// InputField.stateActions("my_field").setValue("Hello");
1032+
/// InputField.stateActions("my_field").focus();
1033+
/// InputField.stateActions("my_field").unfocus();
1034+
/// InputField.stateActions("my_field").toggleObscure();
1035+
/// ```
10291036
class TextFieldStateActions extends FormStateActions {
10301037
TextFieldStateActions(super.state);
1038+
1039+
/// Request focus on the text field.
1040+
void focus() {
1041+
action("focus");
1042+
}
1043+
1044+
/// Remove focus from the text field.
1045+
void unfocus() {
1046+
action("unfocus");
1047+
}
1048+
1049+
/// Toggle password visibility.
1050+
void toggleObscure() {
1051+
action("toggleObscure");
1052+
}
10311053
}
10321054

10331055
class _InputFieldState extends NyState<InputField> {
@@ -1063,6 +1085,15 @@ class _InputFieldState extends NyState<InputField> {
10631085
widget.controller.text = text;
10641086
setState(() {});
10651087
},
1088+
"focus": (_) {
1089+
_focus.requestFocus();
1090+
},
1091+
"unfocus": (_) {
1092+
_focus.unfocus();
1093+
},
1094+
"toggleObscure": (_) {
1095+
_toggleObscured();
1096+
},
10661097
};
10671098

10681099
@override

lib/widgets/src/language_switcher.dart

Lines changed: 40 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,10 @@ class LanguageSwitcher extends StatefulWidget {
206206

207207
static String state = "ny_lang_switcher";
208208

209+
/// Returns a [LanguageSwitcherStateActions] instance for the given [stateName].
210+
static LanguageSwitcherStateActions stateActions([String? stateName]) =>
211+
LanguageSwitcherStateActions(stateName ?? state);
212+
209213
/// Get the current language
210214
static Future<Map<String, dynamic>?> currentLanguage({String? key}) async {
211215
key ??= state;
@@ -492,10 +496,7 @@ class LanguageSwitcher extends StatefulWidget {
492496
// store the language
493497
await storeLanguage(object: {data.key: data.value});
494498

495-
updateState(
496-
state,
497-
data: {"action": "refresh-page", "data": {}},
498-
);
499+
LanguageSwitcher.stateActions().refresh();
499500
if (!isSelected) {
500501
onLanguageChange?.call(data.key);
501502
}
@@ -1126,6 +1127,27 @@ class LanguageSwitcher extends StatefulWidget {
11261127
createState() => _LanguageSwitcherState();
11271128
}
11281129

1130+
/// State actions for [LanguageSwitcher].
1131+
///
1132+
/// Example usage:
1133+
/// ```dart
1134+
/// LanguageSwitcher.stateActions().refresh();
1135+
/// LanguageSwitcher.stateActions().setLanguage("es");
1136+
/// ```
1137+
class LanguageSwitcherStateActions extends StateActions {
1138+
LanguageSwitcherStateActions(super.state);
1139+
1140+
/// Refresh the language switcher, re-fetching the language list.
1141+
void refresh() {
1142+
action("refresh");
1143+
}
1144+
1145+
/// Programmatically set the language by locale code.
1146+
void setLanguage(String localeCode) {
1147+
action("setLanguage", data: {"localeCode": localeCode});
1148+
}
1149+
}
1150+
11291151
class _LanguageSwitcherState extends NyState<LanguageSwitcher> {
11301152
Map<String, dynamic>? selectedLanguage;
11311153
List<Map<String, String>> languages = [];
@@ -1135,6 +1157,20 @@ class _LanguageSwitcherState extends NyState<LanguageSwitcher> {
11351157
stateName = LanguageSwitcher.state;
11361158
}
11371159

1160+
@override
1161+
Map<String, Function> get stateActions => {
1162+
'refresh': (_) async {
1163+
languages = await LanguageSwitcher.getLanguageList();
1164+
selectedLanguage = await LanguageSwitcher.currentLanguage();
1165+
setState(() {});
1166+
},
1167+
'setLanguage': (data) async {
1168+
if (data is! Map || !data.containsKey('localeCode')) return;
1169+
String localeCode = data['localeCode'];
1170+
await _onChange(localeCode);
1171+
},
1172+
};
1173+
11381174
@override
11391175
get init => () async {
11401176
languages = await LanguageSwitcher.getLanguageList();

lib/widgets/src/ny_page.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ abstract class NyPage<T extends StatefulWidget> extends NyBaseState<T>
4242
if (stateName?.contains("Closure: _") ?? false) {
4343
stateName = stateName?.replaceAll("Closure: _", "Closure: () => _");
4444
}
45+
(widget as NyStatefulWidget).controller.state = stateName;
4546
}
4647

4748
if (stateManaged && allowStateUpdates) {

0 commit comments

Comments
 (0)