From 211f3968a312a2e7da2044f33ef9f161f942a860 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 11 Nov 2026 10:41:10 +0000 Subject: [PATCH 1/9] chore(deps): update Flutter to 3.47.9 and the dependencies Flutter 3.47.9 (Dart 3.13.7) and the latest versions of the pub dependencies, with the code changes they need. The Android build fails with a recent JDK, and this is the first step of its fix: the Gradle and Android Gradle Plugin updates come in their own commit. Five packages are kept on their previous versions, because their latest versions depend on material_ui, the Material library that Flutter 3.47 moved out of the framework. Their types no longer match the ones of package:flutter/material.dart that the app imports: - dynamic_color 1.9.0 (2.x needs material_ui) - fleather >=1.27.0 <1.28.0 - flutter_expandable_fab 2.5.2 (3.x needs material_ui) - flutter_riverpod >=3.4.3 <3.5.0 (3.5.x needs material_ui) - go_router 17.5.0 (18.x needs material_ui) Migrating the app to material_ui is a separate change. The major updates are: equatable 3, dart_helper_utils 7, saf_stream 4, saf_util 3, flutter_secure_storage 11, go_router 18 (kept at 17, see above). riverpod_lint is run as an analyzer plugin, in place of the legacy custom_lint. Refs #591 Co-Authored-By: Claude --- .fvmrc | 2 +- analysis_options.yaml | 7 +- pubspec.lock | 444 ++++++++++++++++++++++-------------------- pubspec.yaml | 76 ++++---- 4 files changed, 278 insertions(+), 251 deletions(-) diff --git a/.fvmrc b/.fvmrc index 457360f8..4304de27 100644 --- a/.fvmrc +++ b/.fvmrc @@ -1,3 +1,3 @@ { - "flutter": "3.44.0" + "flutter": "3.47.9" } \ No newline at end of file diff --git a/analysis_options.yaml b/analysis_options.yaml index bd10cb87..b8e11e1b 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -1,13 +1,16 @@ include: package:flutter_lints/flutter.yaml +plugins: + riverpod_lint: ^3.1.9 + formatter: page_width: 120 analyzer: exclude: - '**.g.dart' - plugins: - - custom_lint + - build/** + - android/** language: strict-inference: true diff --git a/pubspec.lock b/pubspec.lock index 2bf295f7..ec954f5a 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,10 +5,10 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - sha256: "5b7468c326d2f8a4f630056404ca0d291ade42918f4a3c6233618e724f39da8e" + sha256: "1b0e6a07425a3e460666e88bf1c949ccc7bb0116ad562ce94a1eca60fe820725" url: "https://pub.dev" source: hosted - version: "92.0.0" + version: "103.0.0" after_layout: dependency: "direct main" description: @@ -21,34 +21,34 @@ packages: dependency: transitive description: name: analysis_server_plugin - sha256: "44adba4d74a2541173bad4c11531d2a4d22810c29c5ddb458a38e9f4d0e5eac7" + sha256: c58b2a05b260a023eefd0848496ff6b113a318c6c95dad4215165a4bd54ae600 url: "https://pub.dev" source: hosted - version: "0.3.4" + version: "0.3.18" analyzer: dependency: transitive description: name: analyzer - sha256: "70e4b1ef8003c64793a9e268a551a82869a8a96f39deb73dea28084b0e8bf75e" + sha256: "61c04d0c1bfed555c681ea079519933f071a5a026578ff73c4ff0df2d3462e5e" url: "https://pub.dev" source: hosted - version: "9.0.0" + version: "13.3.0" analyzer_buffer: dependency: transitive description: name: analyzer_buffer - sha256: ff4bd291778c7417fe53fe24ee0d0a1f1ffe281a2d4ea887e7094f16e36eace7 + sha256: f890a2e708e38fbf4238ad2f9fd3d506538acdddb0cd8eb2c3e8c7bd17784b57 url: "https://pub.dev" source: hosted - version: "0.3.0" + version: "0.3.4" analyzer_plugin: dependency: transitive description: name: analyzer_plugin - sha256: "6645a029da947ffd823d98118f385d4bd26b54eb069c006b22e0b94e451814b5" + sha256: c2a75baf1657171cc7872db96a12b07e385873cf7a73f2b4f7638e9d0701ee53 url: "https://pub.dev" source: hosted - version: "0.13.11" + version: "0.14.12" animated_reorderable_list: dependency: transitive description: @@ -69,10 +69,10 @@ packages: dependency: "direct main" description: name: archive - sha256: a96e8b390886ee8abb49b7bd3ac8df6f451c621619f52a26e815fdcf568959ff + sha256: de5ac590b8155e4e676088d714bd41ea620449a6adc0f7950c5073874b287ddb url: "https://pub.dev" source: hosted - version: "4.0.9" + version: "4.6.0" args: dependency: transitive description: @@ -85,10 +85,10 @@ packages: dependency: transitive description: name: asn1lib - sha256: "9a8f69025044eb466b9b60ef3bc3ac99b4dc6c158ae9c56d25eeccf5bc56d024" + sha256: cfb3cf6a53158918d52dda61bc26f0cc8612a0d3b9dc29e87eaa3423902ca636 url: "https://pub.dev" source: hosted - version: "1.6.5" + version: "1.6.8" async: dependency: transitive description: @@ -109,34 +109,34 @@ packages: dependency: transitive description: name: build - sha256: "45d14a0fb23e018d8287c32fc98d726ce466b231928ed9b9200f29bd3ccd39ae" + sha256: "8a5c5761af8e31748bba3c82f68925ace40f3225c3eea25be9beb57eca7cd7a8" url: "https://pub.dev" source: hosted - version: "4.0.7" + version: "4.0.11" build_config: dependency: transitive description: name: build_config - sha256: f2c223156a26eea323e6244b85141d76413a80aeee9fe0b380773789fabaf8ae + sha256: d466ed2dc9c6cd1d169948879b84ee061eb5e22c64a7c6089879c6296d272a8d url: "https://pub.dev" source: hosted - version: "1.3.1" + version: "1.3.3" build_daemon: dependency: transitive description: name: build_daemon - sha256: fd754058c342243718d5171a95f352cfc9fcf0cba8cfa26df67cb13a5836db78 + sha256: "39ab65f7c60c19af64b9ef96e6a5d3ab48355f7dddfd98a9079d55a8cb6628fc" url: "https://pub.dev" source: hosted - version: "4.1.2" + version: "4.1.7" build_runner: dependency: "direct dev" description: name: build_runner - sha256: "5367e521935b102bdf1e735d2aab461e36b2edca6517662d088dd04cc39f8d16" + sha256: "894c243f6bc32015fec466ce30a6925bd537a77a426ee5bf481120477eb3de67" url: "https://pub.dev" source: hosted - version: "2.15.1" + version: "2.16.1" build_verify: dependency: "direct dev" description: @@ -149,18 +149,18 @@ packages: dependency: transitive description: name: built_collection - sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100" + sha256: "44922ecebd8e3d0cef743dadd3b54df4e87e2a4c52a29465a1872aa9e192caa8" url: "https://pub.dev" source: hosted - version: "5.1.1" + version: "5.1.2" built_value: dependency: transitive description: name: built_value - sha256: "34e4067d30ce212937df995f03b69992eea683539ceeac7f679a1f1eba055b56" + sha256: f87ea98192116f7093cb214551ce1929caae0681fdba282b3d8b4462adee7bb7 url: "https://pub.dev" source: hosted - version: "8.12.6" + version: "8.13.0" characters: dependency: transitive description: @@ -197,26 +197,26 @@ packages: dependency: transitive description: name: clock - sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b + sha256: e51d50bca3217c9a9fa2b41a30e4a38971133f5f9ec7a3d57bae095007f1d28e url: "https://pub.dev" source: hosted - version: "1.1.2" + version: "1.1.3" code_assets: dependency: transitive description: name: code_assets - sha256: bf394f466ba9205f1812a0433b392d6af280f155f56651eda7c18cc32ed493b8 + sha256: "1ef22a0be3af9370bd9481ac76db114db92bfe75d5ca2b2d7bc911764478a4d9" url: "https://pub.dev" source: hosted - version: "1.2.1" + version: "2.2.0" code_builder: dependency: transitive description: name: code_builder - sha256: "6a6cab2ba4680d6423f34a9b972a4c9a94ebe1b62ecec4e1a1f2cba91fd1319d" + sha256: "811709c1badd02fc054039a13f66e0db1961865f9a314175f68c3eaeebec786f" url: "https://pub.dev" source: hosted - version: "4.11.1" + version: "4.13.0" collection: dependency: "direct main" description: @@ -245,10 +245,10 @@ packages: dependency: transitive description: name: convert_object - sha256: "36d24e8bb88de1e7c1c2cbd757b7bfae21a0e31047a95a9b69672de394108b50" + sha256: a35faeb03782a26e23521a73e0d7e71e3dd4294edf9f31f2e62cc5dc28f12d93 url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.1.1" coverage: dependency: transitive description: @@ -261,18 +261,18 @@ packages: dependency: transitive description: name: cross_file - sha256: "92c9c43c383bfa1c32079d3bc492d55d6d4318044b7b47edaff8971cbb555c51" + sha256: f141ea4f277af142a0356955707f6556f37b03947d39d55585981a06ca437bd6 url: "https://pub.dev" source: hosted - version: "0.3.5+4" + version: "0.3.5+5" crypto: dependency: transitive description: name: crypto - sha256: c8ea0233063ba03258fbcf2ca4d6dadfefe14f02fab57702265467a19f27fadf + sha256: e3626ae6270383c9e3a549f34c9e4cd26c09ae6a9adaab2bf4737a00340efdc4 url: "https://pub.dev" source: hosted - version: "3.0.7" + version: "3.0.8" csslib: dependency: transitive description: @@ -285,18 +285,18 @@ packages: dependency: "direct main" description: name: dart_helper_utils - sha256: a2a51cc358e803e003c81850ccf76672d2a33cd5301d78ba62cc4dee13f4887d + sha256: "72aca9798ad726c354cf4147268e0b48ff07a21d8962569bade90ad585abae13" url: "https://pub.dev" source: hosted - version: "6.0.2" + version: "7.0.0" dart_style: dependency: transitive description: name: dart_style - sha256: a9c30492da18ff84efe2422ba2d319a89942d93e58eb0b73d32abe822ef54b7b + sha256: a0e4f65339b31eb6a9e6a12e14b4682a48d46fbc54a82f4a702396fbdbac63a7 url: "https://pub.dev" source: hosted - version: "3.1.3" + version: "3.1.14" dartx: dependency: transitive description: @@ -309,10 +309,10 @@ packages: dependency: "direct main" description: name: device_info_plus - sha256: "0891702f96b2e465fe567b7ec448380e6b1c14f60af552a8536d9f583b6b8442" + sha256: ade1c36f8355d6284c98e4a47992ea263887ed3d1acb281e37635dd45f04c4aa url: "https://pub.dev" source: hosted - version: "13.2.0" + version: "13.3.0" device_info_plus_platform_interface: dependency: transitive description: @@ -333,10 +333,10 @@ packages: dependency: "direct main" description: name: dynamic_color - sha256: "43a5a6679649a7731ab860334a5812f2067c2d9ce6452cf069c5e0c25336c17c" + sha256: "4aeb76de323e8eb660bab5557d826ad7ebbf1434a598f0c6aa8a11a9696a6757" url: "https://pub.dev" source: hosted - version: "1.8.1" + version: "1.9.0" encrypt: dependency: "direct main" description: @@ -349,10 +349,10 @@ packages: dependency: "direct main" description: name: equatable - sha256: "3bce007a596ff8b3119c45d68aaef631272537c03d30e5d4534dd24bf4c5eaa2" + sha256: ea36e500cbf0ec18361deabca755434f73e42fe53c5130021c7e2d6b5ebe1702 url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "3.0.0" fake_async: dependency: transitive description: @@ -487,10 +487,10 @@ packages: dependency: "direct main" description: name: flutter_markdown_plus - sha256: "2e4b667a75c08e5710866ae010da392acf5af475f9ad0be9bf406525e9751b0c" + sha256: fce641d6c2106cc495de1cd603f97a4f9d615a97a64011928ded380dbdade935 url: "https://pub.dev" source: hosted - version: "1.0.11" + version: "1.0.12" flutter_native_splash: dependency: "direct main" description: @@ -511,42 +511,42 @@ packages: dependency: "direct main" description: name: flutter_riverpod - sha256: "4e166be88e1dbbaa34a280bdb744aeae73b7ef25fdf8db7a3bb776760a3648e2" + sha256: "2b7f9d2a3c730ac1a98221b420cef966b990fca7ab546ede324642ca57a533e3" url: "https://pub.dev" source: hosted - version: "3.3.1" + version: "3.4.3" flutter_secure_storage: dependency: "direct main" description: name: flutter_secure_storage - sha256: "7686b1d6a29985dcbb808c59518226e603e3bfa7c0ddfd1a0d00e4cda77c868e" + sha256: d4e1fb6b2cb524868929e78dc0282fa000554b22060fb53789dc481c9fc95bb8 url: "https://pub.dev" source: hosted - version: "10.3.1" + version: "11.2.0" flutter_secure_storage_darwin: dependency: transitive description: name: flutter_secure_storage_darwin - sha256: "82329fa5cdf343773b1b6897dea959105a29f092454259edff92f9f6637e8149" + sha256: a031ceac9b070e62ef183cd7f7d1a8798ebde402d5049f0fe6eb3a51bd797a21 url: "https://pub.dev" source: hosted - version: "0.3.2" + version: "0.4.3" flutter_secure_storage_linux: dependency: transitive description: name: flutter_secure_storage_linux - sha256: a5f35ddab43cf5c8215d2feb4ce1957851f28c5c37e6f04335066a0602087bf5 + sha256: caa75bd78f017422912e3a904933113b2428eb79f981ac37acd2dd2a700458ea url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "3.0.3" flutter_secure_storage_platform_interface: dependency: transitive description: name: flutter_secure_storage_platform_interface - sha256: "8ceea1223bee3c6ac1a22dabd8feefc550e4729b3675de4b5900f55afcb435d6" + sha256: "64951127f001f546891c86f414972bf49ef2c4c8a4c92c65f5790cc0c9100045" url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "2.1.1" flutter_secure_storage_web: dependency: transitive description: @@ -593,34 +593,34 @@ packages: dependency: transitive description: name: frontend_server_client - sha256: f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694 + sha256: "2b56423afc7651a81da53ed3a4f9f51e92572293f54d0d54e19b759f13714849" url: "https://pub.dev" source: hosted - version: "4.0.0" + version: "4.2.0" gap: dependency: "direct main" description: name: gap - sha256: f19387d4e32f849394758b91377f9153a1b41d79513ef7668c088c77dbc6955d + sha256: ba305c9fb29d48b4ddfc59cbe4a437fc67b2e18824ec7729196289504d50570b url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "3.1.0" glob: dependency: transitive description: name: glob - sha256: c3f1ee72c96f8f78935e18aa8cecced9ab132419e8625dc187e1c2408efc20de + sha256: "218aeb56050c714f62a3182775320dfa04602b55074873e24e31bbd39bda96fb" url: "https://pub.dev" source: hosted - version: "2.1.3" + version: "2.2.0" go_router: dependency: "direct main" description: name: go_router - sha256: "5922b2861e2235a3504896f0d6fa07d84141b480cf52eecd2f42cd25585a9e8a" + sha256: d7a3576cb312649eaa51f2356450aed686085fb58fcdebda5b359aa951eef7ea url: "https://pub.dev" source: hosted - version: "17.3.0" + version: "17.5.0" graphs: dependency: transitive description: @@ -633,18 +633,18 @@ packages: dependency: transitive description: name: hooks - sha256: "9a62a50b50b769a737bc0a8ff381f333529df3ab746b2f6b02e83760231455ba" + sha256: eaac480a35ec0814146c2c48d96aaa829e0e44a7662c88ae84c9edf4bc35651f url: "https://pub.dev" source: hosted - version: "2.0.2" + version: "2.2.0" html: dependency: transitive description: name: html - sha256: "6d1264f2dffa1b1101c25a91dff0dc2daee4c18e87cd8538729773c073dbf602" + sha256: "43b67b8f43321ab066817dfac5619596c98bb1b61624e77203bb4351785f9699" url: "https://pub.dev" source: hosted - version: "0.15.6" + version: "0.15.7" http: dependency: transitive description: @@ -657,10 +657,10 @@ packages: dependency: transitive description: name: http_multi_server - sha256: aa6199f908078bb1c5efb8d8638d4ae191aac11b311132c3ef48ce352fb52ef8 + sha256: "361668bdd71f0ae2dc6d17b75a593520f3c414af6534f9eed1aa72049dd71d18" url: "https://pub.dev" source: hosted - version: "3.2.2" + version: "3.2.3" http_parser: dependency: transitive description: @@ -673,26 +673,26 @@ packages: dependency: transitive description: name: image - sha256: "6300175e00616bbc832e2fc91bfa4d776af5402c81c7151bee6905bb08473c52" + sha256: "89ed75b2f8231fe676808c5564f9590d728024ded7ac782a7ed8474f1c95b72a" url: "https://pub.dev" source: hosted - version: "4.9.1" + version: "4.12.0" intl: dependency: "direct main" description: name: intl - sha256: "3df61194eb431efc39c4ceba583b95633a403f46c9fd341e550ce0bfa50e9aa5" + sha256: "1ca20c894b1717686a2319b8548763d812bc0aabdac580420a44c5178c57a867" url: "https://pub.dev" source: hosted - version: "0.20.2" + version: "0.20.3" io: dependency: transitive description: name: io - sha256: dfd5a80599cf0165756e3181807ed3e77daf6dd4137caaad72d0b7931597650b + sha256: "2635216ca6a737e60de577ffa1a48a0bec76ca8a62917cfc1bb88c14c570646f" url: "https://pub.dev" source: hosted - version: "1.0.5" + version: "1.1.0" is_first_run: dependency: "direct main" description: @@ -705,42 +705,50 @@ packages: dependency: "direct main" description: name: isar_community - sha256: "683fd093956eac3a660776afb70d65d50a3391b3587b40b89e3d12586b8cc47f" + sha256: "5046967047825b8699b66ad41f29c68c4eaefd54e236f6dea9e90e0b8063442a" url: "https://pub.dev" source: hosted - version: "3.3.2" + version: "3.4.1" isar_community_flutter_libs: dependency: "direct main" description: name: isar_community_flutter_libs - sha256: c44340fa38c81ef16d924202d443bbe799cde4826be9a31a9dc92ee612e1966f + sha256: "541b07c0de7b5bd28e76cafc9fb56fac521186937bf309231572bf16551ef2f1" url: "https://pub.dev" source: hosted - version: "3.3.2" + version: "3.4.1" isar_community_generator: dependency: "direct dev" description: name: isar_community_generator - sha256: fd5a2a5df2aac2fccba82425005bf47fd2a48f34190536d0c9fd732dc7303fb3 + sha256: "7db0aa41a2b03dc2d7c38b23ff2dfb1e06c7e43c2ac8831524595446d3f31808" url: "https://pub.dev" source: hosted - version: "3.3.2" + version: "3.4.1" jni: dependency: transitive description: name: jni - sha256: c2230682d5bc2362c1c9e8d3c7f406d9cbba23ab3f2e203a025dd47e0fb2e68f + sha256: "2e91e6087291affd10b31b6c872f3e3ac7dc5d93b51b5ba485d930c8f08bde6c" url: "https://pub.dev" source: hosted - version: "1.0.0" + version: "1.1.2" jni_flutter: dependency: transitive description: name: jni_flutter - sha256: "8b59e590786050b1cd866677dddaf76b1ade5e7bc751abe04b86e84d379d3ba6" + sha256: "0dd33d67797560f66e961a6053882d4df54bd345bf063b8fe7ea133f7ad8b191" url: "https://pub.dev" source: hosted - version: "1.0.1" + version: "1.0.4+1" + jni_util: + dependency: transitive + description: + name: jni_util + sha256: "1ba86da04a5f2bf18fde2edb235587e70c5b0fc5bd4ba955f46b00942c3fc35f" + url: "https://pub.dev" + source: hosted + version: "1.0.0" js: dependency: transitive description: @@ -753,18 +761,18 @@ packages: dependency: "direct main" description: name: json_annotation - sha256: cb09e7dac6210041fad964ed7fbee004f14258b4eca4040f72d1234062ace4c8 + sha256: "2a743920d81b7910627f68ee2c9ac1fc0bfee32b9fc3403587d7c6791ca12f80" url: "https://pub.dev" source: hosted - version: "4.11.0" + version: "4.12.0" json_serializable: dependency: "direct dev" description: name: json_serializable - sha256: "44729f5c45748e6748f6b9a57ab8f7e4336edc8ae41fc295070e3814e616a6c0" + sha256: cc7822761b40be9237bcaae62b755ffe5453ceff96a0001f1f5f2439251c66f1 url: "https://pub.dev" source: hosted - version: "6.13.0" + version: "6.15.2" leak_tracker: dependency: transitive description: @@ -797,6 +805,14 @@ packages: url: "https://pub.dev" source: hosted version: "6.1.0" + listen: + dependency: transitive + description: + name: listen + sha256: "47501a08016a43fcad79252439d723f50f14f88fa7bfd8a177e0a417e5c9e1f2" + url: "https://pub.dev" + source: hosted + version: "1.0.1" listen_sharing_intent: dependency: "direct main" description: @@ -817,18 +833,18 @@ packages: dependency: transitive description: name: local_auth_android - sha256: fdb936d59ab945c7af297defd67bd1ed87b11b6db1bc16d01e94677a8f1c38ec + sha256: e2ceb84cdecefe1bc0ddd4ac308b0f6525bbfa0a60d0e552082b2970e1fb38c2 url: "https://pub.dev" source: hosted - version: "2.0.9" + version: "2.3.0" local_auth_darwin: dependency: transitive description: name: local_auth_darwin - sha256: a8c3d4e17454111f7fd31ff72a31222359f6059f7fe956c2dcfe0f88f49826d4 + sha256: "45a9db01b57082bc9d6115cb25eb8fc0b72f43e5f330819bdd8352ecdae87589" url: "https://pub.dev" source: hosted - version: "2.0.3" + version: "2.0.5" local_auth_platform_interface: dependency: transitive description: @@ -841,10 +857,10 @@ packages: dependency: transitive description: name: local_auth_windows - sha256: be12c5b8ba5e64896983123655c5f67d2484ecfcc95e367952ad6e3bff94cb16 + sha256: d72b8a441e5e6a679902f87c51529fcce65f442d77598484cf35454c3d733eda url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "2.0.2" locale_names: dependency: "direct main" description: @@ -857,10 +873,10 @@ packages: dependency: "direct main" description: name: logger - sha256: "25aee487596a6257655a1e091ec2ae66bc30e7af663592cc3a27e6591e05035c" + sha256: "2a0dc097e7b01d942475bdd552356db2d0f768b05540bd4b2b53f1840f2239a7" url: "https://pub.dev" source: hosted - version: "2.7.0" + version: "2.8.0" logging: dependency: transitive description: @@ -881,10 +897,10 @@ packages: dependency: transitive description: name: matcher - sha256: dc0b7dc7651697ea4ff3e69ef44b0407ea32c487a39fff6a4004fa585e901861 + sha256: "31bd099b47c10cd1aeb55146a2d46ce0277630ecef3f7dae54ad7873f36696cd" url: "https://pub.dev" source: hosted - version: "0.12.19" + version: "0.12.20" material_color_utilities: dependency: transitive description: @@ -897,34 +913,34 @@ packages: dependency: "direct main" description: name: material_symbols_icons - sha256: "49c532dd0b74544e9d8d93ec0f821d52ec532e7c9263c889ebe71b1be4f34ba7" + sha256: bd513edc2bc9b034108d5518c48cf5cebbb67d0653728cc452368cb27ca80bb0 url: "https://pub.dev" source: hosted - version: "4.2951.0" + version: "4.2960.0" meta: dependency: transitive description: name: meta - sha256: "1741988757a65eb6b36abe716829688cf01910bbf91c34354ff7ec1c3de2b349" + sha256: "307249ce4ff29d58a18e97f6345f539382eb9c9c29ecda628900f31de0443dd9" url: "https://pub.dev" source: hosted - version: "1.18.0" + version: "1.19.0" mime: dependency: transitive description: name: mime - sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6" + sha256: bd47de35f07e27267e69c8c8b22edf9473bfee170a60d60fcc93730c5144b7f6 url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "2.1.0" mockito: dependency: transitive description: name: mockito - sha256: eff30d002f0c8bf073b6f929df4483b543133fcafce056870163587b03f1d422 + sha256: "6c1970612452260366064d4df80fdb3eece1ec5e52610ae34a0e51f2f3d8e64f" url: "https://pub.dev" source: hosted - version: "5.6.4" + version: "5.8.1" node_preamble: dependency: transitive description: @@ -937,10 +953,10 @@ packages: dependency: transitive description: name: objective_c - sha256: "6cb691c686fa2838c6deb34980d426145c2a5d537491cb83d463c33cdbc726ed" + sha256: c965d264fd4b0b4dd402dce9d049b70656bf98d3ca108b9bc55d2544ceadbe5e url: "https://pub.dev" source: hosted - version: "9.4.1" + version: "9.6.4" package_config: dependency: transitive description: @@ -953,10 +969,10 @@ packages: dependency: "direct main" description: name: package_info_plus - sha256: f5c435dc0e0d461e5b32471a870f769b6a1cc46930637efe24fbc535314e78ad + sha256: "73ef2cd5c11a7548f9b7f6fc2a4f6113de2e64aa2a70de63feede95548822908" url: "https://pub.dev" source: hosted - version: "10.2.0" + version: "10.2.2" package_info_plus_platform_interface: dependency: transitive description: @@ -1041,18 +1057,18 @@ packages: dependency: transitive description: name: petitparser - sha256: "91bd59303e9f769f108f8df05e371341b15d59e995e6806aefab827b58336675" + sha256: "2f1564aadb14215e478563b5406cb80729d022158c01dc50c96013c2f7eb4790" url: "https://pub.dev" source: hosted - version: "7.0.2" + version: "7.1.0" platform: dependency: transitive description: name: platform - sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" + sha256: a36d119c13416516a7b5913fbe8af8531e11633d784c550b2125f76c758524ec url: "https://pub.dev" source: hosted - version: "3.1.6" + version: "3.2.0" plugin_platform_interface: dependency: transitive description: @@ -1073,58 +1089,58 @@ packages: dependency: transitive description: name: pool - sha256: "978783255c543aa3586a1b3c21f6e9d720eb315376a915872c61ef8b5c20177d" + sha256: "4177f68c237ea2128d1bee66ac17b2ce05ba3dbaafcbdd54c5d40a39d0b6b11c" url: "https://pub.dev" source: hosted - version: "1.5.2" + version: "1.5.3" posix: dependency: transitive description: name: posix - sha256: "185ef7606574f789b40f289c233efa52e96dead518aed988e040a10737febb07" + sha256: "613646d076944f3acc125830af935b48d4b8a57a388691547bbfd25b434f4d63" url: "https://pub.dev" source: hosted - version: "6.5.0" + version: "6.5.4" pub_semver: dependency: transitive description: name: pub_semver - sha256: "5bfcf68ca79ef689f8990d1160781b4bad40a3bd5e5218ad4076ddb7f4081585" + sha256: "261236774e8b1d69cfc6b9eabbc96c40f25e7a2d6b171f3385d4f65d5734fb24" url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "2.2.1" pubspec_parse: dependency: transitive description: name: pubspec_parse - sha256: "0560ba233314abbed0a48a2956f7f022cce7c3e1e73df540277da7544cad4082" + sha256: "9ac81c01ffd6a9cf9b2713288834fbaaf6aebde05ffdf02d380e68b8e06f27d8" url: "https://pub.dev" source: hosted - version: "1.5.0" + version: "1.7.0" quick_actions: dependency: "direct main" description: name: quick_actions - sha256: "7e35dd6a21f5bbd21acf6899039eaf85001a5ac26d52cbd6a8a2814505b90798" + sha256: "1d3397c1ce5cd91b732c675bc82571d316d6de8241d774927b4ea3680c860e1a" url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.1.1" quick_actions_android: dependency: transitive description: name: quick_actions_android - sha256: af50d52d882a0f520c4be082636b5177b3de239bd468857d5da0b5a6eec61e07 + sha256: "7fb4852f791fd3da688103be2fa287ecb97608b9b73ee9def455b78fa5f18587" url: "https://pub.dev" source: hosted - version: "1.0.32" + version: "1.0.34" quick_actions_ios: dependency: transitive description: name: quick_actions_ios - sha256: be1496e7ca1debc86d9ea08e56325649fbc5abb2b6930690c97ba0dae59992b1 + sha256: fe090ae5b9673c7031ca307371f611061a731adda6a5c9574aed9439475218cf url: "https://pub.dev" source: hosted - version: "1.2.4" + version: "1.2.5" quick_actions_platform_interface: dependency: transitive description: @@ -1145,10 +1161,10 @@ packages: dependency: transitive description: name: record_use - sha256: "2551bd8eecfe95d14ae75f6021ad0248be5c27f138c2ec12fcb52b500b3ba1ed" + sha256: "1cb8564af8d43b464294411db9217f5ec04891c6f22ee2c32d73ae05e88a6bd2" url: "https://pub.dev" source: hosted - version: "0.6.0" + version: "1.1.1" remove_markdown: dependency: "direct main" description: @@ -1161,66 +1177,66 @@ packages: dependency: "direct main" description: name: restart_app - sha256: "400dd401b77b599e2defef55fd4c22af3ff80af48616a82f01c2a07070e3e368" + sha256: "398550c5c0438b15c6062c7cb7e5c234498584aa9ba1b28910e77d4ff43bfef6" url: "https://pub.dev" source: hosted - version: "1.8.3" + version: "1.10.2" riverpod: dependency: transitive description: name: riverpod - sha256: "8c22216be8ad3ef2b44af3a329693558c98eca7b8bd4ef495c92db0bba279f83" + sha256: "484dfc873ea4c4f4240e5635444fa066f87b07862b7279ebd004a2b71fba4b7a" url: "https://pub.dev" source: hosted - version: "3.2.1" + version: "3.4.3" riverpod_analyzer_utils: dependency: transitive description: name: riverpod_analyzer_utils - sha256: e55bc08c084a424e1bbdc303fe8ea75daafe4269b68fd0e0f6f1678413715b66 + sha256: bb13cb3985815840cc103eda1027158358c5fdc00f308fc6f76574d0594107af url: "https://pub.dev" source: hosted - version: "1.0.0-dev.9" + version: "1.0.0-dev.12" riverpod_annotation: dependency: "direct main" description: name: riverpod_annotation - sha256: "16471a1260b94e939394d78f1c63a9350936ac4a68c9fbdab40be47268c0b04f" + sha256: "322e56ad198928ef26ba240f85421bfff2493bd65665c887b1299e6386b6206d" url: "https://pub.dev" source: hosted - version: "4.0.2" + version: "4.0.7" riverpod_generator: dependency: "direct dev" description: name: riverpod_generator - sha256: "6f9220534d7a353b53c875ea191a84d28cb4e52ac420a66a1bd7318329d977b0" + sha256: c94dcb8b60ff4805d2bb8cacca969c48237bcb563e2ab0b5afb50204470c7636 url: "https://pub.dev" source: hosted - version: "4.0.3" + version: "4.0.9" riverpod_lint: dependency: "direct dev" description: name: riverpod_lint - sha256: "64e8debf5b719a37d48b9785dd595d34133fdcd84b8fd07157a621c54ab2156f" + sha256: "215cb3cd54a97e09bc3512535fa4e8bedd3bf2a06dc2ae015ac8e0050fc71bd1" url: "https://pub.dev" source: hosted - version: "3.1.3" + version: "3.1.9" saf_stream: dependency: "direct main" description: name: saf_stream - sha256: "6fa5179bf5c8f5f99b183286df6236b23de33c1e874d69ce1fe565a63f95f62b" + sha256: "9a1b6f70527a52f7464c161f9cb05e8d471e71d460b987adbb94b15ed2b0e8cf" url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "4.0.3" saf_util: dependency: "direct main" description: name: saf_util - sha256: "1e98cd63ddb78cbb3fa5cc0028283fc48381b867fa357f6b9417226eab464928" + sha256: c630df86aa412d3c5b715eb941ebefa9c97eefe31395bf45223ba5efb3862a43 url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "3.1.1" sanitize_filename: dependency: "direct main" description: @@ -1241,42 +1257,42 @@ packages: dependency: "direct main" description: name: share_plus - sha256: "9eee8283462d91a7a1c8bdb67d08874abd75a2f8fae3bc0ca033035e375fb3d8" + sha256: db40767f130189d53f3ae8a6393c217ff4a492da1baff718a9873679c0c00224 url: "https://pub.dev" source: hosted - version: "13.2.0" + version: "13.3.1" share_plus_platform_interface: dependency: transitive description: name: share_plus_platform_interface - sha256: "7f7ae28cf400d13f811e297ff37742dba83b79e0a6f5dce14eec0248274e6ce9" + sha256: "365ef7379fc22507256adda3385152942ffce08935452bc972c2e52a0bebae41" url: "https://pub.dev" source: hosted - version: "7.1.0" + version: "7.2.0" shared_preferences: dependency: "direct main" description: name: shared_preferences - sha256: c3025c5534b01739267eb7d76959bbc25a6d10f6988e1c2a3036940133dd10bf + sha256: "1e85e0dccf5b4a016077fea7dfbb4a7cb39c759ac1596fcf60c06deadb7da91f" url: "https://pub.dev" source: hosted - version: "2.5.5" + version: "2.5.6" shared_preferences_android: dependency: transitive description: name: shared_preferences_android - sha256: "93ae5884a9df5d3bb696825bceb3a17590754548b5d740eba51500afc8d088f5" + sha256: "33b38b07d9ac7d16aff0426c61418752fd3e7a8c7dc8be786c875d6ce673b002" url: "https://pub.dev" source: hosted - version: "2.4.26" + version: "2.5.4" shared_preferences_foundation: dependency: transitive description: name: shared_preferences_foundation - sha256: "4e7eaffc2b17ba398759f1151415869a34771ba11ebbccd1b0145472a619a64f" + sha256: "4e396ac6f8751ab7d2d6e27f22f32c8350b07006028d534f5221503382f1fa69" url: "https://pub.dev" source: hosted - version: "2.5.6" + version: "2.6.1" shared_preferences_linux: dependency: transitive description: @@ -1313,10 +1329,10 @@ packages: dependency: transitive description: name: shelf - sha256: e7dd780a7ffb623c57850b33f43309312fc863fb6aa3d276a754bb299839ef12 + sha256: e75e9cf311d7fd712048038cc17c25199c38536c20330d53e7db058b543d5a48 url: "https://pub.dev" source: hosted - version: "1.4.2" + version: "1.4.3" shelf_packages_handler: dependency: transitive description: @@ -1329,10 +1345,10 @@ packages: dependency: transitive description: name: shelf_static - sha256: c87c3875f91262785dade62d135760c2c69cb217ac759485334c5857ad89f6e3 + sha256: "480504af9e5323899c5be26a4f6c2fc4437d50954d39842f0290f4ae733d57b4" url: "https://pub.dev" source: hosted - version: "1.1.3" + version: "1.2.0" shelf_web_socket: dependency: transitive description: @@ -1358,18 +1374,18 @@ packages: dependency: transitive description: name: source_gen - sha256: ec37cc0e6694374cbef59ed79685572c870a54ede6fa30a3e420feb3adffea02 + sha256: a603f1fb984a7391ae5978d1b92bfaaa08b350dca5c825256f925818f7943bf5 url: "https://pub.dev" source: hosted - version: "4.2.3" + version: "4.2.4" source_helper: dependency: transitive description: name: source_helper - sha256: "4227d54ceefd0bb8ca4c8fcb96e1719dc53f1ee1b6e2ca9d7a6069da160e4eae" + sha256: "279126bce72de3f2b7d4756408a4157988cf6bb4815be551bf55851aa00e9984" url: "https://pub.dev" source: hosted - version: "1.3.12" + version: "1.4.0" source_map_stack_trace: dependency: transitive description: @@ -1382,10 +1398,10 @@ packages: dependency: transitive description: name: source_maps - sha256: "190222579a448b03896e0ca6eca5998fa810fda630c1d65e2f78b3f638f54812" + sha256: "14c2945847669b44089bb1222f66873d7ff7103c58911917f2a63c5a62327898" url: "https://pub.dev" source: hosted - version: "0.10.13" + version: "0.10.14" source_span: dependency: transitive description: @@ -1398,10 +1414,10 @@ packages: dependency: transitive description: name: stack_trace - sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" + sha256: "277654b3034d17ac6f9f1cb5595db011b1d5d41e8806866db28e0abaa101c490" url: "https://pub.dev" source: hosted - version: "1.12.1" + version: "1.12.2" state_notifier: dependency: transitive description: @@ -1422,10 +1438,10 @@ packages: dependency: transitive description: name: stream_transform - sha256: ad47125e588cfd37a9a7f86c7d6356dde8dfe89d071d293f80ca9e9273a33871 + sha256: a00e5f18bffc764f923e7dec1038527f7fe7a1791361a7117f0358193f13d53a url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.2" string_scanner: dependency: transitive description: @@ -1442,6 +1458,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.2.0" + stringo: + dependency: transitive + description: + name: stringo + sha256: "95ad52452dbeafb77d811809163f8cae7e34e844d201baf605b391f37579993a" + url: "https://pub.dev" + source: hosted + version: "3.0.0" substring_highlight: dependency: "direct main" description: @@ -1462,26 +1486,26 @@ packages: dependency: transitive description: name: test - sha256: "8d9ceddbab833f180fbefed08afa76d7c03513dfdba87ffcec2718b02bbcbf20" + sha256: ca578dc12bb8b2f40b67b7d3bd2fac4f31c01a6ff7130a14e2597b919934507f url: "https://pub.dev" source: hosted - version: "1.31.0" + version: "1.31.1" test_api: dependency: transitive description: name: test_api - sha256: "949a932224383300f01be9221c39180316445ecb8e7547f70a41a35bf421fb9e" + sha256: "2a122cbe059f8b610d3a5415f42e255b6c17b1f21eee1d960f31080237fb4f11" url: "https://pub.dev" source: hosted - version: "0.7.11" + version: "0.7.12" test_core: dependency: transitive description: name: test_core - sha256: "1991d4cfe85d5043241acac92962c3977c8d2f2add1ee73130c7b286417d1d34" + sha256: d2e98ec12998368dc59ddd47ab709f2cd55acd6b66dc7db764455a44082f4bc5 url: "https://pub.dev" source: hosted - version: "0.6.17" + version: "0.6.18" time: dependency: transitive description: @@ -1510,42 +1534,42 @@ packages: dependency: "direct main" description: name: url_launcher - sha256: f6a7e5c4835bb4e3026a04793a4199ca2d14c739ec378fdfe23fc8075d0439f8 + sha256: e8cc955c97e06df9879140a1fe301f3d493f01b7c62dec7f46834be31d7e9fda url: "https://pub.dev" source: hosted - version: "6.3.2" + version: "6.3.3" url_launcher_android: dependency: transitive description: name: url_launcher_android - sha256: b413d49b73867ac08dd2f9890efd3cc11f2a0e577618d50843440a1fb3776c32 + sha256: "611e87fb320b70d1dd721dc46af89c98aceccea9b31fde49e084591414e0c610" url: "https://pub.dev" source: hosted - version: "6.3.32" + version: "6.3.33" url_launcher_ios: dependency: transitive description: name: url_launcher_ios - sha256: "580fe5dfb51671ae38191d316e027f6b76272b026370708c2d898799750a02b0" + sha256: "8faa1aab294f1ab4040b43660c887b0418d5fa4f0cffef76a484e6aa1092eb4a" url: "https://pub.dev" source: hosted - version: "6.4.1" + version: "6.4.2" url_launcher_linux: dependency: transitive description: name: url_launcher_linux - sha256: d5e14138b3bc193a0f63c10a53c94b91d399df0512b1f29b94a043db7482384a + sha256: "10f86fef4c2c43563fa6c211ff9cf757adf4d3ab762c56bd430664a947d70cd0" url: "https://pub.dev" source: hosted - version: "3.2.2" + version: "3.2.3" url_launcher_macos: dependency: transitive description: name: url_launcher_macos - sha256: "368adf46f71ad3c21b8f06614adb38346f193f3a59ba8fe9a2fd74133070ba18" + sha256: "5e835a3b869c2d70325349c81c5a45c28e20791265b67b2669da6b08c5cd5201" url: "https://pub.dev" source: hosted - version: "3.2.5" + version: "3.2.6" url_launcher_platform_interface: dependency: transitive description: @@ -1566,34 +1590,34 @@ packages: dependency: transitive description: name: url_launcher_windows - sha256: "712c70ab1b99744ff066053cbe3e80c73332b38d46e5e945c98689b2e66fc15f" + sha256: "6c5ad3f22cd4c38e089b81963b3cd7bb83b111b2df5dce008bb066162f42e429" url: "https://pub.dev" source: hosted - version: "3.1.5" + version: "3.1.6" uuid: dependency: "direct main" description: name: uuid - sha256: "1fef9e8e11e2991bb773070d4656b7bd5d850967a2456cfc83cf47925ba79489" + sha256: "9b129329f58692f6e6578329498a8fe9fbe98f090beb764ffbb8ee2eadd01dcd" url: "https://pub.dev" source: hosted - version: "4.5.3" + version: "4.6.0" vector_math: dependency: transitive description: name: vector_math - sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b + sha256: fa49e1674cb84acb900141714e6c6e1f9ae099827c24d141430ff6819db4e1bc url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "2.4.4" vm_service: dependency: transitive description: name: vm_service - sha256: "0016aef94fc66495ac78af5859181e3f3bf2026bd8eecc72b9565601e19ab360" + sha256: "89b11d62e1040ee681af3b4f1c97a803ecbf010c6e8b9c5896ee5b08c3bf7b78" url: "https://pub.dev" source: hosted - version: "15.2.0" + version: "15.4.0" watcher: dependency: transitive description: @@ -1606,10 +1630,10 @@ packages: dependency: transitive description: name: web - sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" + sha256: e119e82ac4795c7925103b7cf3768191f33941b99e7ccffbd6c645201d9f606b url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.1.2" web_socket: dependency: transitive description: @@ -1638,10 +1662,10 @@ packages: dependency: transitive description: name: win32 - sha256: ba6f4bba816c8d7e3c1580e170f3786d216951cc6b94babc3b814c08d2cb2738 + sha256: a0b93865d5644f11cf6a8c3f6db909f1ec168958b5805f6cc684adea957cd63d url: "https://pub.dev" source: hosted - version: "6.3.0" + version: "6.4.0" win32_registry: dependency: transitive description: @@ -1662,10 +1686,10 @@ packages: dependency: transitive description: name: xml - sha256: "67f0aff7be013d107995e9b75bf4e7f2c3ef2dfdb2c8e68024bba0a7fd5756a4" + sha256: "0fe8cc98946def31cbcbc8734aa4067031e6f65ea3a78a508060bfed2200bfeb" url: "https://pub.dev" source: hosted - version: "7.0.1" + version: "7.1.0" xxh3: dependency: transitive description: @@ -1678,10 +1702,10 @@ packages: dependency: transitive description: name: yaml - sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce + sha256: f67cdd8e07d3c6329146aaef1ba043542b3134c12489f553ca9a7435d1068aea url: "https://pub.dev" source: hosted - version: "3.1.3" + version: "3.1.4" yaml_edit: dependency: transitive description: @@ -1691,5 +1715,5 @@ packages: source: hosted version: "2.2.4" sdks: - dart: ">=3.12.0 <4.0.0" - flutter: "3.44.0" + dart: ">=3.13.5 <4.0.0" + flutter: "3.47.9" diff --git a/pubspec.yaml b/pubspec.yaml index 60f81d96..7d61f68f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -7,21 +7,21 @@ publish_to: none version: 2.2.2+38 environment: - sdk: ^3.12.0 - flutter: 3.44.0 + sdk: ^3.13.0 + flutter: 3.47.9 dependencies: after_layout: ^1.2.0 - archive: ^4.0.9 + archive: ^4.6.0 collection: ^1.19.1 const_date_time: ^1.2.1 - dart_helper_utils: ^6.0.2 - device_info_plus: ^13.1.0 - dynamic_color: ^1.8.1 + dart_helper_utils: ^7.0.0 + device_info_plus: ^13.3.0 + dynamic_color: ^1.9.0 encrypt: ^5.0.3 - equatable: ^2.0.8 + equatable: ^3.0.0 flag_secure: ^2.0.2 - fleather: ^1.27.0 + fleather: ">=1.27.0 <1.28.0" flex_color_picker: ^3.8.0 flutter: sdk: flutter @@ -31,54 +31,54 @@ dependencies: flutter_fgbg: ^0.8.0 flutter_localizations: sdk: flutter - flutter_markdown_plus: ^1.0.7 + flutter_markdown_plus: ^1.0.12 flutter_native_splash: ^2.4.8 - flutter_riverpod: ^3.3.1 - flutter_secure_storage: ^10.3.1 + flutter_riverpod: ">=3.4.3 <3.5.0" + flutter_secure_storage: ^11.2.0 flutter_staggered_grid_view: ^0.7.0 - gap: ^3.0.1 - go_router: ^17.3.0 - intl: ^0.20.2 + gap: ^3.1.0 + go_router: ^17.5.0 + intl: ^0.20.3 is_first_run: ^1.0.0 - isar_community: ^3.3.2 - isar_community_flutter_libs: ^3.3.2 - json_annotation: ^4.11.0 + isar_community: ^3.4.1 + isar_community_flutter_libs: ^3.4.1 + json_annotation: ^4.12.0 listen_sharing_intent: ^1.9.2 - local_auth: ^3.0.1 + local_auth: ^3.0.2 locale_names: ^1.1.1 - logger: ^2.7.0 + logger: ^2.8.0 markdown: ^7.3.1 - material_symbols_icons: ^4.2928.1 - package_info_plus: ^10.1.0 - parchment: any - parchment_delta: any + material_symbols_icons: ^4.2960.0 + package_info_plus: ^10.2.2 + parchment: ^1.27.0 + parchment_delta: ^1.0.0 path: ^1.9.1 - path_provider: ^2.1.5 - quick_actions: ^1.1.0 + path_provider: ^2.1.6 + quick_actions: ^1.1.1 remove_markdown: ^0.0.2 - restart_app: ^1.8.3 - riverpod_annotation: ^4.0.2 - saf_stream: ^2.0.0 - saf_util: ^2.2.0 + restart_app: ^1.10.2 + riverpod_annotation: ^4.0.7 + saf_stream: ^4.0.3 + saf_util: ^3.1.1 sanitize_filename: ^1.0.5 settings_tiles: ^6.0.1 - share_plus: ^13.1.0 - shared_preferences: ^2.5.5 + share_plus: ^13.3.1 + shared_preferences: ^2.5.6 simple_icons: ^16.23.0 string_validator: ^1.2.0 substring_highlight: ^1.0.33 - url_launcher: ^6.3.2 - uuid: ^4.5.3 + url_launcher: ^6.3.3 + uuid: ^4.6.0 dev_dependencies: - build_runner: ^2.15.0 + build_runner: ^2.16.1 build_verify: ^3.1.1 flutter_launcher_icons: ^0.14.4 flutter_lints: ^6.0.0 - isar_community_generator: ^3.3.2 - json_serializable: ^6.13.0 - riverpod_generator: ^4.0.3 - riverpod_lint: ^3.1.3 + isar_community_generator: ^3.4.1 + json_serializable: ^6.15.2 + riverpod_generator: ^4.0.9 + riverpod_lint: ^3.1.9 flutter: uses-material-design: true From 7561e90dac68f84866299178a039a9b724956fd5 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 11 Nov 2026 10:41:10 +0000 Subject: [PATCH 2/9] style: format the files with the Dart 3.13 formatter Formatting only, no change of behavior. The files were formatted by the previous formatter. Refs #591 Co-Authored-By: Claude --- lib/common/constants/notes.dart | 12 ++++-------- lib/common/extensions/color_extension.dart | 1 + lib/common/extensions/text_style_extension.dart | 1 + .../enums/editor/editor_deleted_menu_option.dart | 5 ++--- .../enums/labels/selection_labels_menu_option.dart | 5 ++--- .../enums/notes/selection_deleted_menu_option.dart | 5 ++--- .../enums/swipe_actions/archived_swipe_action.dart | 5 ++--- .../enums/swipe_actions/available_swipe_action.dart | 5 ++--- .../enums/swipe_actions/label_swipe_action.dart | 5 ++--- lib/common/preferences/preferences_wrapper.dart | 13 ++++++------- .../widgets/placeholders/empty_placeholder.dart | 5 ++--- lib/providers/preferences/preferences_provider.dart | 1 + 12 files changed, 27 insertions(+), 36 deletions(-) diff --git a/lib/common/constants/notes.dart b/lib/common/constants/notes.dart index 3d013bea..30e06415 100644 --- a/lib/common/constants/notes.dart +++ b/lib/common/constants/notes.dart @@ -21,8 +21,7 @@ final screenshotNotes = [ createdTime: DateTime(2000, 01, 01, 12), editedTime: DateTime(2000, 01, 01, 12), title: "Welcome to Material Notes", - content: - '[{"insert":"Simple","attributes":{"b":true}},{"insert":", "},{"insert":"local","attributes":{"i":true}},{"insert":", "},{"insert":"material design","attributes":{"u":true}},{"insert":" notes\\n"}]', + content: '[{"insert":"Simple","attributes":{"b":true}},{"insert":", "},{"insert":"local","attributes":{"i":true}},{"insert":", "},{"insert":"material design","attributes":{"u":true}},{"insert":" notes\\n"}]', ), RichTextNote( archived: false, @@ -31,8 +30,7 @@ final screenshotNotes = [ createdTime: DateTime(2000, 01, 01, 11, 55), editedTime: DateTime(2000, 01, 01, 11, 55), title: "Take notes", - content: - '[{"insert":"Write text notes"},{"insert":"\\n","attributes":{"block":"cl","checked":true}},{"insert":"Use plain text, markdown, rich text or checklist notes"},{"insert":"\\n","attributes":{"block":"cl","checked":true}},{"insert":"Use quick action to add from your home screen"},{"insert":"\\n","attributes":{"block":"cl","checked":true}}]', + content: '[{"insert":"Write text notes"},{"insert":"\\n","attributes":{"block":"cl","checked":true}},{"insert":"Use plain text, markdown, rich text or checklist notes"},{"insert":"\\n","attributes":{"block":"cl","checked":true}},{"insert":"Use quick action to add from your home screen"},{"insert":"\\n","attributes":{"block":"cl","checked":true}}]', ), RichTextNote( archived: false, @@ -59,8 +57,7 @@ final screenshotNotes = [ createdTime: DateTime(2000, 01, 01, 11, 45), editedTime: DateTime(2000, 01, 01, 11, 45), title: "Share & backup", - content: - '[{"insert":"Create a note from shared text\\nShare notes as text and export as Markdown\\nBackup notes as JSON\\n"}]', + content: '[{"insert":"Create a note from shared text\\nShare notes as text and export as Markdown\\nBackup notes as JSON\\n"}]', ), RichTextNote( archived: false, @@ -79,8 +76,7 @@ final screenshotNotes = [ createdTime: DateTime(2000, 01, 01, 11, 40), editedTime: DateTime(2000, 01, 01, 11, 40), title: "Customize", - content: - "[{\"insert\":\"Choose your language\\nChoose your theme (including black and dynamic)\\nHide features you don't need\\n\"}]", + content: "[{\"insert\":\"Choose your language\\nChoose your theme (including black and dynamic)\\nHide features you don't need\\n\"}]", ), RichTextNote( archived: false, diff --git a/lib/common/extensions/color_extension.dart b/lib/common/extensions/color_extension.dart index 7fb62775..b78933c8 100644 --- a/lib/common/extensions/color_extension.dart +++ b/lib/common/extensions/color_extension.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; + import '../constants/constants.dart'; /// Extensions on the [Color] class. diff --git a/lib/common/extensions/text_style_extension.dart b/lib/common/extensions/text_style_extension.dart index f640b1b5..fe9b539d 100644 --- a/lib/common/extensions/text_style_extension.dart +++ b/lib/common/extensions/text_style_extension.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; + import 'color_extension.dart'; /// Extensions on the [TextStyle] class. diff --git a/lib/common/navigation/enums/editor/editor_deleted_menu_option.dart b/lib/common/navigation/enums/editor/editor_deleted_menu_option.dart index 72b51764..29bcfb2f 100644 --- a/lib/common/navigation/enums/editor/editor_deleted_menu_option.dart +++ b/lib/common/navigation/enums/editor/editor_deleted_menu_option.dart @@ -48,9 +48,8 @@ enum EditorDeletedMenuOption { leading: Icon(icon, color: dangerous ? Theme.of(context).colorScheme.error : null), title: Text( title(context), - style: Theme.of( - context, - ).textTheme.titleSmall?.copyWith(color: dangerous ? Theme.of(context).colorScheme.error : null), + style: Theme.of(context).textTheme.titleSmall + ?.copyWith(color: dangerous ? Theme.of(context).colorScheme.error : null), ), ), ); diff --git a/lib/common/navigation/enums/labels/selection_labels_menu_option.dart b/lib/common/navigation/enums/labels/selection_labels_menu_option.dart index ded584a8..b49b08e3 100644 --- a/lib/common/navigation/enums/labels/selection_labels_menu_option.dart +++ b/lib/common/navigation/enums/labels/selection_labels_menu_option.dart @@ -55,9 +55,8 @@ enum SelectionLabelsMenuOption { leading: Icon(icon, color: dangerous ? Theme.of(context).colorScheme.error : null), title: Text( title(context), - style: Theme.of( - context, - ).textTheme.titleSmall?.copyWith(color: dangerous ? Theme.of(context).colorScheme.error : null), + style: Theme.of(context).textTheme.titleSmall + ?.copyWith(color: dangerous ? Theme.of(context).colorScheme.error : null), ), ), ); diff --git a/lib/common/navigation/enums/notes/selection_deleted_menu_option.dart b/lib/common/navigation/enums/notes/selection_deleted_menu_option.dart index 0018da60..df4dad56 100644 --- a/lib/common/navigation/enums/notes/selection_deleted_menu_option.dart +++ b/lib/common/navigation/enums/notes/selection_deleted_menu_option.dart @@ -45,9 +45,8 @@ enum SelectionDeletedMenuOption { leading: Icon(icon, color: dangerous ? Theme.of(context).colorScheme.error : null), title: Text( title(context), - style: Theme.of( - context, - ).textTheme.titleSmall?.copyWith(color: dangerous ? Theme.of(context).colorScheme.error : null), + style: Theme.of(context).textTheme.titleSmall + ?.copyWith(color: dangerous ? Theme.of(context).colorScheme.error : null), ), ), ); diff --git a/lib/common/preferences/enums/swipe_actions/archived_swipe_action.dart b/lib/common/preferences/enums/swipe_actions/archived_swipe_action.dart index 5ec8d74d..68b4ae51 100644 --- a/lib/common/preferences/enums/swipe_actions/archived_swipe_action.dart +++ b/lib/common/preferences/enums/swipe_actions/archived_swipe_action.dart @@ -94,9 +94,8 @@ enum ArchivedSwipeAction { Widget titleWidget(BuildContext context) { return Text( title(context), - style: Theme.of( - context, - ).textTheme.titleMedium?.copyWith(color: Theme.of(context).colorScheme.onTertiaryContainer), + style: Theme.of(context).textTheme.titleMedium + ?.copyWith(color: Theme.of(context).colorScheme.onTertiaryContainer), ); } diff --git a/lib/common/preferences/enums/swipe_actions/available_swipe_action.dart b/lib/common/preferences/enums/swipe_actions/available_swipe_action.dart index 7fa7866f..835dd04e 100644 --- a/lib/common/preferences/enums/swipe_actions/available_swipe_action.dart +++ b/lib/common/preferences/enums/swipe_actions/available_swipe_action.dart @@ -165,9 +165,8 @@ enum AvailableSwipeAction { Widget titleWidget(BuildContext context) { return Text( title(context), - style: Theme.of( - context, - ).textTheme.titleMedium?.copyWith(color: Theme.of(context).colorScheme.onTertiaryContainer), + style: Theme.of(context).textTheme.titleMedium + ?.copyWith(color: Theme.of(context).colorScheme.onTertiaryContainer), ); } diff --git a/lib/common/preferences/enums/swipe_actions/label_swipe_action.dart b/lib/common/preferences/enums/swipe_actions/label_swipe_action.dart index 7b13972e..a5321e1c 100644 --- a/lib/common/preferences/enums/swipe_actions/label_swipe_action.dart +++ b/lib/common/preferences/enums/swipe_actions/label_swipe_action.dart @@ -181,9 +181,8 @@ enum LabelSwipeAction { Widget titleWidget(BuildContext context) { return Text( title(context), - style: Theme.of( - context, - ).textTheme.titleMedium?.copyWith(color: Theme.of(context).colorScheme.onTertiaryContainer), + style: Theme.of(context).textTheme.titleMedium + ?.copyWith(color: Theme.of(context).colorScheme.onTertiaryContainer), ); } diff --git a/lib/common/preferences/preferences_wrapper.dart b/lib/common/preferences/preferences_wrapper.dart index 00388f41..e72aaa68 100644 --- a/lib/common/preferences/preferences_wrapper.dart +++ b/lib/common/preferences/preferences_wrapper.dart @@ -65,13 +65,12 @@ class PreferencesWrapper { } return switch (T) { - == bool => _preferences.getBool(preferenceKey.name), - == int => _preferences.getInt(preferenceKey.name), - == double => _preferences.getDouble(preferenceKey.name), - == String => _preferences.getString(preferenceKey.name), - _ => throw ArgumentError('Invalid preference type: $T'), - } - as T?; + == bool => _preferences.getBool(preferenceKey.name), + == int => _preferences.getInt(preferenceKey.name), + == double => _preferences.getDouble(preferenceKey.name), + == String => _preferences.getString(preferenceKey.name), + _ => throw ArgumentError('Invalid preference type: $T'), + } as T?; } // On type conversion error, reset the preference to its default value on TypeError catch (error) { diff --git a/lib/common/widgets/placeholders/empty_placeholder.dart b/lib/common/widgets/placeholders/empty_placeholder.dart index d7e08bfc..2d27b2fa 100644 --- a/lib/common/widgets/placeholders/empty_placeholder.dart +++ b/lib/common/widgets/placeholders/empty_placeholder.dart @@ -54,9 +54,8 @@ class EmptyPlaceholder extends StatelessWidget { Padding(padding: Paddings.vertical(16)), Text( text!, - style: Theme.of( - context, - ).textTheme.headlineSmall?.copyWith(color: Theme.of(context).colorScheme.onSurfaceVariant), + style: Theme.of(context).textTheme.headlineSmall + ?.copyWith(color: Theme.of(context).colorScheme.onSurfaceVariant), ), ], ), diff --git a/lib/providers/preferences/preferences_provider.dart b/lib/providers/preferences/preferences_provider.dart index 86a389d1..1530ce34 100644 --- a/lib/providers/preferences/preferences_provider.dart +++ b/lib/providers/preferences/preferences_provider.dart @@ -1,4 +1,5 @@ import '../../common/preferences/watched_preferences.dart'; + import 'package:riverpod_annotation/riverpod_annotation.dart'; part 'preferences_provider.g.dart'; From 6ea61c96e0b639c25792f4607d414c6ef427774d Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 11 Nov 2026 10:41:10 +0000 Subject: [PATCH 3/9] fix(backup): await the default directory when the location is lost The new analyzer reports a Future returned without await inside a try block: an error in setAutoExportDirectoryToDefault would be caught by the wrong handler. It is now awaited, then the method returns. Refs #591 Co-Authored-By: Claude --- lib/services/backup/auto_backup_service.dart | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/services/backup/auto_backup_service.dart b/lib/services/backup/auto_backup_service.dart index 636a2bb6..b15095f5 100644 --- a/lib/services/backup/auto_backup_service.dart +++ b/lib/services/backup/auto_backup_service.dart @@ -56,7 +56,9 @@ class AutoExportUtils { logger.w('The automatic export directory selected by the user is no longer accessible, using the default one'); isAutoExportDirectoryLost = true; - return setAutoExportDirectoryToDefault(); + await setAutoExportDirectoryToDefault(); + + return; } } catch (exception, stackTrace) { logger.e(exception.toString(), exception, stackTrace); From a35106158e5246b7853b076ea691b6843ddfffef Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 11 Nov 2026 10:41:10 +0000 Subject: [PATCH 4/9] chore(lint): use the riverpod_lint rule name in the ignore comments riverpod_lint is an analyzer plugin now, so its rules are ignored by their plugin name, riverpod_lint/avoid_ref_inside_state_dispose. Refs #591 Co-Authored-By: Claude --- lib/pages/editor/editor_page.dart | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/pages/editor/editor_page.dart b/lib/pages/editor/editor_page.dart index d6185183..7d97856e 100644 --- a/lib/pages/editor/editor_page.dart +++ b/lib/pages/editor/editor_page.dart @@ -64,12 +64,12 @@ class _EditorState extends ConsumerState { savePendingNote(globalRef); - // ignore: avoid_ref_inside_state_dispose + // ignore: riverpod_lint/avoid_ref_inside_state_dispose globalRef.read(notesProvider(status: NoteStatus.available).notifier).removeEmpty(); - // ignore: avoid_ref_inside_state_dispose + // ignore: riverpod_lint/avoid_ref_inside_state_dispose globalRef.read(notesProvider(status: NoteStatus.archived).notifier).removeEmpty(); if (currentLabelFilter != null) { - // ignore: avoid_ref_inside_state_dispose + // ignore: riverpod_lint/avoid_ref_inside_state_dispose globalRef.read(notesProvider(status: NoteStatus.available, label: currentLabelFilter).notifier).removeEmpty(); } From 21067a64b3f67bbc4403874500c8867e2c7f93af Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 11 Nov 2026 10:52:42 +0000 Subject: [PATCH 5/9] build(android): update Gradle, the Android Gradle Plugin and Kotlin Gradle 8.13 does not run on Java 25 (the JDK of recent Android Studio versions): the build fails with "Unsupported class file major version 69". Gradle 9.3.1 runs on it, and it is the version the Flutter 3.47 templates use with Android Gradle Plugin 9.1.0 and Kotlin 2.4.0. The distributionSha256Sum line is removed: the checksum could not be fetched in the environment of this change. Gradle regenerates it with `gradle wrapper --gradle-version 9.3.1`. The NDK (27.3, also in .ndk-version for the Isar build) and the Java 17 target are unchanged. Refs #591 Co-Authored-By: Claude --- android/gradle/wrapper/gradle-wrapper.properties | 3 +-- android/settings.gradle | 4 ++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index 52dc9895..a20f2c46 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -2,5 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-all.zip -distributionSha256Sum=fba8464465835e74f7270bbf43d6d8a8d7709ab0a43ce1aa3323f73e9aa0c612 +distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.1-all.zip diff --git a/android/settings.gradle b/android/settings.gradle index 5f1a19e6..71c67931 100644 --- a/android/settings.gradle +++ b/android/settings.gradle @@ -18,8 +18,8 @@ pluginManagement { plugins { id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version '8.13.2' apply false - id "org.jetbrains.kotlin.android" version "2.1.0" apply false + id "com.android.application" version '9.1.0' apply false + id "org.jetbrains.kotlin.android" version "2.4.0" apply false } include ":app" From 1995209cda7241159f9a991e62c91ebdad3eab96 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 11 Nov 2026 11:11:30 +0000 Subject: [PATCH 6/9] build(android): restore the checksum of the Gradle distribution The checksum of gradle-9.3.1-all.zip was removed because it could not be fetched here. It is the one published by Gradle, and the wrapper checks the download against it again. Refs #591 Co-Authored-By: Claude --- android/gradle/wrapper/gradle-wrapper.properties | 1 + 1 file changed, 1 insertion(+) diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index a20f2c46..7abf6a8e 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -3,3 +3,4 @@ distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.1-all.zip +distributionSha256Sum=17f277867f6914d61b1aa02efab1ba7bb439ad652ca485cd8ca6842fccec6e43 From 00b1a979be6f84698d1fbd291abdb01cf790e3fc Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 13 Nov 2026 08:46:26 +0000 Subject: [PATCH 7/9] fix(editor): wait for the add note FAB to close before opening the editor The expandable FAB wraps its buttons in a FocusScope while it is not fully closed, and removes it when its 250 ms closing animation ends. Closing the FAB and pushing the editor in the same frame (#583) made the editor take the focus first, then lose it, and the keyboard closed, when the animation ended. closeAddNoteFabIfOpen() now returns whether the FAB started to close, and the FAB waits for its closing animation (with a timeout, in case it cannot complete) before adding the note. Refs #593 Co-Authored-By: Claude --- lib/common/actions/notes/pop.dart | 9 +++++++- lib/pages/notes/widgets/add_note_fab.dart | 28 +++++++++++++++++++---- 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/lib/common/actions/notes/pop.dart b/lib/common/actions/notes/pop.dart index d6c39d85..a60ba876 100644 --- a/lib/common/actions/notes/pop.dart +++ b/lib/common/actions/notes/pop.dart @@ -3,10 +3,17 @@ import '../../constants/constants.dart'; /// Closes the expandable FAB to add a note if it is open. /// /// Handles both the FAB of the notes page and the one of the label pages. -void closeAddNoteFabIfOpen() { +/// +/// Returns whether the FAB was open and has started to close. +bool closeAddNoteFabIfOpen() { + var closing = false; + for (final fabKey in [addNoteFabKey, labeledAddNoteFabKey]) { if (fabKey.currentState != null && fabKey.currentState!.isOpen) { fabKey.currentState!.toggle(); + closing = true; } } + + return closing; } diff --git a/lib/pages/notes/widgets/add_note_fab.dart b/lib/pages/notes/widgets/add_note_fab.dart index 8a53ede8..2a9ab116 100644 --- a/lib/pages/notes/widgets/add_note_fab.dart +++ b/lib/pages/notes/widgets/add_note_fab.dart @@ -1,3 +1,5 @@ +import 'dart:async'; + import 'package:flutter/material.dart'; import 'package:flutter_expandable_fab/flutter_expandable_fab.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; @@ -23,20 +25,36 @@ class AddNoteFab extends ConsumerStatefulWidget { } class _AddNoteFabState extends ConsumerState { + /// Completed when the FAB has finished closing. + Completer? closedCompleter; + void onOpen() { canPopNotifier.update(); } void onClose() { canPopNotifier.update(); + + closedCompleter?.complete(); + closedCompleter = null; } - void onPressed(NoteType noteType) { - // Close the FAB before opening the editor, otherwise closing it during the transition removes the focus - // from the editor and closes the keyboard - closeAddNoteFabIfOpen(); + Future onPressed(NoteType noteType) async { + // Wait for the FAB to be fully closed before opening the editor. + // When the closing animation ends, the FAB removes its focus scope, which unfocuses the editor + // if it was focused in the meantime, and closes the keyboard. + final completer = closedCompleter = Completer(); + if (closeAddNoteFabIfOpen()) { + // The timeout makes sure that the note is still added if the animation could not be completed + await completer.future.timeout(const Duration(milliseconds: 500), onTimeout: () {}); + } + closedCompleter = null; + + if (!mounted) { + return; + } - addNote(context, ref, noteType: noteType); + await addNote(context, ref, noteType: noteType); } @override From d81623bdad6ff6db3031e754983e52b089d9a19b Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 13 Nov 2026 09:11:16 +0000 Subject: [PATCH 8/9] fix(editor): stop the add note FAB from taking the focus when it closes The previous commit waited for the FAB to finish closing before opening the editor, which delayed the editor by the length of the animation. The real cause is the `autofocus: true` of the buttons that open and close the expandable FAB (`RotateFloatingActionButtonBuilder` of flutter_expandable_fab). When the closing animation ends, the FAB removes its FocusScope and builds its buttons again, and the autofocus makes its button take the focus, which removes it from the editor and closes the keyboard. The FAB now uses its own toggle button, identical but without autofocus, and the editor opens immediately again. Refs #593 Co-Authored-By: Claude --- lib/common/actions/notes/pop.dart | 9 +--- lib/pages/notes/widgets/add_note_fab.dart | 57 +++++++++++------------ 2 files changed, 29 insertions(+), 37 deletions(-) diff --git a/lib/common/actions/notes/pop.dart b/lib/common/actions/notes/pop.dart index a60ba876..d6c39d85 100644 --- a/lib/common/actions/notes/pop.dart +++ b/lib/common/actions/notes/pop.dart @@ -3,17 +3,10 @@ import '../../constants/constants.dart'; /// Closes the expandable FAB to add a note if it is open. /// /// Handles both the FAB of the notes page and the one of the label pages. -/// -/// Returns whether the FAB was open and has started to close. -bool closeAddNoteFabIfOpen() { - var closing = false; - +void closeAddNoteFabIfOpen() { for (final fabKey in [addNoteFabKey, labeledAddNoteFabKey]) { if (fabKey.currentState != null && fabKey.currentState!.isOpen) { fabKey.currentState!.toggle(); - closing = true; } } - - return closing; } diff --git a/lib/pages/notes/widgets/add_note_fab.dart b/lib/pages/notes/widgets/add_note_fab.dart index 2a9ab116..abe00844 100644 --- a/lib/pages/notes/widgets/add_note_fab.dart +++ b/lib/pages/notes/widgets/add_note_fab.dart @@ -1,4 +1,4 @@ -import 'dart:async'; +import 'dart:math' as math; import 'package:flutter/material.dart'; import 'package:flutter_expandable_fab/flutter_expandable_fab.dart'; @@ -25,36 +25,41 @@ class AddNoteFab extends ConsumerStatefulWidget { } class _AddNoteFabState extends ConsumerState { - /// Completed when the FAB has finished closing. - Completer? closedCompleter; - void onOpen() { canPopNotifier.update(); } void onClose() { canPopNotifier.update(); - - closedCompleter?.complete(); - closedCompleter = null; } - Future onPressed(NoteType noteType) async { - // Wait for the FAB to be fully closed before opening the editor. - // When the closing animation ends, the FAB removes its focus scope, which unfocuses the editor - // if it was focused in the meantime, and closes the keyboard. - final completer = closedCompleter = Completer(); - if (closeAddNoteFabIfOpen()) { - // The timeout makes sure that the note is still added if the animation could not be completed - await completer.future.timeout(const Duration(milliseconds: 500), onTimeout: () {}); - } - closedCompleter = null; + /// Builds the button that opens or closes the FAB, rotated according to the [progress] of the animation. + /// + /// It replaces the `RotateFloatingActionButtonBuilder` of the package, whose buttons are built with + /// `autofocus: true`: when the FAB finishes closing, its button is built again and takes the focus, + /// which removes it from the editor that was opened in the meantime and closes the keyboard. + FloatingActionButtonBuilder buildToggleButton({required String heroTag, required IconData icon}) { + return FloatingActionButtonBuilder( + // Size of a regular floating action button + size: 56, + builder: (context, onPressed, progress) { + return AnimatedBuilder( + animation: progress, + builder: (context, _) { + return Transform.rotate( + angle: progress.value * math.pi / 2, + child: FloatingActionButton(heroTag: heroTag, onPressed: onPressed, child: Icon(icon)), + ); + }, + ); + }, + ); + } - if (!mounted) { - return; - } + void onPressed(NoteType noteType) { + closeAddNoteFabIfOpen(); - await addNote(context, ref, noteType: noteType); + addNote(context, ref, noteType: noteType); } @override @@ -72,14 +77,8 @@ class _AddNoteFabState extends ConsumerState { type: ExpandableFabType.up, childrenAnimation: ExpandableFabAnimation.none, distance: 64, - openButtonBuilder: RotateFloatingActionButtonBuilder( - heroTag: '', - child: const Icon(Icons.add), - ), - closeButtonBuilder: RotateFloatingActionButtonBuilder( - heroTag: '', - child: const Icon(Icons.close), - ), + openButtonBuilder: buildToggleButton(heroTag: '', icon: Icons.add), + closeButtonBuilder: buildToggleButton(heroTag: '', icon: Icons.close), afterOpen: onOpen, afterClose: onClose, children: [ From a366917e8f0652fbac8afd83787cfbbb9f965517 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 13 Nov 2026 09:23:54 +0000 Subject: [PATCH 9/9] refactor(editor): take the size of the FAB toggle button from the theme Use the size constraints of the floating action button theme when it sets them, and the regular size of the package otherwise, instead of a hardcoded 56. Refs #593 Co-Authored-By: Claude --- lib/pages/notes/widgets/add_note_fab.dart | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/pages/notes/widgets/add_note_fab.dart b/lib/pages/notes/widgets/add_note_fab.dart index abe00844..643e0caa 100644 --- a/lib/pages/notes/widgets/add_note_fab.dart +++ b/lib/pages/notes/widgets/add_note_fab.dart @@ -39,9 +39,10 @@ class _AddNoteFabState extends ConsumerState { /// `autofocus: true`: when the FAB finishes closing, its button is built again and takes the focus, /// which removes it from the editor that was opened in the meantime and closes the keyboard. FloatingActionButtonBuilder buildToggleButton({required String heroTag, required IconData icon}) { + final themeSize = Theme.of(context).floatingActionButtonTheme.sizeConstraints?.maxWidth; + return FloatingActionButtonBuilder( - // Size of a regular floating action button - size: 56, + size: themeSize ?? DefaultFloatingActionButtonBuilder().size, builder: (context, onPressed, progress) { return AnimatedBuilder( animation: progress,