From ccd68f34e24f0c417096d6a0ccf5d1ba621cd7e5 Mon Sep 17 00:00:00 2001 From: Brett Morgan Date: Wed, 11 May 2022 12:48:11 -0700 Subject: [PATCH] Beta (#1234) --- .github/workflows/verify-web-demos.yml | 7 +- .../flutter_module_using_plugin/lib/cell.dart | 4 +- .../flutter_module_using_plugin/pubspec.lock | 27 +-- .../books/flutter_module_books/lib/main.dart | 191 ++++++++------- .../flutter_module_books/pigeon/schema.dart | 15 +- .../books/flutter_module_books/pubspec.lock | 22 +- .../books/flutter_module_books/pubspec.yaml | 4 +- .../test/widget_test.dart | 2 +- .../fullscreen/flutter_module/pubspec.lock | 24 +- .../fullscreen/flutter_module/pubspec.yaml | 4 +- .../multiple_flutters_module/lib/main.dart | 2 +- .../multiple_flutters_module/pubspec.lock | 31 +-- .../multiple_flutters_module/pubspec.yaml | 4 +- .../flutter_module_using_plugin/lib/cell.dart | 31 +-- .../flutter_module_using_plugin/lib/main.dart | 6 +- .../flutter_module_using_plugin/pubspec.lock | 31 +-- .../flutter_module_using_plugin/pubspec.yaml | 4 +- .../flutter_module/lib/main.dart | 6 +- .../flutter_module/pubspec.lock | 24 +- .../flutter_module/pubspec.yaml | 4 +- android_splash_screen/lib/main.dart | 2 +- android_splash_screen/pubspec.yaml | 6 +- animations/lib/main.dart | 1 + .../lib/src/basics/01_animated_container.dart | 2 +- .../src/basics/03_animation_controller.dart | 2 +- animations/lib/src/basics/04_tweens.dart | 2 +- .../lib/src/basics/05_animated_builder.dart | 2 +- .../lib/src/basics/06_custom_tween.dart | 12 +- .../lib/src/basics/07_tween_sequence.dart | 2 +- .../lib/src/basics/08_fade_transition.dart | 2 +- animations/lib/src/misc/animated_list.dart | 2 +- .../lib/src/misc/animated_positioned.dart | 4 +- .../lib/src/misc/animated_switcher.dart | 4 +- animations/lib/src/misc/card_swipe.dart | 4 +- animations/lib/src/misc/carousel.dart | 2 +- animations/lib/src/misc/curved_animation.dart | 2 +- animations/lib/src/misc/expand_card.dart | 2 +- .../lib/src/misc/physics_card_drag.dart | 2 +- .../lib/src/misc/repeating_animation.dart | 4 +- .../linux/flutter/generated_plugins.cmake | 8 + animations/macos/Podfile.lock | 2 +- animations/pubspec.lock | 6 +- animations/pubspec.yaml | 4 +- .../fluent_ui/analysis_options.yaml | 3 + .../lib/src/widgets/photo_details.dart | 2 +- .../lib/src/widgets/unsplash_notice.dart | 2 +- .../linux/flutter/generated_plugins.cmake | 8 + desktop_photo_search/fluent_ui/pubspec.lock | 54 ++--- desktop_photo_search/fluent_ui/pubspec.yaml | 5 +- .../windows/flutter/generated_plugins.cmake | 8 + .../material/analysis_options.yaml | 3 + .../lib/src/widgets/photo_details.dart | 2 +- .../lib/src/widgets/unsplash_notice.dart | 2 +- .../linux/flutter/generated_plugins.cmake | 8 + desktop_photo_search/material/pubspec.lock | 54 ++--- desktop_photo_search/material/pubspec.yaml | 5 +- .../windows/flutter/generated_plugins.cmake | 8 + .../federated_plugin/example/pubspec.lock | 26 +-- .../windows/flutter/generated_plugins.cmake | 8 + .../federated_plugin/pubspec.lock | 30 +-- .../federated_plugin/pubspec.yaml | 5 +- .../federated_plugin_macos/pubspec.lock | 28 +-- .../federated_plugin_macos/pubspec.yaml | 5 +- .../pubspec.lock | 28 +-- .../pubspec.yaml | 5 +- .../federated_plugin_web/pubspec.lock | 35 ++- .../federated_plugin_web/pubspec.yaml | 5 +- .../federated_plugin_windows/pubspec.lock | 28 +-- .../federated_plugin_windows/pubspec.yaml | 5 +- experimental/linting_tool/lib/app.dart | 2 +- .../lib/model/profiles_store.dart | 1 + .../linting_tool/lib/model/rules_store.dart | 10 +- .../lib/pages/saved_lints_page.dart | 14 +- .../lib/widgets/adaptive_nav.dart | 10 +- .../lib/widgets/lint_expansion_tile.dart | 36 ++- .../lib/widgets/saved_rule_tile.dart | 2 +- .../linux/flutter/generated_plugins.cmake | 8 + experimental/linting_tool/macos/Podfile.lock | 6 +- experimental/linting_tool/pubspec.lock | 50 ++-- experimental/linting_tool/pubspec.yaml | 6 +- .../windows/flutter/generated_plugins.cmake | 8 + experimental/web_dashboard/lib/src/app.dart | 4 +- .../web_dashboard/lib/src/pages/entries.dart | 22 +- .../web_dashboard/lib/src/pages/home.dart | 2 +- .../web_dashboard/lib/src/pages/sign_in.dart | 2 +- .../lib/src/widgets/categories_dropdown.dart | 4 +- .../lib/src/widgets/category_forms.dart | 4 +- .../lib/src/widgets/dialogs.dart | 2 +- .../lib/src/widgets/edit_entry.dart | 4 +- .../third_party/adaptive_scaffold.dart | 2 +- experimental/web_dashboard/pubspec.lock | 14 +- experimental/web_dashboard/pubspec.yaml | 20 +- experimental/web_dashboard/tool/grind.dart | 4 +- flutter_maps_firestore/pubspec.lock | 24 +- flutter_maps_firestore/pubspec.yaml | 4 +- form_app/lib/src/autofill.dart | 2 +- form_app/lib/src/form_widgets.dart | 4 +- form_app/lib/src/sign_in_http.dart | 2 +- form_app/lib/src/validation.dart | 2 +- .../linux/flutter/generated_plugins.cmake | 8 + form_app/pubspec.lock | 8 +- form_app/pubspec.yaml | 4 +- .../lib/src/app_lifecycle/app_lifecycle.dart | 4 +- game_template/pubspec.lock | 86 +++---- .../windows/flutter/generated_plugins.cmake | 8 + .../linux/flutter/generated_plugins.cmake | 8 + infinite_list/pubspec.lock | 27 +-- infinite_list/pubspec.yaml | 5 +- .../windows/flutter/generated_plugins.cmake | 8 + ios_app_clip/lib/main.dart | 4 +- ios_app_clip/pubspec.lock | 27 +-- ios_app_clip/pubspec.yaml | 4 +- isolate_example/lib/data_transfer_page.dart | 10 +- .../lib/infinite_process_page.dart | 10 +- isolate_example/lib/performance_page.dart | 18 +- .../linux/flutter/generated_plugins.cmake | 8 + isolate_example/pubspec.lock | 27 +-- isolate_example/pubspec.yaml | 4 +- .../windows/flutter/generated_plugins.cmake | 8 + .../linux/flutter/generated_plugins.cmake | 8 + jsonexample/pubspec.lock | 42 ++-- jsonexample/pubspec.yaml | 4 +- .../windows/flutter/generated_plugins.cmake | 8 + .../lib/color_palettes_screen.dart | 18 +- material_3_demo/lib/component_screen.dart | 106 +++++---- navigation_and_routing/lib/src/app.dart | 2 +- .../lib/src/screens/books.dart | 2 +- .../lib/src/screens/navigator.dart | 2 +- .../lib/src/screens/settings.dart | 2 +- .../lib/src/screens/sign_in.dart | 2 +- navigation_and_routing/pubspec.lock | 6 +- navigation_and_routing/pubspec.yaml | 10 +- null_safety/null_safe_app/pubspec.lock | 28 +-- null_safety/null_safe_app/pubspec.yaml | 5 +- .../windows/flutter/generated_plugins.cmake | 8 + null_safety/null_unsafe_app/pubspec.lock | 27 +-- null_safety/null_unsafe_app/pubspec.yaml | 2 +- .../windows/flutter/generated_plugins.cmake | 8 + place_tracker/lib/place_details.dart | 4 +- place_tracker/lib/place_list.dart | 14 +- place_tracker/lib/place_map.dart | 29 ++- place_tracker/pubspec.lock | 6 +- place_tracker/pubspec.yaml | 4 +- .../lib/src/add_pet_details.dart | 2 +- .../lib/src/event_channel_demo.dart | 6 +- .../lib/src/method_channel_demo.dart | 2 +- .../lib/src/pet_list_screen.dart | 24 +- .../lib/src/platform_image_demo.dart | 2 +- platform_channels/pubspec.lock | 27 +-- platform_channels/pubspec.yaml | 4 +- .../test/src/event_channel_demo_test.dart | 10 +- platform_design/lib/main.dart | 2 +- platform_design/lib/news_tab.dart | 2 +- platform_design/lib/profile_tab.dart | 4 +- platform_design/lib/settings_tab.dart | 2 +- platform_design/lib/songs_tab.dart | 6 +- platform_design/pubspec.lock | 27 +-- platform_design/pubspec.yaml | 4 +- platform_view_swift/lib/main.dart | 12 +- platform_view_swift/pubspec.lock | 27 +-- platform_view_swift/pubspec.yaml | 4 +- provider_counter/pubspec.lock | 27 +-- provider_counter/pubspec.yaml | 5 +- provider_shopper/lib/screens/login.dart | 2 +- .../linux/flutter/generated_plugins.cmake | 8 + provider_shopper/pubspec.lock | 6 +- provider_shopper/pubspec.yaml | 4 +- simplistic_calculator/lib/main.dart | 1 + .../linux/flutter/generated_plugins.cmake | 8 + simplistic_calculator/pubspec.lock | 25 +- simplistic_calculator/typer/main_66.dart | 1 + simplistic_calculator/typer/main_67.dart | 1 + simplistic_calculator/typer/main_68.dart | 1 + simplistic_calculator/typer/main_69.dart | 1 + simplistic_calculator/typer/main_70.dart | 1 + simplistic_calculator/typer/main_71.dart | 1 + simplistic_calculator/typer/main_72.dart | 1 + simplistic_calculator/typer/main_73.dart | 1 + simplistic_calculator/typer/main_74.dart | 1 + simplistic_calculator/typer/main_75.dart | 1 + simplistic_calculator/typer/main_76.dart | 1 + simplistic_calculator/typer/main_77.dart | 1 + simplistic_calculator/typer/main_78.dart | 1 + simplistic_calculator/typer/main_79.dart | 1 + simplistic_calculator/typer/main_80.dart | 1 + simplistic_calculator/typer/main_81.dart | 1 + simplistic_calculator/typer/main_82.dart | 1 + simplistic_calculator/typer/main_83.dart | 1 + simplistic_calculator/typer/main_84.dart | 1 + simplistic_calculator/typer/main_85.dart | 1 + simplistic_calculator/typer/main_86.dart | 1 + simplistic_calculator/typer/main_87.dart | 1 + simplistic_calculator/typer/main_88.dart | 1 + simplistic_calculator/typer/main_89.dart | 1 + simplistic_calculator/typer/main_90.dart | 1 + simplistic_calculator/typer/main_92.dart | 1 + simplistic_calculator/typer/main_93.dart | 1 + simplistic_calculator/typer/main_94.dart | 1 + .../windows/flutter/generated_plugins.cmake | 8 + simplistic_editor/lib/basic_text_field.dart | 27 ++- .../lib/basic_text_input_client.dart | 195 ++++++++++------ simplistic_editor/lib/main.dart | 159 +++++++------ simplistic_editor/lib/replacements.dart | 221 ++++++++++-------- .../text_editing_delta_history_manager.dart | 21 +- .../lib/toggle_button_state_manager.dart | 40 ++-- simplistic_editor/test/main_screen_test.dart | 89 +++---- testing_app/integration_test/perf_test.dart | 3 +- .../linux/flutter/generated_plugins.cmake | 8 + testing_app/pubspec.lock | 47 ++-- testing_app/pubspec.yaml | 4 +- .../windows/flutter/generated_plugins.cmake | 8 + tool/flutter_ci_script_beta.sh | 25 +- tool/flutter_ci_script_stable.sh | 6 +- veggieseasons/lib/screens/details.dart | 2 +- veggieseasons/lib/screens/search.dart | 7 +- veggieseasons/lib/screens/settings.dart | 10 +- veggieseasons/lib/widgets/close_button.dart | 9 +- veggieseasons/lib/widgets/settings_item.dart | 4 +- veggieseasons/lib/widgets/trivia.dart | 2 +- veggieseasons/lib/widgets/veggie_card.dart | 2 +- veggieseasons/pubspec.lock | 30 +-- veggieseasons/pubspec.yaml | 4 +- web/_tool/verify_packages.dart | 2 + .../lib/behaviors/selection_user_managed.dart | 2 +- web/charts/lib/behaviors/slider.dart | 2 +- web/charts/lib/gallery_scaffold.dart | 4 +- web/charts/lib/main.dart | 4 +- web/charts/pubspec.lock | 6 +- web/charts/pubspec.yaml | 6 +- web/game_template | 1 + web/github_dataviz/lib/layered_chart.dart | 14 +- web/github_dataviz/lib/main.dart | 2 +- web/github_dataviz/lib/timeline.dart | 16 +- web/github_dataviz/pubspec.lock | 6 +- web/github_dataviz/pubspec.yaml | 4 +- web/particle_background/lib/main.dart | 2 +- .../lib/simple_animations_package.dart | 16 +- web/particle_background/pubspec.lock | 6 +- web/particle_background/pubspec.yaml | 4 +- web/samples_index/lib/src/samples.yaml | 48 +++- .../web/images/level_selector.png | Bin 0 -> 55013 bytes .../web/images/loading_screen.png | Bin 0 -> 94729 bytes 242 files changed, 1724 insertions(+), 1435 deletions(-) create mode 120000 web/game_template create mode 100644 web/samples_index/web/images/level_selector.png create mode 100644 web/samples_index/web/images/loading_screen.png diff --git a/.github/workflows/verify-web-demos.yml b/.github/workflows/verify-web-demos.yml index 7329aa694..1db6e7b0c 100644 --- a/.github/workflows/verify-web-demos.yml +++ b/.github/workflows/verify-web-demos.yml @@ -8,6 +8,11 @@ jobs: verify-web-demos: runs-on: ubuntu-latest if: github.repository == 'flutter/samples' + strategy: + matrix: + flutter_version: + - stable + - beta steps: - name: Checkout uses: actions/checkout@d171c3b028d844f2bf14e9fdec0c58114451e4bf @@ -16,7 +21,7 @@ jobs: fetch-depth: 0 - uses: subosito/flutter-action@d8687e6979e8ef66d2b2970e2c92c1d8e801d7bf with: - channel: stable + channel: ${{ matrix.flutter_version }} - name: Init scripts run: dart pub get working-directory: web/_tool diff --git a/add_to_app/android_view/flutter_module_using_plugin/lib/cell.dart b/add_to_app/android_view/flutter_module_using_plugin/lib/cell.dart index 98bf686e8..15e6da3c8 100644 --- a/add_to_app/android_view/flutter_module_using_plugin/lib/cell.dart +++ b/add_to_app/android_view/flutter_module_using_plugin/lib/cell.dart @@ -41,13 +41,13 @@ class _CellState extends State with WidgetsBindingObserver { } }); // Keep track of what the current platform lifecycle state is. - WidgetsBinding.instance!.addObserver(this); + WidgetsBinding.instance.addObserver(this); super.initState(); } @override void dispose() { - WidgetsBinding.instance!.removeObserver(this); + WidgetsBinding.instance.removeObserver(this); super.dispose(); } diff --git a/add_to_app/android_view/flutter_module_using_plugin/pubspec.lock b/add_to_app/android_view/flutter_module_using_plugin/pubspec.lock index 4776949f3..a948f2b3f 100644 --- a/add_to_app/android_view/flutter_module_using_plugin/pubspec.lock +++ b/add_to_app/android_view/flutter_module_using_plugin/pubspec.lock @@ -42,14 +42,14 @@ packages: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.15.0" + version: "1.16.0" fake_async: dependency: transitive description: name: fake_async url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.3.0" flutter: dependency: "direct main" description: flutter @@ -78,7 +78,7 @@ packages: name: js url: "https://pub.dartlang.org" source: hosted - version: "0.6.3" + version: "0.6.4" lints: dependency: transitive description: @@ -99,7 +99,7 @@ packages: name: material_color_utilities url: "https://pub.dartlang.org" source: hosted - version: "0.1.3" + version: "0.1.4" meta: dependency: transitive description: @@ -120,7 +120,7 @@ packages: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.8.0" + version: "1.8.1" plugin_platform_interface: dependency: transitive description: @@ -153,7 +153,7 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.8.1" + version: "1.8.2" stack_trace: dependency: transitive description: @@ -188,14 +188,7 @@ packages: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.8" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" + version: "0.4.9" url_launcher: dependency: "direct main" description: @@ -209,7 +202,7 @@ packages: name: url_launcher_android url: "https://pub.dartlang.org" source: hosted - version: "6.0.15" + version: "6.0.16" url_launcher_ios: dependency: transitive description: @@ -258,7 +251,7 @@ packages: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.1.1" + version: "2.1.2" sdks: - dart: ">=2.14.0 <3.0.0" + dart: ">=2.17.0-0 <3.0.0" flutter: ">=2.10.0" diff --git a/add_to_app/books/flutter_module_books/lib/main.dart b/add_to_app/books/flutter_module_books/lib/main.dart index 0f15d5b9f..dc0c040e4 100644 --- a/add_to_app/books/flutter_module_books/lib/main.dart +++ b/add_to_app/books/flutter_module_books/lib/main.dart @@ -8,7 +8,7 @@ import 'package:flutter_module_books/api.dart'; void main() => runApp(const MyApp()); class MyApp extends StatelessWidget { - const MyApp({Key key}) : super(key: key); + const MyApp({Key? key}) : super(key: key); @override Widget build(BuildContext context) { @@ -30,30 +30,28 @@ class FlutterBookApiHandler extends FlutterBookApi { @override void displayBookDetails(Book book) { - assert( - book != null, - 'Non-null book expected from FlutterBookApi.displayBookDetails call.', - ); callback(book); } } class BookDetail extends StatefulWidget { - const BookDetail({this.hostApi, this.flutterApi, Key key}) : super(key: key); + const BookDetail({Key? key, this.hostApi, this.flutterApi, this.book}) + : super(key: key); // These are the outgoing and incoming APIs that are here for injection for // tests. - final HostBookApi hostApi; - final FlutterBookApi flutterApi; + final HostBookApi? hostApi; + final FlutterBookApi? flutterApi; + final Book? book; @override - _BookDetailState createState() => _BookDetailState(); + State createState() => _BookDetailState(); } class _BookDetailState extends State { - Book book; + Book? book; - HostBookApi hostApi; + late HostBookApi hostApi; FocusNode textFocusNode = FocusNode(); TextEditingController titleTextController = TextEditingController(); @@ -63,6 +61,7 @@ class _BookDetailState extends State { @override void initState() { super.initState(); + book = widget.book; // This `HostBookApi` class instance lets us make outgoing calls to the // platform. @@ -80,19 +79,19 @@ class _BookDetailState extends State { // This book model is what we're going to return to Kotlin eventually. // Keep it bound to the UI. this.book = book; - titleTextController.text = book.title; + titleTextController.text = book.title ?? ''; titleTextController.addListener(() { - this.book?.title = titleTextController.text; + this.book!.title = titleTextController.text; }); // Subtitle could be null. // TODO(gaaclarke): https://github.com/flutter/flutter/issues/59118. subtitleTextController.text = book.subtitle ?? ''; subtitleTextController.addListener(() { - this.book?.subtitle = subtitleTextController.text; + this.book!.subtitle = subtitleTextController.text; }); - authorTextController.text = book.author; + authorTextController.text = book.author ?? ''; authorTextController.addListener(() { - this.book?.author = authorTextController.text; + this.book!.author = authorTextController.text; }); }); })); @@ -123,10 +122,12 @@ class _BookDetailState extends State { IconButton( icon: const Icon(Icons.check), // Pressing save sends the updated book to the platform. - onPressed: () { - hostApi.finishEditingBook(book); - clear(); - }, + onPressed: book != null + ? () { + hostApi.finishEditingBook(book!); + clear(); + } + : null, ), ], ), @@ -134,70 +135,98 @@ class _BookDetailState extends State { // Draw a spinner until the platform gives us the book to show details // for. ? const Center(child: CircularProgressIndicator()) - : Focus( + : BookForm( + book: book!, focusNode: textFocusNode, - child: ListView( - padding: const EdgeInsets.all(24), - children: [ - TextField( - controller: titleTextController, - decoration: const InputDecoration( - border: OutlineInputBorder(), - filled: true, - hintText: "Title", - labelText: "Title", - ), - ), - const SizedBox(height: 24), - TextField( - controller: subtitleTextController, - maxLines: 2, - decoration: const InputDecoration( - border: OutlineInputBorder(), - filled: true, - hintText: "Subtitle", - labelText: "Subtitle", - ), - ), - const SizedBox(height: 24), - TextField( - controller: authorTextController, - decoration: const InputDecoration( - border: OutlineInputBorder(), - filled: true, - hintText: "Author", - labelText: "Author", - ), - ), - const SizedBox(height: 32), - const Divider(), - Center( - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Text( - '${book.pageCount} pages ~ published ${book.publishDate}'), - ), - ), - const Divider(), - const SizedBox(height: 32), - const Center( - child: Text( - 'BOOK DESCRIPTION', - style: TextStyle( - fontSize: 15, - fontWeight: FontWeight.bold, - decoration: TextDecoration.underline, - ), - ), - ), - const SizedBox(height: 12), - Text( - book.summary, - style: TextStyle(color: Colors.grey.shade600, height: 1.24), - ), - ], + authorTextController: authorTextController, + subtitleTextController: subtitleTextController, + titleTextController: titleTextController, + ), + ); + } +} + +class BookForm extends StatelessWidget { + const BookForm({ + Key? key, + required this.book, + required this.focusNode, + required this.authorTextController, + required this.subtitleTextController, + required this.titleTextController, + }) : super(key: key); + + final Book book; + final FocusNode focusNode; + final TextEditingController titleTextController; + final TextEditingController subtitleTextController; + final TextEditingController authorTextController; + + @override + Widget build(BuildContext context) { + return Focus( + focusNode: focusNode, + child: ListView( + padding: const EdgeInsets.all(24), + children: [ + TextField( + controller: titleTextController, + decoration: const InputDecoration( + border: OutlineInputBorder(), + filled: true, + hintText: "Title", + labelText: "Title", + ), + ), + const SizedBox(height: 24), + TextField( + controller: subtitleTextController, + maxLines: 2, + decoration: const InputDecoration( + border: OutlineInputBorder(), + filled: true, + hintText: "Subtitle", + labelText: "Subtitle", + ), + ), + const SizedBox(height: 24), + TextField( + controller: authorTextController, + decoration: const InputDecoration( + border: OutlineInputBorder(), + filled: true, + hintText: "Author", + labelText: "Author", + ), + ), + const SizedBox(height: 32), + const Divider(), + Center( + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Text( + '${book.pageCount} pages ~ published ${book.publishDate}'), + ), + ), + const Divider(), + const SizedBox(height: 32), + const Center( + child: Text( + 'BOOK DESCRIPTION', + style: TextStyle( + fontSize: 15, + fontWeight: FontWeight.bold, + decoration: TextDecoration.underline, ), ), + ), + const SizedBox(height: 12), + Text( + book.summary ?? '', + style: TextStyle(color: Colors.grey.shade600, height: 1.24), + ), + ], + ), ); } } diff --git a/add_to_app/books/flutter_module_books/pigeon/schema.dart b/add_to_app/books/flutter_module_books/pigeon/schema.dart index 8f02b5114..9203e764e 100644 --- a/add_to_app/books/flutter_module_books/pigeon/schema.dart +++ b/add_to_app/books/flutter_module_books/pigeon/schema.dart @@ -2,22 +2,9 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'package:flutter_module_books/api.dart'; import 'package:pigeon/pigeon.dart'; -class Book { - String title; - String subtitle; - String author; - String summary; - String publishDate; - int pageCount; - Thumbnail thumbnail; -} - -class Thumbnail { - String url; -} - @FlutterApi() abstract class FlutterBookApi { void displayBookDetails(Book book); diff --git a/add_to_app/books/flutter_module_books/pubspec.lock b/add_to_app/books/flutter_module_books/pubspec.lock index 0d444170e..60ba9a11b 100644 --- a/add_to_app/books/flutter_module_books/pubspec.lock +++ b/add_to_app/books/flutter_module_books/pubspec.lock @@ -70,7 +70,7 @@ packages: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.15.0" + version: "1.16.0" convert: dependency: transitive description: @@ -84,14 +84,14 @@ packages: name: crypto url: "https://pub.dartlang.org" source: hosted - version: "3.0.1" + version: "3.0.2" fake_async: dependency: transitive description: name: fake_async url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.3.0" file: dependency: transitive description: @@ -110,7 +110,7 @@ packages: name: flutter_lints url: "https://pub.dartlang.org" source: hosted - version: "1.0.4" + version: "2.0.1" flutter_test: dependency: "direct dev" description: flutter @@ -129,7 +129,7 @@ packages: name: lints url: "https://pub.dartlang.org" source: hosted - version: "1.0.1" + version: "2.0.0" matcher: dependency: transitive description: @@ -143,7 +143,7 @@ packages: name: material_color_utilities url: "https://pub.dartlang.org" source: hosted - version: "0.1.3" + version: "0.1.4" meta: dependency: transitive description: @@ -164,7 +164,7 @@ packages: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.8.0" + version: "1.8.1" pigeon: dependency: "direct dev" description: @@ -190,7 +190,7 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.8.1" + version: "1.8.2" stack_trace: dependency: transitive description: @@ -225,7 +225,7 @@ packages: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.8" + version: "0.4.9" typed_data: dependency: transitive description: @@ -239,7 +239,7 @@ packages: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.1.1" + version: "2.1.2" watcher: dependency: transitive description: @@ -255,4 +255,4 @@ packages: source: hosted version: "3.1.0" sdks: - dart: ">=2.14.0 <3.0.0" + dart: ">=2.17.0-206.0.dev <3.0.0" diff --git a/add_to_app/books/flutter_module_books/pubspec.yaml b/add_to_app/books/flutter_module_books/pubspec.yaml index 38c80c483..98ddc2ee5 100644 --- a/add_to_app/books/flutter_module_books/pubspec.yaml +++ b/add_to_app/books/flutter_module_books/pubspec.yaml @@ -6,7 +6,7 @@ description: A Flutter module using the Pigeon package to demonstrate version: 1.0.0+1 environment: - sdk: ">=2.7.0 <3.0.0" + sdk: ">=2.17.0-0 <3.0.0" dependencies: flutter: @@ -16,7 +16,7 @@ dev_dependencies: pigeon: ">=2.0.2 <4.0.0" flutter_test: sdk: flutter - flutter_lints: ^1.0.4 + flutter_lints: ^2.0.1 flutter: uses-material-design: true diff --git a/add_to_app/books/flutter_module_books/test/widget_test.dart b/add_to_app/books/flutter_module_books/test/widget_test.dart index 6ff5eb5a5..cbf1b8aef 100644 --- a/add_to_app/books/flutter_module_books/test/widget_test.dart +++ b/add_to_app/books/flutter_module_books/test/widget_test.dart @@ -27,7 +27,7 @@ void main() { await tester.pumpWidget( MaterialApp( - home: BookDetail(hostApi: mockHostApi), + home: BookDetail(book: Book(), hostApi: mockHostApi), ), ); diff --git a/add_to_app/fullscreen/flutter_module/pubspec.lock b/add_to_app/fullscreen/flutter_module/pubspec.lock index db1491506..25bf4ff51 100644 --- a/add_to_app/fullscreen/flutter_module/pubspec.lock +++ b/add_to_app/fullscreen/flutter_module/pubspec.lock @@ -7,7 +7,7 @@ packages: name: archive url: "https://pub.dartlang.org" source: hosted - version: "3.1.6" + version: "3.1.11" async: dependency: transitive description: @@ -49,7 +49,7 @@ packages: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.15.0" + version: "1.16.0" crypto: dependency: transitive description: @@ -70,7 +70,7 @@ packages: name: fake_async url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.3.0" file: dependency: transitive description: @@ -94,7 +94,7 @@ packages: name: flutter_lints url: "https://pub.dartlang.org" source: hosted - version: "1.0.4" + version: "2.0.1" flutter_test: dependency: "direct dev" description: flutter @@ -111,7 +111,7 @@ packages: name: lints url: "https://pub.dartlang.org" source: hosted - version: "1.0.1" + version: "2.0.0" matcher: dependency: transitive description: @@ -125,7 +125,7 @@ packages: name: material_color_utilities url: "https://pub.dartlang.org" source: hosted - version: "0.1.3" + version: "0.1.4" meta: dependency: transitive description: @@ -146,7 +146,7 @@ packages: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.8.0" + version: "1.8.1" platform: dependency: transitive description: @@ -179,7 +179,7 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.8.1" + version: "1.8.2" stack_trace: dependency: transitive description: @@ -221,7 +221,7 @@ packages: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.8" + version: "0.4.9" typed_data: dependency: transitive description: @@ -235,14 +235,14 @@ packages: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.1.1" + version: "2.1.2" vm_service: dependency: transitive description: name: vm_service url: "https://pub.dartlang.org" source: hosted - version: "7.5.0" + version: "8.2.2" webdriver: dependency: transitive description: @@ -251,5 +251,5 @@ packages: source: hosted version: "3.0.0" sdks: - dart: ">=2.14.0 <3.0.0" + dart: ">=2.17.0-206.0.dev <3.0.0" flutter: ">=2.0.0" diff --git a/add_to_app/fullscreen/flutter_module/pubspec.yaml b/add_to_app/fullscreen/flutter_module/pubspec.yaml index d9939e359..de393b656 100644 --- a/add_to_app/fullscreen/flutter_module/pubspec.yaml +++ b/add_to_app/fullscreen/flutter_module/pubspec.yaml @@ -4,7 +4,7 @@ description: An example Flutter module. version: 1.0.0+1 environment: - sdk: '>=2.12.0 <3.0.0' + sdk: ">=2.17.0-0 <3.0.0" dependencies: flutter: @@ -17,7 +17,7 @@ dev_dependencies: flutter_driver: sdk: flutter espresso: ^0.2.0 - flutter_lints: ^1.0.3 + flutter_lints: ^2.0.1 flutter: uses-material-design: true diff --git a/add_to_app/multiple_flutters/multiple_flutters_module/lib/main.dart b/add_to_app/multiple_flutters/multiple_flutters_module/lib/main.dart index 237cb11c1..b7a00dcdb 100644 --- a/add_to_app/multiple_flutters/multiple_flutters_module/lib/main.dart +++ b/add_to_app/multiple_flutters/multiple_flutters_module/lib/main.dart @@ -36,7 +36,7 @@ class MyHomePage extends StatefulWidget { final String title; @override - _MyHomePageState createState() => _MyHomePageState(); + State createState() => _MyHomePageState(); } class _MyHomePageState extends State { diff --git a/add_to_app/multiple_flutters/multiple_flutters_module/pubspec.lock b/add_to_app/multiple_flutters/multiple_flutters_module/pubspec.lock index 65f07c52c..780db2036 100644 --- a/add_to_app/multiple_flutters/multiple_flutters_module/pubspec.lock +++ b/add_to_app/multiple_flutters/multiple_flutters_module/pubspec.lock @@ -42,7 +42,7 @@ packages: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.15.0" + version: "1.16.0" cupertino_icons: dependency: "direct main" description: @@ -56,7 +56,7 @@ packages: name: fake_async url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.3.0" flutter: dependency: "direct main" description: flutter @@ -68,7 +68,7 @@ packages: name: flutter_lints url: "https://pub.dartlang.org" source: hosted - version: "1.0.4" + version: "2.0.1" flutter_test: dependency: "direct dev" description: flutter @@ -85,14 +85,14 @@ packages: name: js url: "https://pub.dartlang.org" source: hosted - version: "0.6.3" + version: "0.6.4" lints: dependency: transitive description: name: lints url: "https://pub.dartlang.org" source: hosted - version: "1.0.1" + version: "2.0.0" matcher: dependency: transitive description: @@ -106,7 +106,7 @@ packages: name: material_color_utilities url: "https://pub.dartlang.org" source: hosted - version: "0.1.3" + version: "0.1.4" meta: dependency: transitive description: @@ -120,7 +120,7 @@ packages: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.8.0" + version: "1.8.1" plugin_platform_interface: dependency: transitive description: @@ -139,7 +139,7 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.8.1" + version: "1.8.2" stack_trace: dependency: transitive description: @@ -174,14 +174,7 @@ packages: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.8" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" + version: "0.4.9" url_launcher: dependency: "direct main" description: @@ -195,7 +188,7 @@ packages: name: url_launcher_android url: "https://pub.dartlang.org" source: hosted - version: "6.0.15" + version: "6.0.16" url_launcher_ios: dependency: transitive description: @@ -244,7 +237,7 @@ packages: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.1.1" + version: "2.1.2" sdks: - dart: ">=2.14.0 <3.0.0" + dart: ">=2.17.0-206.0.dev <3.0.0" flutter: ">=2.10.0" diff --git a/add_to_app/multiple_flutters/multiple_flutters_module/pubspec.yaml b/add_to_app/multiple_flutters/multiple_flutters_module/pubspec.yaml index 26b8bed63..8c8fbb757 100644 --- a/add_to_app/multiple_flutters/multiple_flutters_module/pubspec.yaml +++ b/add_to_app/multiple_flutters/multiple_flutters_module/pubspec.yaml @@ -4,7 +4,7 @@ description: A module that is embedded in the multiple_flutters_ios and multiple version: 1.0.0+1 environment: - sdk: '>=2.12.0 <3.0.0' + sdk: ">=2.17.0-0 <3.0.0" dependencies: flutter: @@ -16,7 +16,7 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - flutter_lints: ^1.0.0 + flutter_lints: ^2.0.1 flutter: uses-material-design: true diff --git a/add_to_app/plugin/flutter_module_using_plugin/lib/cell.dart b/add_to_app/plugin/flutter_module_using_plugin/lib/cell.dart index f4ca0b3d7..4c59ffdcd 100644 --- a/add_to_app/plugin/flutter_module_using_plugin/lib/cell.dart +++ b/add_to_app/plugin/flutter_module_using_plugin/lib/cell.dart @@ -15,7 +15,7 @@ void main() { } class Cell extends StatefulWidget { - const Cell({Key key}) : super(key: key); + const Cell({Key? key}) : super(key: key); @override State createState() => _CellState(); @@ -26,8 +26,8 @@ class _CellState extends State with WidgetsBindingObserver { static final AccelerometerEvent defaultPosition = AccelerometerEvent(0, 0, 0); int cellNumber = 0; - Random _random; - AppLifecycleState appLifecycleState; + Random? _random; + AppLifecycleState? appLifecycleState; @override void initState() { @@ -62,8 +62,8 @@ class _CellState extends State with WidgetsBindingObserver { Color randomLightColor() { _random ??= Random(cellNumber); - return Color.fromARGB(255, _random.nextInt(50) + 205, - _random.nextInt(50) + 205, _random.nextInt(50) + 205); + return Color.fromARGB(255, _random!.nextInt(50) + 205, + _random!.nextInt(50) + 205, _random!.nextInt(50) + 205); } @override @@ -113,15 +113,20 @@ class _CellState extends State with WidgetsBindingObserver { : Stream.value(defaultPosition), initialData: defaultPosition, builder: (context, snapshot) { + final data = snapshot.data; + if (data == null) { + return const CircularProgressIndicator.adaptive(); + } return Transform( - // Figure out the phone's orientation relative - // to gravity's direction. Ignore the z vector. - transform: Matrix4.rotationX( - snapshot.data.y / gravity * pi / 2) - ..multiply(Matrix4.rotationY( - snapshot.data.x / gravity * pi / 2)), - alignment: Alignment.center, - child: const FlutterLogo(size: 72)); + // Figure out the phone's orientation relative + // to gravity's direction. Ignore the z vector. + transform: Matrix4.rotationX( + data.y / gravity * pi / 2, + )..multiply( + Matrix4.rotationY(data.x / gravity * pi / 2)), + alignment: Alignment.center, + child: const FlutterLogo(size: 72), + ); }, ), ), diff --git a/add_to_app/plugin/flutter_module_using_plugin/lib/main.dart b/add_to_app/plugin/flutter_module_using_plugin/lib/main.dart index 57a47a700..69aacdc6f 100644 --- a/add_to_app/plugin/flutter_module_using_plugin/lib/main.dart +++ b/add_to_app/plugin/flutter_module_using_plugin/lib/main.dart @@ -69,7 +69,7 @@ class CounterModel extends ChangeNotifier { /// It offers two routes, one suitable for displaying as a full screen and /// another designed to be part of a larger UI. class MyApp extends StatelessWidget { - const MyApp({Key key}) : super(key: key); + const MyApp({Key? key}) : super(key: key); @override Widget build(BuildContext context) { @@ -86,7 +86,7 @@ class MyApp extends StatelessWidget { /// Wraps [Contents] in a Material [Scaffold] so it looks correct when displayed /// full-screen. class FullScreenView extends StatelessWidget { - const FullScreenView({Key key}) : super(key: key); + const FullScreenView({Key? key}) : super(key: key); @override Widget build(BuildContext context) { @@ -108,7 +108,7 @@ class FullScreenView extends StatelessWidget { class Contents extends StatelessWidget { final bool showExit; - const Contents({this.showExit = false, Key key}) : super(key: key); + const Contents({Key? key, this.showExit = false}) : super(key: key); @override Widget build(BuildContext context) { diff --git a/add_to_app/plugin/flutter_module_using_plugin/pubspec.lock b/add_to_app/plugin/flutter_module_using_plugin/pubspec.lock index 4776949f3..66e3f76b1 100644 --- a/add_to_app/plugin/flutter_module_using_plugin/pubspec.lock +++ b/add_to_app/plugin/flutter_module_using_plugin/pubspec.lock @@ -42,14 +42,14 @@ packages: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.15.0" + version: "1.16.0" fake_async: dependency: transitive description: name: fake_async url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.3.0" flutter: dependency: "direct main" description: flutter @@ -61,7 +61,7 @@ packages: name: flutter_lints url: "https://pub.dartlang.org" source: hosted - version: "1.0.4" + version: "2.0.1" flutter_test: dependency: "direct dev" description: flutter @@ -78,14 +78,14 @@ packages: name: js url: "https://pub.dartlang.org" source: hosted - version: "0.6.3" + version: "0.6.4" lints: dependency: transitive description: name: lints url: "https://pub.dartlang.org" source: hosted - version: "1.0.1" + version: "2.0.0" matcher: dependency: transitive description: @@ -99,7 +99,7 @@ packages: name: material_color_utilities url: "https://pub.dartlang.org" source: hosted - version: "0.1.3" + version: "0.1.4" meta: dependency: transitive description: @@ -120,7 +120,7 @@ packages: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.8.0" + version: "1.8.1" plugin_platform_interface: dependency: transitive description: @@ -153,7 +153,7 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.8.1" + version: "1.8.2" stack_trace: dependency: transitive description: @@ -188,14 +188,7 @@ packages: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.8" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" + version: "0.4.9" url_launcher: dependency: "direct main" description: @@ -209,7 +202,7 @@ packages: name: url_launcher_android url: "https://pub.dartlang.org" source: hosted - version: "6.0.15" + version: "6.0.16" url_launcher_ios: dependency: transitive description: @@ -258,7 +251,7 @@ packages: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.1.1" + version: "2.1.2" sdks: - dart: ">=2.14.0 <3.0.0" + dart: ">=2.17.0-206.0.dev <3.0.0" flutter: ">=2.10.0" diff --git a/add_to_app/plugin/flutter_module_using_plugin/pubspec.yaml b/add_to_app/plugin/flutter_module_using_plugin/pubspec.yaml index b5e10a79c..cb3e2917f 100644 --- a/add_to_app/plugin/flutter_module_using_plugin/pubspec.yaml +++ b/add_to_app/plugin/flutter_module_using_plugin/pubspec.yaml @@ -4,7 +4,7 @@ description: An example Flutter module that uses a plugin. version: 1.0.0+1 environment: - sdk: ">=2.6.0-dev <3.0.0" + sdk: ">=2.17.0-0 <3.0.0" dependencies: flutter: @@ -16,7 +16,7 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - flutter_lints: ^1.0.0 + flutter_lints: ^2.0.1 flutter: uses-material-design: true diff --git a/add_to_app/prebuilt_module/flutter_module/lib/main.dart b/add_to_app/prebuilt_module/flutter_module/lib/main.dart index 5a2246e14..3a327a9f7 100644 --- a/add_to_app/prebuilt_module/flutter_module/lib/main.dart +++ b/add_to_app/prebuilt_module/flutter_module/lib/main.dart @@ -58,7 +58,7 @@ class CounterModel extends ChangeNotifier { /// It offers two routes, one suitable for displaying as a full screen and /// another designed to be part of a larger UI.class MyApp extends StatelessWidget { class MyApp extends StatelessWidget { - const MyApp({Key key}) : super(key: key); + const MyApp({Key? key}) : super(key: key); @override Widget build(BuildContext context) { @@ -75,7 +75,7 @@ class MyApp extends StatelessWidget { /// Wraps [Contents] in a Material [Scaffold] so it looks correct when displayed /// full-screen. class FullScreenView extends StatelessWidget { - const FullScreenView({Key key}) : super(key: key); + const FullScreenView({Key? key}) : super(key: key); @override Widget build(BuildContext context) { @@ -96,7 +96,7 @@ class FullScreenView extends StatelessWidget { class Contents extends StatelessWidget { final bool showExit; - const Contents({this.showExit = false, Key key}) : super(key: key); + const Contents({Key? key, this.showExit = false}) : super(key: key); @override Widget build(BuildContext context) { diff --git a/add_to_app/prebuilt_module/flutter_module/pubspec.lock b/add_to_app/prebuilt_module/flutter_module/pubspec.lock index db1491506..25bf4ff51 100644 --- a/add_to_app/prebuilt_module/flutter_module/pubspec.lock +++ b/add_to_app/prebuilt_module/flutter_module/pubspec.lock @@ -7,7 +7,7 @@ packages: name: archive url: "https://pub.dartlang.org" source: hosted - version: "3.1.6" + version: "3.1.11" async: dependency: transitive description: @@ -49,7 +49,7 @@ packages: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.15.0" + version: "1.16.0" crypto: dependency: transitive description: @@ -70,7 +70,7 @@ packages: name: fake_async url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.3.0" file: dependency: transitive description: @@ -94,7 +94,7 @@ packages: name: flutter_lints url: "https://pub.dartlang.org" source: hosted - version: "1.0.4" + version: "2.0.1" flutter_test: dependency: "direct dev" description: flutter @@ -111,7 +111,7 @@ packages: name: lints url: "https://pub.dartlang.org" source: hosted - version: "1.0.1" + version: "2.0.0" matcher: dependency: transitive description: @@ -125,7 +125,7 @@ packages: name: material_color_utilities url: "https://pub.dartlang.org" source: hosted - version: "0.1.3" + version: "0.1.4" meta: dependency: transitive description: @@ -146,7 +146,7 @@ packages: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.8.0" + version: "1.8.1" platform: dependency: transitive description: @@ -179,7 +179,7 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.8.1" + version: "1.8.2" stack_trace: dependency: transitive description: @@ -221,7 +221,7 @@ packages: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.8" + version: "0.4.9" typed_data: dependency: transitive description: @@ -235,14 +235,14 @@ packages: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.1.1" + version: "2.1.2" vm_service: dependency: transitive description: name: vm_service url: "https://pub.dartlang.org" source: hosted - version: "7.5.0" + version: "8.2.2" webdriver: dependency: transitive description: @@ -251,5 +251,5 @@ packages: source: hosted version: "3.0.0" sdks: - dart: ">=2.14.0 <3.0.0" + dart: ">=2.17.0-206.0.dev <3.0.0" flutter: ">=2.0.0" diff --git a/add_to_app/prebuilt_module/flutter_module/pubspec.yaml b/add_to_app/prebuilt_module/flutter_module/pubspec.yaml index 0d61ba562..de393b656 100644 --- a/add_to_app/prebuilt_module/flutter_module/pubspec.yaml +++ b/add_to_app/prebuilt_module/flutter_module/pubspec.yaml @@ -4,7 +4,7 @@ description: An example Flutter module. version: 1.0.0+1 environment: - sdk: ">=2.6.0-dev <3.0.0" + sdk: ">=2.17.0-0 <3.0.0" dependencies: flutter: @@ -17,7 +17,7 @@ dev_dependencies: flutter_driver: sdk: flutter espresso: ^0.2.0 - flutter_lints: ^1.0.0 + flutter_lints: ^2.0.1 flutter: uses-material-design: true diff --git a/android_splash_screen/lib/main.dart b/android_splash_screen/lib/main.dart index 7e7a4fe7c..3b75c659b 100644 --- a/android_splash_screen/lib/main.dart +++ b/android_splash_screen/lib/main.dart @@ -42,7 +42,7 @@ class MyHomePage extends StatefulWidget { final String title; @override - _MyHomePageState createState() => _MyHomePageState(); + State createState() => _MyHomePageState(); } class _MyHomePageState extends State { diff --git a/android_splash_screen/pubspec.yaml b/android_splash_screen/pubspec.yaml index 4b53126cc..4d6975354 100644 --- a/android_splash_screen/pubspec.yaml +++ b/android_splash_screen/pubspec.yaml @@ -1,12 +1,12 @@ name: splash_screen_sample description: A sample Flutter app with animated splash screen on Android 12. -publish_to: 'none' +publish_to: "none" version: 1.0.0+1 environment: - sdk: ">=2.12.0 <3.0.0" + sdk: ">=2.17.0-0 <3.0.0" dependencies: flutter: @@ -15,7 +15,7 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - flutter_lints: ^1.0.4 + flutter_lints: ^2.0.1 flutter: uses-material-design: true diff --git a/animations/lib/main.dart b/animations/lib/main.dart index c30dbad21..659d3fa4f 100644 --- a/animations/lib/main.dart +++ b/animations/lib/main.dart @@ -6,6 +6,7 @@ import 'dart:io'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; +// ignore: depend_on_referenced_packages import 'package:window_size/window_size.dart'; import 'src/basics/01_animated_container.dart'; diff --git a/animations/lib/src/basics/01_animated_container.dart b/animations/lib/src/basics/01_animated_container.dart index 2b6d47fd6..dd499abd5 100644 --- a/animations/lib/src/basics/01_animated_container.dart +++ b/animations/lib/src/basics/01_animated_container.dart @@ -15,7 +15,7 @@ class AnimatedContainerDemo extends StatefulWidget { static String routeName = '/basics/01_animated_container'; @override - _AnimatedContainerDemoState createState() => _AnimatedContainerDemoState(); + State createState() => _AnimatedContainerDemoState(); } class _AnimatedContainerDemoState extends State { diff --git a/animations/lib/src/basics/03_animation_controller.dart b/animations/lib/src/basics/03_animation_controller.dart index 9d05d4477..2cde3f785 100644 --- a/animations/lib/src/basics/03_animation_controller.dart +++ b/animations/lib/src/basics/03_animation_controller.dart @@ -9,7 +9,7 @@ class AnimationControllerDemo extends StatefulWidget { static const String routeName = '/basics/animation_controller'; @override - _AnimationControllerDemoState createState() => + State createState() => _AnimationControllerDemoState(); } diff --git a/animations/lib/src/basics/04_tweens.dart b/animations/lib/src/basics/04_tweens.dart index acf9a07ea..4806c6c1d 100644 --- a/animations/lib/src/basics/04_tweens.dart +++ b/animations/lib/src/basics/04_tweens.dart @@ -9,7 +9,7 @@ class TweenDemo extends StatefulWidget { static const String routeName = '/basics/tweens'; @override - _TweenDemoState createState() => _TweenDemoState(); + State createState() => _TweenDemoState(); } class _TweenDemoState extends State diff --git a/animations/lib/src/basics/05_animated_builder.dart b/animations/lib/src/basics/05_animated_builder.dart index 78dca83c6..9387f887c 100644 --- a/animations/lib/src/basics/05_animated_builder.dart +++ b/animations/lib/src/basics/05_animated_builder.dart @@ -9,7 +9,7 @@ class AnimatedBuilderDemo extends StatefulWidget { static const String routeName = '/basics/animated_builder'; @override - _AnimatedBuilderDemoState createState() => _AnimatedBuilderDemoState(); + State createState() => _AnimatedBuilderDemoState(); } class _AnimatedBuilderDemoState extends State diff --git a/animations/lib/src/basics/06_custom_tween.dart b/animations/lib/src/basics/06_custom_tween.dart index bc1ac567b..d9c005a20 100644 --- a/animations/lib/src/basics/06_custom_tween.dart +++ b/animations/lib/src/basics/06_custom_tween.dart @@ -20,7 +20,7 @@ class CustomTweenDemo extends StatefulWidget { static const String routeName = '/basics/custom_tweens'; @override - _CustomTweenDemoState createState() => _CustomTweenDemoState(); + State createState() => _CustomTweenDemoState(); } class _CustomTweenDemoState extends State @@ -51,11 +51,6 @@ class _CustomTweenDemoState extends State title: const Text('Custom Tween'), actions: [ MaterialButton( - child: Text( - controller.status == AnimationStatus.completed - ? 'Delete Essay' - : 'Write Essay', - ), textColor: Colors.white, onPressed: () { if (controller.status == AnimationStatus.completed) { @@ -68,6 +63,11 @@ class _CustomTweenDemoState extends State }); } }, + child: Text( + controller.status == AnimationStatus.completed + ? 'Delete Essay' + : 'Write Essay', + ), ), ], ), diff --git a/animations/lib/src/basics/07_tween_sequence.dart b/animations/lib/src/basics/07_tween_sequence.dart index 97bdc49ea..0c59c1e26 100644 --- a/animations/lib/src/basics/07_tween_sequence.dart +++ b/animations/lib/src/basics/07_tween_sequence.dart @@ -9,7 +9,7 @@ class TweenSequenceDemo extends StatefulWidget { static const String routeName = '/basics/chaining_tweens'; @override - _TweenSequenceDemoState createState() => _TweenSequenceDemoState(); + State createState() => _TweenSequenceDemoState(); } class _TweenSequenceDemoState extends State diff --git a/animations/lib/src/basics/08_fade_transition.dart b/animations/lib/src/basics/08_fade_transition.dart index 0aa1bd3f5..87a66c47f 100644 --- a/animations/lib/src/basics/08_fade_transition.dart +++ b/animations/lib/src/basics/08_fade_transition.dart @@ -11,7 +11,7 @@ class FadeTransitionDemo extends StatefulWidget { static const String routeName = '/basics/fade_transition'; @override - _FadeTransitionDemoState createState() => _FadeTransitionDemoState(); + State createState() => _FadeTransitionDemoState(); } class _FadeTransitionDemoState extends State diff --git a/animations/lib/src/misc/animated_list.dart b/animations/lib/src/misc/animated_list.dart index 1f963c49e..bf9d1056a 100644 --- a/animations/lib/src/misc/animated_list.dart +++ b/animations/lib/src/misc/animated_list.dart @@ -9,7 +9,7 @@ class AnimatedListDemo extends StatefulWidget { static String routeName = '/misc/animated_list'; @override - _AnimatedListDemoState createState() => _AnimatedListDemoState(); + State createState() => _AnimatedListDemoState(); } class _AnimatedListDemoState extends State { diff --git a/animations/lib/src/misc/animated_positioned.dart b/animations/lib/src/misc/animated_positioned.dart index 8dbf7c0c9..1e6455cda 100644 --- a/animations/lib/src/misc/animated_positioned.dart +++ b/animations/lib/src/misc/animated_positioned.dart @@ -11,7 +11,7 @@ class AnimatedPositionedDemo extends StatefulWidget { static String routeName = '/basics/09_animated_positioned'; @override - _AnimatedPositionedDemoState createState() => _AnimatedPositionedDemoState(); + State createState() => _AnimatedPositionedDemoState(); } class _AnimatedPositionedDemoState extends State { @@ -62,6 +62,7 @@ class _AnimatedPositionedDemoState extends State { alignment: Alignment.center, width: 150, height: 50, + color: Theme.of(context).primaryColor, child: Text( 'Click Me', style: TextStyle( @@ -69,7 +70,6 @@ class _AnimatedPositionedDemoState extends State { Theme.of(context).buttonTheme.colorScheme!.onPrimary, ), ), - color: Theme.of(context).primaryColor, ), ), ), diff --git a/animations/lib/src/misc/animated_switcher.dart b/animations/lib/src/misc/animated_switcher.dart index aaa4269f3..be391c39e 100644 --- a/animations/lib/src/misc/animated_switcher.dart +++ b/animations/lib/src/misc/animated_switcher.dart @@ -27,7 +27,7 @@ class AnimatedSwitcherDemo extends StatefulWidget { static String routeName = '/basics/10_animated_switcher'; @override - _AnimatedSwitcherDemoState createState() => _AnimatedSwitcherDemoState(); + State createState() => _AnimatedSwitcherDemoState(); } class _AnimatedSwitcherDemoState extends State { @@ -67,8 +67,8 @@ class _AnimatedSwitcherDemoState extends State { duration: const Duration(seconds: 1), child: container, transitionBuilder: (child, animation) => ScaleTransition( - child: child, scale: animation, + child: child, ), ), ), diff --git a/animations/lib/src/misc/card_swipe.dart b/animations/lib/src/misc/card_swipe.dart index cda4e1472..c358b4e66 100644 --- a/animations/lib/src/misc/card_swipe.dart +++ b/animations/lib/src/misc/card_swipe.dart @@ -10,7 +10,7 @@ class CardSwipeDemo extends StatefulWidget { static String routeName = '/misc/card_swipe'; @override - _CardSwipeDemoState createState() => _CardSwipeDemoState(); + State createState() => _CardSwipeDemoState(); } class _CardSwipeDemoState extends State { @@ -105,7 +105,7 @@ class SwipeableCard extends StatefulWidget { : super(key: key); @override - _SwipeableCardState createState() => _SwipeableCardState(); + State createState() => _SwipeableCardState(); } class _SwipeableCardState extends State diff --git a/animations/lib/src/misc/carousel.dart b/animations/lib/src/misc/carousel.dart index 0df484fa2..41d500f5f 100644 --- a/animations/lib/src/misc/carousel.dart +++ b/animations/lib/src/misc/carousel.dart @@ -49,7 +49,7 @@ class Carousel extends StatefulWidget { const Carousel({Key? key, required this.itemBuilder}) : super(key: key); @override - _CarouselState createState() => _CarouselState(); + State createState() => _CarouselState(); } class _CarouselState extends State { diff --git a/animations/lib/src/misc/curved_animation.dart b/animations/lib/src/misc/curved_animation.dart index 4f0c7621d..fcf469f2f 100644 --- a/animations/lib/src/misc/curved_animation.dart +++ b/animations/lib/src/misc/curved_animation.dart @@ -10,7 +10,7 @@ class CurvedAnimationDemo extends StatefulWidget { static const String routeName = '/misc/curved_animation'; @override - _CurvedAnimationDemoState createState() => _CurvedAnimationDemoState(); + State createState() => _CurvedAnimationDemoState(); } class CurveChoice { diff --git a/animations/lib/src/misc/expand_card.dart b/animations/lib/src/misc/expand_card.dart index 6867c5eee..8cbd014da 100644 --- a/animations/lib/src/misc/expand_card.dart +++ b/animations/lib/src/misc/expand_card.dart @@ -24,7 +24,7 @@ class ExpandCardDemo extends StatelessWidget { class ExpandCard extends StatefulWidget { const ExpandCard({Key? key}) : super(key: key); @override - _ExpandCardState createState() => _ExpandCardState(); + State createState() => _ExpandCardState(); } class _ExpandCardState extends State diff --git a/animations/lib/src/misc/physics_card_drag.dart b/animations/lib/src/misc/physics_card_drag.dart index 3399274a7..90e3763c4 100644 --- a/animations/lib/src/misc/physics_card_drag.dart +++ b/animations/lib/src/misc/physics_card_drag.dart @@ -31,7 +31,7 @@ class DraggableCard extends StatefulWidget { final Widget child; @override - _DraggableCardState createState() => _DraggableCardState(); + State createState() => _DraggableCardState(); } class _DraggableCardState extends State diff --git a/animations/lib/src/misc/repeating_animation.dart b/animations/lib/src/misc/repeating_animation.dart index 3c083b1c6..500328399 100644 --- a/animations/lib/src/misc/repeating_animation.dart +++ b/animations/lib/src/misc/repeating_animation.dart @@ -9,10 +9,10 @@ class RepeatingAnimationDemo extends StatefulWidget { static String routeName = '/misc/repeating_animation'; @override - RepeatingAnimationDemoState createState() => RepeatingAnimationDemoState(); + State createState() => _RepeatingAnimationDemoState(); } -class RepeatingAnimationDemoState extends State +class _RepeatingAnimationDemoState extends State with SingleTickerProviderStateMixin { late final AnimationController _controller; late final Animation _borderRadius; diff --git a/animations/linux/flutter/generated_plugins.cmake b/animations/linux/flutter/generated_plugins.cmake index 9e12128db..12c7443ed 100644 --- a/animations/linux/flutter/generated_plugins.cmake +++ b/animations/linux/flutter/generated_plugins.cmake @@ -6,6 +6,9 @@ list(APPEND FLUTTER_PLUGIN_LIST window_size ) +list(APPEND FLUTTER_FFI_PLUGIN_LIST +) + set(PLUGIN_BUNDLED_LIBRARIES) foreach(plugin ${FLUTTER_PLUGIN_LIST}) @@ -14,3 +17,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/animations/macos/Podfile.lock b/animations/macos/Podfile.lock index 37545b33a..ff91536ac 100644 --- a/animations/macos/Podfile.lock +++ b/animations/macos/Podfile.lock @@ -19,4 +19,4 @@ SPEC CHECKSUMS: PODFILE CHECKSUM: 6eac6b3292e5142cfc23bdeb71848a40ec51c14c -COCOAPODS: 1.11.2 +COCOAPODS: 1.11.3 diff --git a/animations/pubspec.lock b/animations/pubspec.lock index 6035775a0..4d73d8db2 100644 --- a/animations/pubspec.lock +++ b/animations/pubspec.lock @@ -68,7 +68,7 @@ packages: name: flutter_lints url: "https://pub.dartlang.org" source: hosted - version: "1.0.4" + version: "2.0.1" flutter_test: dependency: "direct dev" description: flutter @@ -80,7 +80,7 @@ packages: name: lints url: "https://pub.dartlang.org" source: hosted - version: "1.0.1" + version: "2.0.0" matcher: dependency: transitive description: @@ -173,4 +173,4 @@ packages: source: git version: "0.1.0" sdks: - dart: ">=2.17.0-0 <3.0.0" + dart: ">=2.17.0-206.0.dev <3.0.0" diff --git a/animations/pubspec.yaml b/animations/pubspec.yaml index 001f48415..4f1330bd0 100644 --- a/animations/pubspec.yaml +++ b/animations/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-0 <3.0.0" dependencies: flutter: @@ -14,7 +14,7 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - flutter_lints: ^1.0.0 + flutter_lints: ^2.0.1 # plugin is not yet part of the flutter framework window_size: diff --git a/desktop_photo_search/fluent_ui/analysis_options.yaml b/desktop_photo_search/fluent_ui/analysis_options.yaml index f04c6cf0f..09405a34a 100644 --- a/desktop_photo_search/fluent_ui/analysis_options.yaml +++ b/desktop_photo_search/fluent_ui/analysis_options.yaml @@ -1 +1,4 @@ include: ../../analysis_options.yaml + +analyzer: + exclude: [lib/src/**.g.dart] diff --git a/desktop_photo_search/fluent_ui/lib/src/widgets/photo_details.dart b/desktop_photo_search/fluent_ui/lib/src/widgets/photo_details.dart index 89a05c8fc..37862907f 100644 --- a/desktop_photo_search/fluent_ui/lib/src/widgets/photo_details.dart +++ b/desktop_photo_search/fluent_ui/lib/src/widgets/photo_details.dart @@ -26,7 +26,7 @@ class PhotoDetails extends StatefulWidget { final PhotoDetailsPhotoSaveCallback onPhotoSave; @override - _PhotoDetailsState createState() => _PhotoDetailsState(); + State createState() => _PhotoDetailsState(); } class _PhotoDetailsState extends State { diff --git a/desktop_photo_search/fluent_ui/lib/src/widgets/unsplash_notice.dart b/desktop_photo_search/fluent_ui/lib/src/widgets/unsplash_notice.dart index c4e98608c..d98b68e3a 100644 --- a/desktop_photo_search/fluent_ui/lib/src/widgets/unsplash_notice.dart +++ b/desktop_photo_search/fluent_ui/lib/src/widgets/unsplash_notice.dart @@ -27,7 +27,7 @@ class _UnsplashNoticeState extends State { @override void initState() { super.initState(); - WidgetsBinding.instance!.addPostFrameCallback((timeStamp) { + WidgetsBinding.instance.addPostFrameCallback((timeStamp) { showDialog( context: context, builder: (context) { diff --git a/desktop_photo_search/fluent_ui/linux/flutter/generated_plugins.cmake b/desktop_photo_search/fluent_ui/linux/flutter/generated_plugins.cmake index 44f809bcf..555ea5b5f 100644 --- a/desktop_photo_search/fluent_ui/linux/flutter/generated_plugins.cmake +++ b/desktop_photo_search/fluent_ui/linux/flutter/generated_plugins.cmake @@ -9,6 +9,9 @@ list(APPEND FLUTTER_PLUGIN_LIST window_size ) +list(APPEND FLUTTER_FFI_PLUGIN_LIST +) + set(PLUGIN_BUNDLED_LIBRARIES) foreach(plugin ${FLUTTER_PLUGIN_LIST}) @@ -17,3 +20,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/desktop_photo_search/fluent_ui/pubspec.lock b/desktop_photo_search/fluent_ui/pubspec.lock index 412155337..58f037f18 100644 --- a/desktop_photo_search/fluent_ui/pubspec.lock +++ b/desktop_photo_search/fluent_ui/pubspec.lock @@ -7,14 +7,14 @@ packages: name: _fe_analyzer_shared url: "https://pub.dartlang.org" source: hosted - version: "38.0.0" + version: "39.0.0" analyzer: dependency: transitive description: name: analyzer url: "https://pub.dartlang.org" source: hosted - version: "3.4.1" + version: "4.0.0" archive: dependency: transitive description: @@ -30,7 +30,7 @@ packages: source: hosted version: "2.3.0" async: - dependency: transitive + dependency: "direct dev" description: name: async url: "https://pub.dartlang.org" @@ -70,7 +70,7 @@ packages: name: build_resolvers url: "https://pub.dartlang.org" source: hosted - version: "2.0.6" + version: "2.0.8" build_runner: dependency: "direct dev" description: @@ -161,7 +161,7 @@ packages: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.15.0" + version: "1.16.0" convert: dependency: transitive description: @@ -175,14 +175,14 @@ packages: name: cross_file url: "https://pub.dartlang.org" source: hosted - version: "0.3.2" + version: "0.3.3" crypto: dependency: transitive description: name: crypto url: "https://pub.dartlang.org" source: hosted - version: "3.0.1" + version: "3.0.2" cupertino_icons: dependency: "direct main" description: @@ -203,14 +203,14 @@ packages: name: dart_style url: "https://pub.dartlang.org" source: hosted - version: "2.2.2" + version: "2.2.3" fake_async: dependency: transitive description: name: fake_async url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.3.0" ffi: dependency: transitive description: @@ -299,7 +299,7 @@ packages: name: flutter_lints url: "https://pub.dartlang.org" source: hosted - version: "1.0.4" + version: "2.0.1" flutter_localizations: dependency: transitive description: flutter @@ -398,21 +398,21 @@ packages: name: js url: "https://pub.dartlang.org" source: hosted - version: "0.6.3" + version: "0.6.4" json_annotation: dependency: transitive description: name: json_annotation url: "https://pub.dartlang.org" source: hosted - version: "4.4.0" + version: "4.5.0" lints: dependency: transitive description: name: lints url: "https://pub.dartlang.org" source: hosted - version: "1.0.1" + version: "2.0.0" logging: dependency: "direct main" description: @@ -433,7 +433,7 @@ packages: name: material_color_utilities url: "https://pub.dartlang.org" source: hosted - version: "0.1.3" + version: "0.1.4" menubar: dependency: "direct main" description: @@ -456,7 +456,7 @@ packages: name: mime url: "https://pub.dartlang.org" source: hosted - version: "1.0.1" + version: "1.0.2" msix: dependency: "direct dev" description: @@ -484,14 +484,14 @@ packages: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.8.0" + version: "1.8.1" petitparser: dependency: transitive description: name: petitparser url: "https://pub.dartlang.org" source: hosted - version: "4.4.0" + version: "5.0.0" plugin_platform_interface: dependency: transitive description: @@ -533,7 +533,7 @@ packages: name: quiver url: "https://pub.dartlang.org" source: hosted - version: "3.0.1+1" + version: "3.1.0" recase: dependency: transitive description: @@ -573,14 +573,14 @@ packages: name: source_gen url: "https://pub.dartlang.org" source: hosted - version: "1.2.1" + version: "1.2.2" source_span: dependency: transitive description: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.8.1" + version: "1.8.2" stack_trace: dependency: transitive description: @@ -622,7 +622,7 @@ packages: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.8" + version: "0.4.9" timing: dependency: transitive description: @@ -657,7 +657,7 @@ packages: name: url_launcher_android url: "https://pub.dartlang.org" source: hosted - version: "6.0.15" + version: "6.0.16" url_launcher_ios: dependency: transitive description: @@ -713,7 +713,7 @@ packages: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.1.1" + version: "2.1.2" watcher: dependency: transitive description: @@ -727,14 +727,14 @@ packages: name: web_socket_channel url: "https://pub.dartlang.org" source: hosted - version: "2.1.0" + version: "2.2.0" win32: dependency: transitive description: name: win32 url: "https://pub.dartlang.org" source: hosted - version: "2.5.1" + version: "2.5.2" window_size: dependency: "direct main" description: @@ -750,7 +750,7 @@ packages: name: xml url: "https://pub.dartlang.org" source: hosted - version: "5.3.1" + version: "5.4.1" yaml: dependency: transitive description: @@ -759,5 +759,5 @@ packages: source: hosted version: "3.1.0" sdks: - dart: ">=2.16.0 <3.0.0" + dart: ">=2.17.0-206.0.dev <3.0.0" flutter: ">=2.10.0" diff --git a/desktop_photo_search/fluent_ui/pubspec.yaml b/desktop_photo_search/fluent_ui/pubspec.yaml index c6118cfac..7e350ce85 100644 --- a/desktop_photo_search/fluent_ui/pubspec.yaml +++ b/desktop_photo_search/fluent_ui/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: 'none' version: 1.0.0+1 environment: - sdk: ">=2.15.0 <3.0.0" + sdk: ">=2.17.0-0 <3.0.0" dependencies: built_collection: ^5.1.1 @@ -34,10 +34,11 @@ dependencies: uuid: ^3.0.5 dev_dependencies: + async: ^2.8.2 build: ^2.2.1 build_runner: ^2.1.7 built_value_generator: ^8.3.0 - flutter_lints: ^1.0.0 + flutter_lints: ^2.0.1 flutter_test: sdk: flutter grinder: ^0.9.0 diff --git a/desktop_photo_search/fluent_ui/windows/flutter/generated_plugins.cmake b/desktop_photo_search/fluent_ui/windows/flutter/generated_plugins.cmake index af19be875..2e3934c21 100644 --- a/desktop_photo_search/fluent_ui/windows/flutter/generated_plugins.cmake +++ b/desktop_photo_search/fluent_ui/windows/flutter/generated_plugins.cmake @@ -9,6 +9,9 @@ list(APPEND FLUTTER_PLUGIN_LIST window_size ) +list(APPEND FLUTTER_FFI_PLUGIN_LIST +) + set(PLUGIN_BUNDLED_LIBRARIES) foreach(plugin ${FLUTTER_PLUGIN_LIST}) @@ -17,3 +20,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/desktop_photo_search/material/analysis_options.yaml b/desktop_photo_search/material/analysis_options.yaml index f04c6cf0f..09405a34a 100644 --- a/desktop_photo_search/material/analysis_options.yaml +++ b/desktop_photo_search/material/analysis_options.yaml @@ -1 +1,4 @@ include: ../../analysis_options.yaml + +analyzer: + exclude: [lib/src/**.g.dart] diff --git a/desktop_photo_search/material/lib/src/widgets/photo_details.dart b/desktop_photo_search/material/lib/src/widgets/photo_details.dart index 866a652a9..79867fc0d 100644 --- a/desktop_photo_search/material/lib/src/widgets/photo_details.dart +++ b/desktop_photo_search/material/lib/src/widgets/photo_details.dart @@ -24,7 +24,7 @@ class PhotoDetails extends StatefulWidget { final PhotoDetailsPhotoSaveCallback onPhotoSave; @override - _PhotoDetailsState createState() => _PhotoDetailsState(); + State createState() => _PhotoDetailsState(); } class _PhotoDetailsState extends State { diff --git a/desktop_photo_search/material/lib/src/widgets/unsplash_notice.dart b/desktop_photo_search/material/lib/src/widgets/unsplash_notice.dart index d14c7c61a..cb68770f6 100644 --- a/desktop_photo_search/material/lib/src/widgets/unsplash_notice.dart +++ b/desktop_photo_search/material/lib/src/widgets/unsplash_notice.dart @@ -27,7 +27,7 @@ class _UnsplashNoticeState extends State { @override void initState() { super.initState(); - WidgetsBinding.instance!.addPostFrameCallback((timeStamp) { + WidgetsBinding.instance.addPostFrameCallback((timeStamp) { showDialog( barrierDismissible: false, context: context, diff --git a/desktop_photo_search/material/linux/flutter/generated_plugins.cmake b/desktop_photo_search/material/linux/flutter/generated_plugins.cmake index 44f809bcf..555ea5b5f 100644 --- a/desktop_photo_search/material/linux/flutter/generated_plugins.cmake +++ b/desktop_photo_search/material/linux/flutter/generated_plugins.cmake @@ -9,6 +9,9 @@ list(APPEND FLUTTER_PLUGIN_LIST window_size ) +list(APPEND FLUTTER_FFI_PLUGIN_LIST +) + set(PLUGIN_BUNDLED_LIBRARIES) foreach(plugin ${FLUTTER_PLUGIN_LIST}) @@ -17,3 +20,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/desktop_photo_search/material/pubspec.lock b/desktop_photo_search/material/pubspec.lock index d448dfbd3..93cd46104 100644 --- a/desktop_photo_search/material/pubspec.lock +++ b/desktop_photo_search/material/pubspec.lock @@ -7,14 +7,14 @@ packages: name: _fe_analyzer_shared url: "https://pub.dartlang.org" source: hosted - version: "38.0.0" + version: "39.0.0" analyzer: dependency: transitive description: name: analyzer url: "https://pub.dartlang.org" source: hosted - version: "3.4.1" + version: "4.0.0" archive: dependency: transitive description: @@ -30,7 +30,7 @@ packages: source: hosted version: "2.3.0" async: - dependency: transitive + dependency: "direct dev" description: name: async url: "https://pub.dartlang.org" @@ -70,7 +70,7 @@ packages: name: build_resolvers url: "https://pub.dartlang.org" source: hosted - version: "2.0.6" + version: "2.0.8" build_runner: dependency: "direct dev" description: @@ -161,7 +161,7 @@ packages: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.15.0" + version: "1.16.0" convert: dependency: transitive description: @@ -175,14 +175,14 @@ packages: name: cross_file url: "https://pub.dartlang.org" source: hosted - version: "0.3.2" + version: "0.3.3" crypto: dependency: transitive description: name: crypto url: "https://pub.dartlang.org" source: hosted - version: "3.0.1" + version: "3.0.2" cupertino_icons: dependency: "direct main" description: @@ -203,14 +203,14 @@ packages: name: dart_style url: "https://pub.dartlang.org" source: hosted - version: "2.2.2" + version: "2.2.3" fake_async: dependency: transitive description: name: fake_async url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.3.0" ffi: dependency: transitive description: @@ -285,7 +285,7 @@ packages: name: flutter_lints url: "https://pub.dartlang.org" source: hosted - version: "1.0.4" + version: "2.0.1" flutter_simple_treeview: dependency: "direct main" description: @@ -379,21 +379,21 @@ packages: name: js url: "https://pub.dartlang.org" source: hosted - version: "0.6.3" + version: "0.6.4" json_annotation: dependency: transitive description: name: json_annotation url: "https://pub.dartlang.org" source: hosted - version: "4.4.0" + version: "4.5.0" lints: dependency: transitive description: name: lints url: "https://pub.dartlang.org" source: hosted - version: "1.0.1" + version: "2.0.0" logging: dependency: "direct main" description: @@ -414,7 +414,7 @@ packages: name: material_color_utilities url: "https://pub.dartlang.org" source: hosted - version: "0.1.3" + version: "0.1.4" menubar: dependency: "direct main" description: @@ -437,7 +437,7 @@ packages: name: mime url: "https://pub.dartlang.org" source: hosted - version: "1.0.1" + version: "1.0.2" msix: dependency: "direct dev" description: @@ -465,14 +465,14 @@ packages: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.8.0" + version: "1.8.1" petitparser: dependency: transitive description: name: petitparser url: "https://pub.dartlang.org" source: hosted - version: "4.4.0" + version: "5.0.0" plugin_platform_interface: dependency: transitive description: @@ -514,7 +514,7 @@ packages: name: quiver url: "https://pub.dartlang.org" source: hosted - version: "3.0.1+1" + version: "3.1.0" shelf: dependency: transitive description: @@ -540,14 +540,14 @@ packages: name: source_gen url: "https://pub.dartlang.org" source: hosted - version: "1.2.1" + version: "1.2.2" source_span: dependency: transitive description: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.8.1" + version: "1.8.2" stack_trace: dependency: transitive description: @@ -589,7 +589,7 @@ packages: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.8" + version: "0.4.9" timing: dependency: transitive description: @@ -624,7 +624,7 @@ packages: name: url_launcher_android url: "https://pub.dartlang.org" source: hosted - version: "6.0.15" + version: "6.0.16" url_launcher_ios: dependency: transitive description: @@ -680,7 +680,7 @@ packages: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.1.1" + version: "2.1.2" watcher: dependency: transitive description: @@ -694,14 +694,14 @@ packages: name: web_socket_channel url: "https://pub.dartlang.org" source: hosted - version: "2.1.0" + version: "2.2.0" win32: dependency: transitive description: name: win32 url: "https://pub.dartlang.org" source: hosted - version: "2.5.1" + version: "2.5.2" window_size: dependency: "direct main" description: @@ -717,7 +717,7 @@ packages: name: xml url: "https://pub.dartlang.org" source: hosted - version: "5.3.1" + version: "5.4.1" yaml: dependency: transitive description: @@ -726,5 +726,5 @@ packages: source: hosted version: "3.1.0" sdks: - dart: ">=2.16.0 <3.0.0" + dart: ">=2.17.0-206.0.dev <3.0.0" flutter: ">=2.10.0" diff --git a/desktop_photo_search/material/pubspec.yaml b/desktop_photo_search/material/pubspec.yaml index a515447f3..9b522d15b 100644 --- a/desktop_photo_search/material/pubspec.yaml +++ b/desktop_photo_search/material/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: 'none' version: 1.0.0+1 environment: - sdk: ">=2.15.0 <3.0.0" + sdk: ">=2.17.0-0 <3.0.0" dependencies: built_collection: ^5.1.1 @@ -33,10 +33,11 @@ dependencies: path: plugins/window_size dev_dependencies: + async: ^2.8.2 build: ^2.2.1 build_runner: ^2.1.7 built_value_generator: ^8.3.0 - flutter_lints: ^1.0.0 + flutter_lints: ^2.0.1 flutter_test: sdk: flutter grinder: ^0.9.0 diff --git a/desktop_photo_search/material/windows/flutter/generated_plugins.cmake b/desktop_photo_search/material/windows/flutter/generated_plugins.cmake index af19be875..2e3934c21 100644 --- a/desktop_photo_search/material/windows/flutter/generated_plugins.cmake +++ b/desktop_photo_search/material/windows/flutter/generated_plugins.cmake @@ -9,6 +9,9 @@ list(APPEND FLUTTER_PLUGIN_LIST window_size ) +list(APPEND FLUTTER_FFI_PLUGIN_LIST +) + set(PLUGIN_BUNDLED_LIBRARIES) foreach(plugin ${FLUTTER_PLUGIN_LIST}) @@ -17,3 +20,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/experimental/federated_plugin/federated_plugin/example/pubspec.lock b/experimental/federated_plugin/federated_plugin/example/pubspec.lock index e9c0b72b1..de82b29dd 100644 --- a/experimental/federated_plugin/federated_plugin/example/pubspec.lock +++ b/experimental/federated_plugin/federated_plugin/example/pubspec.lock @@ -42,7 +42,7 @@ packages: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.15.0" + version: "1.16.0" cupertino_icons: dependency: "direct main" description: @@ -56,7 +56,7 @@ packages: name: fake_async url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.3.0" federated_plugin: dependency: "direct main" description: @@ -120,7 +120,7 @@ packages: name: js url: "https://pub.dartlang.org" source: hosted - version: "0.6.3" + version: "0.6.4" lints: dependency: transitive description: @@ -141,7 +141,7 @@ packages: name: material_color_utilities url: "https://pub.dartlang.org" source: hosted - version: "0.1.3" + version: "0.1.4" meta: dependency: transitive description: @@ -155,7 +155,7 @@ packages: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.8.0" + version: "1.8.1" plugin_platform_interface: dependency: transitive description: @@ -174,7 +174,7 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.8.1" + version: "1.8.2" stack_trace: dependency: transitive description: @@ -209,21 +209,13 @@ packages: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.8" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" + version: "0.4.9" vector_math: dependency: transitive description: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.1.1" + version: "2.1.2" sdks: - dart: ">=2.15.1 <3.0.0" - flutter: ">=2.5.0" + dart: ">=2.17.0-0 <3.0.0" diff --git a/experimental/federated_plugin/federated_plugin/example/windows/flutter/generated_plugins.cmake b/experimental/federated_plugin/federated_plugin/example/windows/flutter/generated_plugins.cmake index 176412102..d9e53e87a 100644 --- a/experimental/federated_plugin/federated_plugin/example/windows/flutter/generated_plugins.cmake +++ b/experimental/federated_plugin/federated_plugin/example/windows/flutter/generated_plugins.cmake @@ -6,6 +6,9 @@ list(APPEND FLUTTER_PLUGIN_LIST federated_plugin_windows ) +list(APPEND FLUTTER_FFI_PLUGIN_LIST +) + set(PLUGIN_BUNDLED_LIBRARIES) foreach(plugin ${FLUTTER_PLUGIN_LIST}) @@ -14,3 +17,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/experimental/federated_plugin/federated_plugin/pubspec.lock b/experimental/federated_plugin/federated_plugin/pubspec.lock index 3d0565b49..76c040cf5 100644 --- a/experimental/federated_plugin/federated_plugin/pubspec.lock +++ b/experimental/federated_plugin/federated_plugin/pubspec.lock @@ -42,14 +42,14 @@ packages: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.15.0" + version: "1.16.0" fake_async: dependency: transitive description: name: fake_async url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.3.0" federated_plugin_macos: dependency: "direct main" description: @@ -89,7 +89,7 @@ packages: name: flutter_lints url: "https://pub.dartlang.org" source: hosted - version: "1.0.4" + version: "2.0.1" flutter_test: dependency: "direct dev" description: flutter @@ -106,14 +106,14 @@ packages: name: js url: "https://pub.dartlang.org" source: hosted - version: "0.6.3" + version: "0.6.4" lints: dependency: transitive description: name: lints url: "https://pub.dartlang.org" source: hosted - version: "1.0.1" + version: "2.0.0" matcher: dependency: transitive description: @@ -127,7 +127,7 @@ packages: name: material_color_utilities url: "https://pub.dartlang.org" source: hosted - version: "0.1.3" + version: "0.1.4" meta: dependency: transitive description: @@ -141,7 +141,7 @@ packages: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.8.0" + version: "1.8.1" plugin_platform_interface: dependency: transitive description: @@ -160,7 +160,7 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.8.1" + version: "1.8.2" stack_trace: dependency: transitive description: @@ -195,21 +195,13 @@ packages: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.8" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" + version: "0.4.9" vector_math: dependency: transitive description: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.1.1" + version: "2.1.2" sdks: - dart: ">=2.15.1 <3.0.0" - flutter: ">=2.5.0" + dart: ">=2.17.0-206.0.dev <3.0.0" diff --git a/experimental/federated_plugin/federated_plugin/pubspec.yaml b/experimental/federated_plugin/federated_plugin/pubspec.yaml index cd849c4ee..fb5807cc4 100644 --- a/experimental/federated_plugin/federated_plugin/pubspec.yaml +++ b/experimental/federated_plugin/federated_plugin/pubspec.yaml @@ -5,8 +5,7 @@ version: 0.0.1 publish_to: "none" environment: - sdk: ">=2.15.1 <3.0.0" - flutter: ">=2.5.0" + sdk: ">=2.17.0-0 <3.0.0" dependencies: flutter: @@ -23,7 +22,7 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - flutter_lints: ^1.0.0 + flutter_lints: ^2.0.1 flutter: plugin: diff --git a/experimental/federated_plugin/federated_plugin_macos/pubspec.lock b/experimental/federated_plugin/federated_plugin_macos/pubspec.lock index 31b15c16a..df055c8fe 100644 --- a/experimental/federated_plugin/federated_plugin_macos/pubspec.lock +++ b/experimental/federated_plugin/federated_plugin_macos/pubspec.lock @@ -42,14 +42,14 @@ packages: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.15.0" + version: "1.16.0" fake_async: dependency: transitive description: name: fake_async url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.3.0" flutter: dependency: "direct main" description: flutter @@ -61,7 +61,7 @@ packages: name: flutter_lints url: "https://pub.dartlang.org" source: hosted - version: "1.0.4" + version: "2.0.1" flutter_test: dependency: "direct dev" description: flutter @@ -73,7 +73,7 @@ packages: name: lints url: "https://pub.dartlang.org" source: hosted - version: "1.0.1" + version: "2.0.0" matcher: dependency: transitive description: @@ -87,7 +87,7 @@ packages: name: material_color_utilities url: "https://pub.dartlang.org" source: hosted - version: "0.1.3" + version: "0.1.4" meta: dependency: transitive description: @@ -101,7 +101,7 @@ packages: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.8.0" + version: "1.8.1" sky_engine: dependency: transitive description: flutter @@ -113,7 +113,7 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.8.1" + version: "1.8.2" stack_trace: dependency: transitive description: @@ -148,21 +148,13 @@ packages: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.8" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" + version: "0.4.9" vector_math: dependency: transitive description: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.1.1" + version: "2.1.2" sdks: - dart: ">=2.15.1 <3.0.0" - flutter: ">=2.5.0" + dart: ">=2.17.0-206.0.dev <3.0.0" diff --git a/experimental/federated_plugin/federated_plugin_macos/pubspec.yaml b/experimental/federated_plugin/federated_plugin_macos/pubspec.yaml index 11b88d260..988ece1fb 100644 --- a/experimental/federated_plugin/federated_plugin_macos/pubspec.yaml +++ b/experimental/federated_plugin/federated_plugin_macos/pubspec.yaml @@ -4,8 +4,7 @@ version: 0.0.1 homepage: environment: - sdk: ">=2.15.1 <3.0.0" - flutter: ">=2.5.0" + sdk: ">=2.17.0-0 <3.0.0" dependencies: flutter: @@ -14,7 +13,7 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - flutter_lints: ^1.0.0 + flutter_lints: ^2.0.1 flutter: plugin: diff --git a/experimental/federated_plugin/federated_plugin_platform_interface/pubspec.lock b/experimental/federated_plugin/federated_plugin_platform_interface/pubspec.lock index 19c806131..f075305fa 100644 --- a/experimental/federated_plugin/federated_plugin_platform_interface/pubspec.lock +++ b/experimental/federated_plugin/federated_plugin_platform_interface/pubspec.lock @@ -42,14 +42,14 @@ packages: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.15.0" + version: "1.16.0" fake_async: dependency: transitive description: name: fake_async url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.3.0" flutter: dependency: "direct main" description: flutter @@ -61,7 +61,7 @@ packages: name: flutter_lints url: "https://pub.dartlang.org" source: hosted - version: "1.0.4" + version: "2.0.1" flutter_test: dependency: "direct dev" description: flutter @@ -73,7 +73,7 @@ packages: name: lints url: "https://pub.dartlang.org" source: hosted - version: "1.0.1" + version: "2.0.0" matcher: dependency: transitive description: @@ -87,7 +87,7 @@ packages: name: material_color_utilities url: "https://pub.dartlang.org" source: hosted - version: "0.1.3" + version: "0.1.4" meta: dependency: transitive description: @@ -101,7 +101,7 @@ packages: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.8.0" + version: "1.8.1" plugin_platform_interface: dependency: "direct main" description: @@ -120,7 +120,7 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.8.1" + version: "1.8.2" stack_trace: dependency: transitive description: @@ -155,21 +155,13 @@ packages: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.8" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" + version: "0.4.9" vector_math: dependency: transitive description: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.1.1" + version: "2.1.2" sdks: - dart: ">=2.15.1 <3.0.0" - flutter: ">=1.17.0" + dart: ">=2.17.0-206.0.dev <3.0.0" diff --git a/experimental/federated_plugin/federated_plugin_platform_interface/pubspec.yaml b/experimental/federated_plugin/federated_plugin_platform_interface/pubspec.yaml index 44dfa5af8..656a23841 100644 --- a/experimental/federated_plugin/federated_plugin_platform_interface/pubspec.yaml +++ b/experimental/federated_plugin/federated_plugin_platform_interface/pubspec.yaml @@ -4,8 +4,7 @@ version: 0.0.1 homepage: environment: - sdk: ">=2.15.1 <3.0.0" - flutter: ">=1.17.0" + sdk: ">=2.17.0-0 <3.0.0" dependencies: flutter: @@ -15,4 +14,4 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - flutter_lints: ^1.0.0 + flutter_lints: ^2.0.1 diff --git a/experimental/federated_plugin/federated_plugin_web/pubspec.lock b/experimental/federated_plugin/federated_plugin_web/pubspec.lock index 9d53455bf..fac0ab3a8 100644 --- a/experimental/federated_plugin/federated_plugin_web/pubspec.lock +++ b/experimental/federated_plugin/federated_plugin_web/pubspec.lock @@ -21,7 +21,7 @@ packages: name: archive url: "https://pub.dartlang.org" source: hosted - version: "3.1.6" + version: "3.1.11" args: dependency: transitive description: @@ -49,7 +49,7 @@ packages: name: build url: "https://pub.dartlang.org" source: hosted - version: "2.2.1" + version: "2.3.0" built_collection: dependency: transitive description: @@ -63,7 +63,7 @@ packages: name: built_value url: "https://pub.dartlang.org" source: hosted - version: "8.1.4" + version: "8.3.0" characters: dependency: transitive description: @@ -98,7 +98,7 @@ packages: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.15.0" + version: "1.16.0" convert: dependency: transitive description: @@ -119,14 +119,14 @@ packages: name: dart_style url: "https://pub.dartlang.org" source: hosted - version: "2.2.2" + version: "2.2.3" fake_async: dependency: transitive description: name: fake_async url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.3.0" federated_plugin_platform_interface: dependency: "direct main" description: @@ -164,7 +164,7 @@ packages: name: flutter_lints url: "https://pub.dartlang.org" source: hosted - version: "1.0.4" + version: "2.0.1" flutter_test: dependency: "direct dev" description: flutter @@ -198,14 +198,14 @@ packages: name: js url: "https://pub.dartlang.org" source: hosted - version: "0.6.3" + version: "0.6.4" lints: dependency: transitive description: name: lints url: "https://pub.dartlang.org" source: hosted - version: "1.0.1" + version: "2.0.0" logging: dependency: transitive description: @@ -226,7 +226,7 @@ packages: name: material_color_utilities url: "https://pub.dartlang.org" source: hosted - version: "0.1.3" + version: "0.1.4" meta: dependency: transitive description: @@ -254,7 +254,7 @@ packages: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.8.0" + version: "1.8.1" platform: dependency: transitive description: @@ -294,14 +294,14 @@ packages: name: source_gen url: "https://pub.dartlang.org" source: hosted - version: "1.2.1" + version: "1.2.2" source_span: dependency: transitive description: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.8.1" + version: "1.8.2" stack_trace: dependency: transitive description: @@ -343,7 +343,7 @@ packages: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.8" + version: "0.4.9" typed_data: dependency: transitive description: @@ -357,14 +357,14 @@ packages: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.1.1" + version: "2.1.2" vm_service: dependency: transitive description: name: vm_service url: "https://pub.dartlang.org" source: hosted - version: "7.5.0" + version: "8.2.2" watcher: dependency: transitive description: @@ -387,5 +387,4 @@ packages: source: hosted version: "3.1.0" sdks: - dart: ">=2.15.1 <3.0.0" - flutter: ">=1.17.0" + dart: ">=2.17.0-206.0.dev <3.0.0" diff --git a/experimental/federated_plugin/federated_plugin_web/pubspec.yaml b/experimental/federated_plugin/federated_plugin_web/pubspec.yaml index 952f9780e..6835ccad3 100644 --- a/experimental/federated_plugin/federated_plugin_web/pubspec.yaml +++ b/experimental/federated_plugin/federated_plugin_web/pubspec.yaml @@ -4,8 +4,7 @@ version: 0.0.1 publish_to: none environment: - sdk: ">=2.12.0 <3.0.0" - flutter: ">=1.17.0" + sdk: ">=2.17.0-0 <3.0.0" dependencies: flutter: @@ -20,7 +19,7 @@ dev_dependencies: sdk: flutter integration_test: sdk: flutter - flutter_lints: ^1.0.0 + flutter_lints: ^2.0.1 mockito: ^5.0.2 flutter: diff --git a/experimental/federated_plugin/federated_plugin_windows/pubspec.lock b/experimental/federated_plugin/federated_plugin_windows/pubspec.lock index 31b15c16a..df055c8fe 100644 --- a/experimental/federated_plugin/federated_plugin_windows/pubspec.lock +++ b/experimental/federated_plugin/federated_plugin_windows/pubspec.lock @@ -42,14 +42,14 @@ packages: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.15.0" + version: "1.16.0" fake_async: dependency: transitive description: name: fake_async url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.3.0" flutter: dependency: "direct main" description: flutter @@ -61,7 +61,7 @@ packages: name: flutter_lints url: "https://pub.dartlang.org" source: hosted - version: "1.0.4" + version: "2.0.1" flutter_test: dependency: "direct dev" description: flutter @@ -73,7 +73,7 @@ packages: name: lints url: "https://pub.dartlang.org" source: hosted - version: "1.0.1" + version: "2.0.0" matcher: dependency: transitive description: @@ -87,7 +87,7 @@ packages: name: material_color_utilities url: "https://pub.dartlang.org" source: hosted - version: "0.1.3" + version: "0.1.4" meta: dependency: transitive description: @@ -101,7 +101,7 @@ packages: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.8.0" + version: "1.8.1" sky_engine: dependency: transitive description: flutter @@ -113,7 +113,7 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.8.1" + version: "1.8.2" stack_trace: dependency: transitive description: @@ -148,21 +148,13 @@ packages: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.8" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" + version: "0.4.9" vector_math: dependency: transitive description: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.1.1" + version: "2.1.2" sdks: - dart: ">=2.15.1 <3.0.0" - flutter: ">=2.5.0" + dart: ">=2.17.0-206.0.dev <3.0.0" diff --git a/experimental/federated_plugin/federated_plugin_windows/pubspec.yaml b/experimental/federated_plugin/federated_plugin_windows/pubspec.yaml index 85f08724f..de4c6ec94 100644 --- a/experimental/federated_plugin/federated_plugin_windows/pubspec.yaml +++ b/experimental/federated_plugin/federated_plugin_windows/pubspec.yaml @@ -4,8 +4,7 @@ version: 0.0.1 homepage: environment: - sdk: ">=2.15.1 <3.0.0" - flutter: ">=2.5.0" + sdk: ">=2.17.0-0 <3.0.0" dependencies: flutter: @@ -14,7 +13,7 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - flutter_lints: ^1.0.0 + flutter_lints: ^2.0.1 flutter: plugin: diff --git a/experimental/linting_tool/lib/app.dart b/experimental/linting_tool/lib/app.dart index 802b36d9b..b4d2a8bc5 100644 --- a/experimental/linting_tool/lib/app.dart +++ b/experimental/linting_tool/lib/app.dart @@ -19,7 +19,7 @@ class LintingTool extends StatefulWidget { static const String homeRoute = routes.homeRoute; @override - _LintingToolState createState() => _LintingToolState(); + State createState() => _LintingToolState(); } class _LintingToolState extends State { diff --git a/experimental/linting_tool/lib/model/profiles_store.dart b/experimental/linting_tool/lib/model/profiles_store.dart index 5526a584f..854f0f8e9 100644 --- a/experimental/linting_tool/lib/model/profiles_store.dart +++ b/experimental/linting_tool/lib/model/profiles_store.dart @@ -60,6 +60,7 @@ class ProfilesStore extends ChangeNotifier { } Future addToExistingProfile(RulesProfile profile, Rule rule) async { + // ignore: todo // TODO(abd99): Consider refactoring to LinkedHashSet/SplayTreeSet to avoid // duplication automatically. // ref: https://github.com/flutter/samples/pull/870#discussion_r685666792 diff --git a/experimental/linting_tool/lib/model/rules_store.dart b/experimental/linting_tool/lib/model/rules_store.dart index ddfd26b17..25597bec2 100644 --- a/experimental/linting_tool/lib/model/rules_store.dart +++ b/experimental/linting_tool/lib/model/rules_store.dart @@ -32,7 +32,7 @@ class RuleStore extends ChangeNotifier { String? get error => _error; List get defaultProfiles { - List _defaultProfiles = []; + List defaultProfiles = []; var rulesWithDefaultSets = rules.where((rule) => rule.sets.isNotEmpty).toList(); @@ -40,16 +40,16 @@ class RuleStore extends ChangeNotifier { for (final rule in rulesWithDefaultSets) { for (final setName in rule.sets) { var profileIndex = - _defaultProfiles.indexWhere((profile) => profile.name == setName); + defaultProfiles.indexWhere((profile) => profile.name == setName); if (profileIndex >= 0) { - _defaultProfiles[profileIndex].rules.add(rule); + defaultProfiles[profileIndex].rules.add(rule); } else { - _defaultProfiles.add(RulesProfile(name: setName, rules: [rule])); + defaultProfiles.add(RulesProfile(name: setName, rules: [rule])); } } } - return _defaultProfiles; + return defaultProfiles; } Future fetchRules() async { diff --git a/experimental/linting_tool/lib/pages/saved_lints_page.dart b/experimental/linting_tool/lib/pages/saved_lints_page.dart index 42da7781d..672ed49bf 100644 --- a/experimental/linting_tool/lib/pages/saved_lints_page.dart +++ b/experimental/linting_tool/lib/pages/saved_lints_page.dart @@ -10,9 +10,14 @@ import 'package:linting_tool/pages/rules_page.dart'; import 'package:linting_tool/theme/colors.dart'; import 'package:provider/provider.dart'; -class SavedLintsPage extends StatelessWidget { +class SavedLintsPage extends StatefulWidget { const SavedLintsPage({Key? key}) : super(key: key); + @override + State createState() => _SavedLintsPageState(); +} + +class _SavedLintsPageState extends State { @override Widget build(BuildContext context) { return Consumer( @@ -90,11 +95,14 @@ class SavedLintsPage extends StatelessWidget { onSelected: (value) async { switch (value) { case 'Export file': + // ignore: todo // TODO(abd99): Add option to select formatting style. var saved = await profilesStore .exportProfileFile(profile); + if (!mounted) return; + if (!saved) { _showSnackBar( context, @@ -112,12 +120,12 @@ class SavedLintsPage extends StatelessWidget { itemBuilder: (context) { return [ const PopupMenuItem( - child: Text('Export file'), value: 'Export file', + child: Text('Export file'), ), const PopupMenuItem( - child: Text('Delete'), value: 'Delete', + child: Text('Delete'), ), ]; }, diff --git a/experimental/linting_tool/lib/widgets/adaptive_nav.dart b/experimental/linting_tool/lib/widgets/adaptive_nav.dart index c35c1839a..8868ea98e 100644 --- a/experimental/linting_tool/lib/widgets/adaptive_nav.dart +++ b/experimental/linting_tool/lib/widgets/adaptive_nav.dart @@ -18,14 +18,14 @@ class AdaptiveNav extends StatefulWidget { const AdaptiveNav({Key? key}) : super(key: key); @override - _AdaptiveNavState createState() => _AdaptiveNavState(); + State createState() => _AdaptiveNavState(); } class _AdaptiveNavState extends State { @override Widget build(BuildContext context) { final isDesktop = isDisplayLarge(context); - const _navigationDestinations = <_Destination>[ + const navigationDestinations = <_Destination>[ _Destination( textLabel: 'Home', icon: Icons.home_outlined, @@ -46,14 +46,14 @@ class _AdaptiveNavState extends State { ), ]; - final _trailing = { + final trailing = { 'About': Icons.info_outline, }; return _NavView( extended: isDesktop, - destinations: _navigationDestinations, - trailing: _trailing, + destinations: navigationDestinations, + trailing: trailing, ); } } diff --git a/experimental/linting_tool/lib/widgets/lint_expansion_tile.dart b/experimental/linting_tool/lib/widgets/lint_expansion_tile.dart index 647a717d0..64df09601 100644 --- a/experimental/linting_tool/lib/widgets/lint_expansion_tile.dart +++ b/experimental/linting_tool/lib/widgets/lint_expansion_tile.dart @@ -19,7 +19,7 @@ class LintExpansionTile extends StatefulWidget { }) : super(key: key); @override - _LintExpansionTileState createState() => _LintExpansionTileState(); + State createState() => _LintExpansionTileState(); } class _LintExpansionTileState extends State { @@ -142,7 +142,7 @@ class _LintExpansionTileState extends State { await showDialog( context: context, builder: (context) { - return _NewProfileDialog(rule: rule); + return NewProfileDialog(rule: rule); }, ); } else if (destinationProfileType == @@ -150,7 +150,7 @@ class _LintExpansionTileState extends State { await showDialog( context: context, builder: (context) { - return _ExistingProfileDialog(rule: rule); + return ExistingProfileDialog(rule: rule); }, ); } @@ -205,22 +205,27 @@ class _ProfileTypeDialog extends StatelessWidget { } } -class _NewProfileDialog extends StatelessWidget { +class NewProfileDialog extends StatefulWidget { final Rule rule; - const _NewProfileDialog({ + const NewProfileDialog({ required this.rule, Key? key, }) : super(key: key); + @override + State createState() => _NewProfileDialogState(); +} + +class _NewProfileDialogState extends State { @override Widget build(BuildContext context) { String name = ''; - final _formKey = GlobalKey(); + final formKey = GlobalKey(); return AlertDialog( title: const Text('Create new lint profile'), content: Form( - key: _formKey, + key: formKey, autovalidateMode: AutovalidateMode.onUserInteraction, child: Column( mainAxisSize: MainAxisSize.min, @@ -251,13 +256,14 @@ class _NewProfileDialog extends StatelessWidget { ), ElevatedButton( onPressed: () async { - if (_formKey.currentState!.validate()) { + if (formKey.currentState!.validate()) { var newProfile = RulesProfile( name: name, - rules: [rule], + rules: [widget.rule], ); await Provider.of(context, listen: false) .addToNewProfile(newProfile); + if (!mounted) return; Navigator.pop(context); } }, @@ -268,14 +274,19 @@ class _NewProfileDialog extends StatelessWidget { } } -class _ExistingProfileDialog extends StatelessWidget { - const _ExistingProfileDialog({ +class ExistingProfileDialog extends StatefulWidget { + const ExistingProfileDialog({ Key? key, required this.rule, }) : super(key: key); final Rule rule; + @override + State createState() => _ExistingProfileDialogState(); +} + +class _ExistingProfileDialogState extends State { @override Widget build(BuildContext context) { var profilesStore = Provider.of(context); @@ -291,7 +302,8 @@ class _ExistingProfileDialog extends StatelessWidget { title: Text(savedProfiles[index].name), onTap: () async { await profilesStore.addToExistingProfile( - savedProfiles[index], rule); + savedProfiles[index], widget.rule); + if (!mounted) return; Navigator.pop(context); }, ), diff --git a/experimental/linting_tool/lib/widgets/saved_rule_tile.dart b/experimental/linting_tool/lib/widgets/saved_rule_tile.dart index fe97cb927..693fdbbc7 100644 --- a/experimental/linting_tool/lib/widgets/saved_rule_tile.dart +++ b/experimental/linting_tool/lib/widgets/saved_rule_tile.dart @@ -18,7 +18,7 @@ class SavedRuleTile extends StatefulWidget { }) : super(key: key); @override - _SavedRuleTileState createState() => _SavedRuleTileState(); + State createState() => _SavedRuleTileState(); } class _SavedRuleTileState extends State { diff --git a/experimental/linting_tool/linux/flutter/generated_plugins.cmake b/experimental/linting_tool/linux/flutter/generated_plugins.cmake index 73c8db305..7c9fef0b8 100644 --- a/experimental/linting_tool/linux/flutter/generated_plugins.cmake +++ b/experimental/linting_tool/linux/flutter/generated_plugins.cmake @@ -8,6 +8,9 @@ list(APPEND FLUTTER_PLUGIN_LIST window_size ) +list(APPEND FLUTTER_FFI_PLUGIN_LIST +) + set(PLUGIN_BUNDLED_LIBRARIES) foreach(plugin ${FLUTTER_PLUGIN_LIST}) @@ -16,3 +19,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/experimental/linting_tool/macos/Podfile.lock b/experimental/linting_tool/macos/Podfile.lock index 9acd71665..2ab9ee132 100644 --- a/experimental/linting_tool/macos/Podfile.lock +++ b/experimental/linting_tool/macos/Podfile.lock @@ -29,12 +29,12 @@ EXTERNAL SOURCES: :path: Flutter/ephemeral/.symlinks/plugins/window_size/macos SPEC CHECKSUMS: - file_selector_macos: ff6dc948d4ddd34e8602a1f60b7d0b4cc6051a47 + file_selector_macos: f1b08a781e66103e3ba279fd5d4024a2478b3af6 FlutterMacOS: 57701585bf7de1b3fc2bb61f6378d73bbdea8424 path_provider_macos: 160cab0d5461f0c0e02995469a98f24bdb9a3f1f - url_launcher_macos: 45af3d61de06997666568a7149c1be98b41c95d4 + url_launcher_macos: 597e05b8e514239626bcf4a850fcf9ef5c856ec3 window_size: 339dafa0b27a95a62a843042038fa6c3c48de195 PODFILE CHECKSUM: 6eac6b3292e5142cfc23bdeb71848a40ec51c14c -COCOAPODS: 1.11.0 +COCOAPODS: 1.11.3 diff --git a/experimental/linting_tool/pubspec.lock b/experimental/linting_tool/pubspec.lock index 379ef98a5..6df244240 100644 --- a/experimental/linting_tool/pubspec.lock +++ b/experimental/linting_tool/pubspec.lock @@ -49,7 +49,7 @@ packages: name: build url: "https://pub.dartlang.org" source: hosted - version: "2.2.1" + version: "2.3.0" build_config: dependency: transitive description: @@ -70,7 +70,7 @@ packages: name: build_resolvers url: "https://pub.dartlang.org" source: hosted - version: "2.0.6" + version: "2.0.8" build_runner: dependency: "direct dev" description: @@ -98,7 +98,7 @@ packages: name: built_value url: "https://pub.dartlang.org" source: hosted - version: "8.1.4" + version: "8.3.0" characters: dependency: transitive description: @@ -140,7 +140,7 @@ packages: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.15.0" + version: "1.16.0" context_menus: dependency: "direct main" description: @@ -161,14 +161,14 @@ packages: name: cross_file url: "https://pub.dartlang.org" source: hosted - version: "0.3.2" + version: "0.3.3" crypto: dependency: transitive description: name: crypto url: "https://pub.dartlang.org" source: hosted - version: "3.0.1" + version: "3.0.2" cupertino_icons: dependency: "direct main" description: @@ -182,7 +182,7 @@ packages: name: dart_style url: "https://pub.dartlang.org" source: hosted - version: "2.2.2" + version: "2.2.3" equatable: dependency: "direct main" description: @@ -196,7 +196,7 @@ packages: name: fake_async url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.3.0" ffi: dependency: transitive description: @@ -271,7 +271,7 @@ packages: name: flutter_lints url: "https://pub.dartlang.org" source: hosted - version: "1.0.4" + version: "2.0.1" flutter_markdown: dependency: "direct main" description: @@ -372,7 +372,7 @@ packages: name: js url: "https://pub.dartlang.org" source: hosted - version: "0.6.3" + version: "0.6.4" json2yaml: dependency: "direct main" description: @@ -400,7 +400,7 @@ packages: name: lints url: "https://pub.dartlang.org" source: hosted - version: "1.0.1" + version: "2.0.0" logging: dependency: transitive description: @@ -428,7 +428,7 @@ packages: name: material_color_utilities url: "https://pub.dartlang.org" source: hosted - version: "0.1.3" + version: "0.1.4" meta: dependency: transitive description: @@ -442,7 +442,7 @@ packages: name: mime url: "https://pub.dartlang.org" source: hosted - version: "1.0.1" + version: "1.0.2" mockito: dependency: "direct main" description: @@ -470,7 +470,7 @@ packages: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.8.0" + version: "1.8.1" path_provider: dependency: transitive description: @@ -484,7 +484,7 @@ packages: name: path_provider_android url: "https://pub.dartlang.org" source: hosted - version: "2.0.12" + version: "2.0.13" path_provider_ios: dependency: transitive description: @@ -594,21 +594,21 @@ packages: name: source_gen url: "https://pub.dartlang.org" source: hosted - version: "1.2.1" + version: "1.2.2" source_helper: dependency: transitive description: name: source_helper url: "https://pub.dartlang.org" source: hosted - version: "1.3.1" + version: "1.3.2" source_span: dependency: transitive description: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.8.1" + version: "1.8.2" stack_trace: dependency: transitive description: @@ -650,7 +650,7 @@ packages: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.8" + version: "0.4.9" timing: dependency: transitive description: @@ -671,14 +671,14 @@ packages: name: url_launcher url: "https://pub.dartlang.org" source: hosted - version: "6.0.20" + version: "6.1.0" url_launcher_android: dependency: transitive description: name: url_launcher_android url: "https://pub.dartlang.org" source: hosted - version: "6.0.15" + version: "6.0.16" url_launcher_ios: dependency: transitive description: @@ -727,7 +727,7 @@ packages: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.1.1" + version: "2.1.2" watcher: dependency: transitive description: @@ -741,14 +741,14 @@ packages: name: web_socket_channel url: "https://pub.dartlang.org" source: hosted - version: "2.1.0" + version: "2.2.0" win32: dependency: transitive description: name: win32 url: "https://pub.dartlang.org" source: hosted - version: "2.5.1" + version: "2.5.2" window_size: dependency: "direct main" description: @@ -773,5 +773,5 @@ packages: source: hosted version: "3.1.0" sdks: - dart: ">=2.16.0 <3.0.0" + dart: ">=2.17.0-206.0.dev <3.0.0" flutter: ">=2.10.0" diff --git a/experimental/linting_tool/pubspec.yaml b/experimental/linting_tool/pubspec.yaml index 4dd23402b..1c7d6f38c 100644 --- a/experimental/linting_tool/pubspec.yaml +++ b/experimental/linting_tool/pubspec.yaml @@ -3,10 +3,10 @@ description: A new Flutter project. version: 1.0.0+1 -publish_to: 'none' +publish_to: "none" environment: - sdk: ">=2.15.0 <3.0.0" + sdk: ">=2.17.0-0 <3.0.0" dependencies: flutter: @@ -39,7 +39,7 @@ dev_dependencies: flutter_test: sdk: flutter build_runner: ^2.0.6 - flutter_lints: ^1.0.3 + flutter_lints: ^2.0.1 hive_generator: ^1.1.0 json_serializable: ^6.2.0 diff --git a/experimental/linting_tool/windows/flutter/generated_plugins.cmake b/experimental/linting_tool/windows/flutter/generated_plugins.cmake index f3f27e476..a22fdb08d 100644 --- a/experimental/linting_tool/windows/flutter/generated_plugins.cmake +++ b/experimental/linting_tool/windows/flutter/generated_plugins.cmake @@ -8,6 +8,9 @@ list(APPEND FLUTTER_PLUGIN_LIST window_size ) +list(APPEND FLUTTER_FFI_PLUGIN_LIST +) + set(PLUGIN_BUNDLED_LIBRARIES) foreach(plugin ${FLUTTER_PLUGIN_LIST}) @@ -16,3 +19,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/experimental/web_dashboard/lib/src/app.dart b/experimental/web_dashboard/lib/src/app.dart index 6a4b3eed5..ca2a43e33 100644 --- a/experimental/web_dashboard/lib/src/app.dart +++ b/experimental/web_dashboard/lib/src/app.dart @@ -51,7 +51,7 @@ class DashboardApp extends StatefulWidget { super(key: key); @override - _DashboardAppState createState() => _DashboardAppState(); + State createState() => _DashboardAppState(); } class _DashboardAppState extends State { @@ -90,7 +90,7 @@ class SignInSwitcher extends StatefulWidget { }) : super(key: key); @override - _SignInSwitcherState createState() => _SignInSwitcherState(); + State createState() => _SignInSwitcherState(); } class _SignInSwitcherState extends State { diff --git a/experimental/web_dashboard/lib/src/pages/entries.dart b/experimental/web_dashboard/lib/src/pages/entries.dart index 7a0350eb2..7706dc4c9 100644 --- a/experimental/web_dashboard/lib/src/pages/entries.dart +++ b/experimental/web_dashboard/lib/src/pages/entries.dart @@ -2,8 +2,6 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -import 'dart:async'; - import 'package:flutter/material.dart'; import 'package:intl/intl.dart' as intl; import 'package:provider/provider.dart'; @@ -17,7 +15,7 @@ class EntriesPage extends StatefulWidget { const EntriesPage({Key? key}) : super(key: key); @override - _EntriesPageState createState() => _EntriesPageState(); + State createState() => _EntriesPageState(); } class _EntriesPageState extends State { @@ -54,7 +52,7 @@ class EntriesList extends StatefulWidget { }) : super(key: ValueKey(category?.id)); @override - _EntriesListState createState() => _EntriesListState(); + State createState() => _EntriesListState(); } class _EntriesListState extends State { @@ -129,7 +127,9 @@ class EntryTile extends StatelessWidget { TextButton( child: const Text('Delete'), onPressed: () async { - var shouldDelete = await (showDialog( + final appState = Provider.of(context, listen: false); + final scaffoldMessenger = ScaffoldMessenger.of(context); + final bool? shouldDelete = await showDialog( context: context, builder: (context) => AlertDialog( title: const Text('Delete entry?'), @@ -144,14 +144,10 @@ class EntryTile extends StatelessWidget { ), ], ), - ) as FutureOr); - if (shouldDelete) { - await Provider.of(context, listen: false) - .api! - .entries - .delete(category!.id!, entry!.id!); - - ScaffoldMessenger.of(context).showSnackBar( + ); + if (shouldDelete != null && shouldDelete) { + await appState.api!.entries.delete(category!.id!, entry!.id!); + scaffoldMessenger.showSnackBar( const SnackBar( content: Text('Entry deleted'), ), diff --git a/experimental/web_dashboard/lib/src/pages/home.dart b/experimental/web_dashboard/lib/src/pages/home.dart index 0d6ca7e24..fea401a84 100644 --- a/experimental/web_dashboard/lib/src/pages/home.dart +++ b/experimental/web_dashboard/lib/src/pages/home.dart @@ -20,7 +20,7 @@ class HomePage extends StatefulWidget { }) : super(key: key); @override - _HomePageState createState() => _HomePageState(); + State createState() => _HomePageState(); } class _HomePageState extends State { diff --git a/experimental/web_dashboard/lib/src/pages/sign_in.dart b/experimental/web_dashboard/lib/src/pages/sign_in.dart index 447c9b50e..1b7918b58 100644 --- a/experimental/web_dashboard/lib/src/pages/sign_in.dart +++ b/experimental/web_dashboard/lib/src/pages/sign_in.dart @@ -37,7 +37,7 @@ class SignInButton extends StatefulWidget { }) : super(key: key); @override - _SignInButtonState createState() => _SignInButtonState(); + State createState() => _SignInButtonState(); } class _SignInButtonState extends State { diff --git a/experimental/web_dashboard/lib/src/widgets/categories_dropdown.dart b/experimental/web_dashboard/lib/src/widgets/categories_dropdown.dart index 8692bfdbd..dc737982a 100644 --- a/experimental/web_dashboard/lib/src/widgets/categories_dropdown.dart +++ b/experimental/web_dashboard/lib/src/widgets/categories_dropdown.dart @@ -20,7 +20,7 @@ class CategoryDropdown extends StatefulWidget { }) : super(key: key); @override - _CategoryDropdownState createState() => _CategoryDropdownState(); + State createState() => _CategoryDropdownState(); } class _CategoryDropdownState extends State { @@ -105,6 +105,6 @@ class _CategoryDropdownState extends State { DropdownMenuItem _buildDropdownItem(Category category) { return DropdownMenuItem( - child: Text(category.name), value: category); + value: category, child: Text(category.name)); } } diff --git a/experimental/web_dashboard/lib/src/widgets/category_forms.dart b/experimental/web_dashboard/lib/src/widgets/category_forms.dart index a863f2b19..370f49ddd 100644 --- a/experimental/web_dashboard/lib/src/widgets/category_forms.dart +++ b/experimental/web_dashboard/lib/src/widgets/category_forms.dart @@ -11,7 +11,7 @@ class NewCategoryForm extends StatefulWidget { const NewCategoryForm({Key? key}) : super(key: key); @override - _NewCategoryFormState createState() => _NewCategoryFormState(); + State createState() => _NewCategoryFormState(); } class _NewCategoryFormState extends State { @@ -43,7 +43,7 @@ class EditCategoryForm extends StatefulWidget { }) : super(key: key); @override - _EditCategoryFormState createState() => _EditCategoryFormState(); + State createState() => _EditCategoryFormState(); } class _EditCategoryFormState extends State { diff --git a/experimental/web_dashboard/lib/src/widgets/dialogs.dart b/experimental/web_dashboard/lib/src/widgets/dialogs.dart index f39cb7c42..6f933c54c 100644 --- a/experimental/web_dashboard/lib/src/widgets/dialogs.dart +++ b/experimental/web_dashboard/lib/src/widgets/dialogs.dart @@ -57,7 +57,7 @@ class NewEntryDialog extends StatefulWidget { const NewEntryDialog({Key? key}) : super(key: key); @override - _NewEntryDialogState createState() => _NewEntryDialogState(); + State createState() => _NewEntryDialogState(); } class _NewEntryDialogState extends State { diff --git a/experimental/web_dashboard/lib/src/widgets/edit_entry.dart b/experimental/web_dashboard/lib/src/widgets/edit_entry.dart index 067083dca..3edf854d0 100644 --- a/experimental/web_dashboard/lib/src/widgets/edit_entry.dart +++ b/experimental/web_dashboard/lib/src/widgets/edit_entry.dart @@ -14,7 +14,7 @@ class NewEntryForm extends StatefulWidget { const NewEntryForm({Key? key}) : super(key: key); @override - _NewEntryFormState createState() => _NewEntryFormState(); + State createState() => _NewEntryFormState(); } class _NewEntryFormState extends State { @@ -65,7 +65,7 @@ class EditEntryForm extends StatefulWidget { }) : super(key: key); @override - _EditEntryFormState createState() => _EditEntryFormState(); + State createState() => _EditEntryFormState(); } class _EditEntryFormState extends State { diff --git a/experimental/web_dashboard/lib/src/widgets/third_party/adaptive_scaffold.dart b/experimental/web_dashboard/lib/src/widgets/third_party/adaptive_scaffold.dart index 1d7a443b0..2f8a33f05 100644 --- a/experimental/web_dashboard/lib/src/widgets/third_party/adaptive_scaffold.dart +++ b/experimental/web_dashboard/lib/src/widgets/third_party/adaptive_scaffold.dart @@ -47,7 +47,7 @@ class AdaptiveScaffold extends StatefulWidget { }) : super(key: key); @override - _AdaptiveScaffoldState createState() => _AdaptiveScaffoldState(); + State createState() => _AdaptiveScaffoldState(); } class _AdaptiveScaffoldState extends State { diff --git a/experimental/web_dashboard/pubspec.lock b/experimental/web_dashboard/pubspec.lock index a34e90688..6df59c9d4 100644 --- a/experimental/web_dashboard/pubspec.lock +++ b/experimental/web_dashboard/pubspec.lock @@ -91,7 +91,7 @@ packages: name: built_value url: "https://pub.dartlang.org" source: hosted - version: "8.2.3" + version: "8.3.0" characters: dependency: transitive description: @@ -170,7 +170,7 @@ packages: source: hosted version: "4.1.0" collection: - dependency: transitive + dependency: "direct main" description: name: collection url: "https://pub.dartlang.org" @@ -278,7 +278,7 @@ packages: name: flutter_lints url: "https://pub.dartlang.org" source: hosted - version: "1.0.4" + version: "2.0.1" flutter_test: dependency: "direct dev" description: flutter @@ -367,7 +367,7 @@ packages: source: hosted version: "4.0.0" intl: - dependency: transitive + dependency: "direct main" description: name: intl url: "https://pub.dartlang.org" @@ -407,7 +407,7 @@ packages: name: lints url: "https://pub.dartlang.org" source: hosted - version: "1.0.1" + version: "2.0.0" logging: dependency: transitive description: @@ -458,7 +458,7 @@ packages: source: hosted version: "2.0.2" path: - dependency: transitive + dependency: "direct main" description: name: path url: "https://pub.dartlang.org" @@ -638,5 +638,5 @@ packages: source: hosted version: "3.1.0" sdks: - dart: ">=2.16.0 <3.0.0" + dart: ">=2.17.0-206.0.dev <3.0.0" flutter: ">=2.8.0" diff --git a/experimental/web_dashboard/pubspec.yaml b/experimental/web_dashboard/pubspec.yaml index 004bbbcbd..1f6fea8f8 100644 --- a/experimental/web_dashboard/pubspec.yaml +++ b/experimental/web_dashboard/pubspec.yaml @@ -2,26 +2,32 @@ name: web_dashboard description: A dashboard app sample version: 1.0.0+1 publish_to: none + environment: - sdk: '>=2.12.0 <3.0.0' + sdk: ">=2.17.0-0 <3.0.0" + dependencies: - flutter: - sdk: flutter + charts_flutter: ^0.12.0 cloud_firestore: ^3.1.14 + collection: ^1.16.0 cupertino_icons: ^1.0.0 firebase_auth: ^3.3.17 firebase_core: ^1.16.0 + flutter: + sdk: flutter google_sign_in: ^5.3.1 + intl: ^0.17.0 json_annotation: ^4.5.0 + path: ^1.8.1 provider: ^6.0.0 uuid: ^3.0.0 - charts_flutter: ^0.12.0 + dev_dependencies: + build_runner: ^2.1.0 + flutter_lints: ^2.0.1 flutter_test: sdk: flutter - build_runner: ^2.1.0 - json_serializable: ^6.2.0 grinder: ^0.9.0 - flutter_lints: ^1.0.0 + json_serializable: ^6.2.0 flutter: uses-material-design: true diff --git a/experimental/web_dashboard/tool/grind.dart b/experimental/web_dashboard/tool/grind.dart index 302439ef8..ad0968277 100644 --- a/experimental/web_dashboard/tool/grind.dart +++ b/experimental/web_dashboard/tool/grind.dart @@ -82,7 +82,7 @@ Future copyright() async { Future fixCopyright() async { await for (var file in _filesWithoutCopyright()) { var contents = await file.readAsString(); - await file.writeAsString(_copyright + '\n\n' + contents); + await file.writeAsString('$_copyright\n\n$contents'); } } @@ -99,7 +99,7 @@ Stream _filesWithoutCopyright() async* { .take(3) .fold('', (previous, element) { if (previous == '') return element; - return previous + '\n' + element; + return '$previous\n$element'; }); if (firstThreeLines != _copyright) { diff --git a/flutter_maps_firestore/pubspec.lock b/flutter_maps_firestore/pubspec.lock index fd774d500..e89ce3a07 100644 --- a/flutter_maps_firestore/pubspec.lock +++ b/flutter_maps_firestore/pubspec.lock @@ -63,14 +63,14 @@ packages: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.15.0" + version: "1.16.0" fake_async: dependency: transitive description: name: fake_async url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.3.0" firebase_core: dependency: "direct main" description: @@ -103,7 +103,7 @@ packages: name: flutter_lints url: "https://pub.dartlang.org" source: hosted - version: "1.0.4" + version: "2.0.1" flutter_plugin_android_lifecycle: dependency: transitive description: @@ -162,21 +162,21 @@ packages: name: js url: "https://pub.dartlang.org" source: hosted - version: "0.6.3" + version: "0.6.4" json_annotation: dependency: transitive description: name: json_annotation url: "https://pub.dartlang.org" source: hosted - version: "4.4.0" + version: "4.5.0" lints: dependency: transitive description: name: lints url: "https://pub.dartlang.org" source: hosted - version: "1.0.1" + version: "2.0.0" location: dependency: "direct main" description: @@ -211,7 +211,7 @@ packages: name: material_color_utilities url: "https://pub.dartlang.org" source: hosted - version: "0.1.3" + version: "0.1.4" meta: dependency: transitive description: @@ -225,7 +225,7 @@ packages: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.8.0" + version: "1.8.1" plugin_platform_interface: dependency: transitive description: @@ -244,7 +244,7 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.8.1" + version: "1.8.2" stack_trace: dependency: transitive description: @@ -286,7 +286,7 @@ packages: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.8" + version: "0.4.9" typed_data: dependency: transitive description: @@ -300,7 +300,7 @@ packages: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.1.1" + version: "2.1.2" sdks: - dart: ">=2.16.0 <3.0.0" + dart: ">=2.17.0-206.0.dev <3.0.0" flutter: ">=2.5.0" diff --git a/flutter_maps_firestore/pubspec.yaml b/flutter_maps_firestore/pubspec.yaml index 460889de5..794f76844 100644 --- a/flutter_maps_firestore/pubspec.yaml +++ b/flutter_maps_firestore/pubspec.yaml @@ -3,7 +3,7 @@ description: A new Flutter project. version: 1.0.0+1 environment: - sdk: ">=2.12.0 <3.0.0" + sdk: ">=2.17.0-0 <3.0.0" dependencies: flutter: @@ -17,7 +17,7 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - flutter_lints: ^1.0.0 + flutter_lints: ^2.0.1 flutter: uses-material-design: true diff --git a/form_app/lib/src/autofill.dart b/form_app/lib/src/autofill.dart index 39cce94af..49a54b45a 100644 --- a/form_app/lib/src/autofill.dart +++ b/form_app/lib/src/autofill.dart @@ -10,7 +10,7 @@ class AutofillDemo extends StatefulWidget { const AutofillDemo({Key? key}) : super(key: key); @override - _AutofillDemoState createState() => _AutofillDemoState(); + State createState() => _AutofillDemoState(); } class _AutofillDemoState extends State { diff --git a/form_app/lib/src/form_widgets.dart b/form_app/lib/src/form_widgets.dart index 18ab6ed95..9750953be 100644 --- a/form_app/lib/src/form_widgets.dart +++ b/form_app/lib/src/form_widgets.dart @@ -9,7 +9,7 @@ class FormWidgetsDemo extends StatefulWidget { const FormWidgetsDemo({Key? key}) : super(key: key); @override - _FormWidgetsDemoState createState() => _FormWidgetsDemoState(); + State createState() => _FormWidgetsDemoState(); } class _FormWidgetsDemoState extends State { @@ -168,7 +168,7 @@ class _FormDatePicker extends StatefulWidget { }); @override - _FormDatePickerState createState() => _FormDatePickerState(); + State<_FormDatePicker> createState() => _FormDatePickerState(); } class _FormDatePickerState extends State<_FormDatePicker> { diff --git a/form_app/lib/src/sign_in_http.dart b/form_app/lib/src/sign_in_http.dart index 98da7d3ea..ecef24e3c 100644 --- a/form_app/lib/src/sign_in_http.dart +++ b/form_app/lib/src/sign_in_http.dart @@ -35,7 +35,7 @@ class SignInHttpDemo extends StatefulWidget { }) : super(key: key); @override - _SignInHttpDemoState createState() => _SignInHttpDemoState(); + State createState() => _SignInHttpDemoState(); } class _SignInHttpDemoState extends State { diff --git a/form_app/lib/src/validation.dart b/form_app/lib/src/validation.dart index 969e1ad26..55af58ddd 100644 --- a/form_app/lib/src/validation.dart +++ b/form_app/lib/src/validation.dart @@ -9,7 +9,7 @@ class FormValidationDemo extends StatefulWidget { const FormValidationDemo({Key? key}) : super(key: key); @override - _FormValidationDemoState createState() => _FormValidationDemoState(); + State createState() => _FormValidationDemoState(); } class _FormValidationDemoState extends State { diff --git a/form_app/linux/flutter/generated_plugins.cmake b/form_app/linux/flutter/generated_plugins.cmake index 9e12128db..12c7443ed 100644 --- a/form_app/linux/flutter/generated_plugins.cmake +++ b/form_app/linux/flutter/generated_plugins.cmake @@ -6,6 +6,9 @@ list(APPEND FLUTTER_PLUGIN_LIST window_size ) +list(APPEND FLUTTER_FFI_PLUGIN_LIST +) + set(PLUGIN_BUNDLED_LIBRARIES) foreach(plugin ${FLUTTER_PLUGIN_LIST}) @@ -14,3 +17,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/form_app/pubspec.lock b/form_app/pubspec.lock index f5c9cdece..9055def65 100644 --- a/form_app/pubspec.lock +++ b/form_app/pubspec.lock @@ -91,7 +91,7 @@ packages: name: built_value url: "https://pub.dartlang.org" source: hosted - version: "8.2.3" + version: "8.3.0" characters: dependency: transitive description: @@ -201,7 +201,7 @@ packages: name: flutter_lints url: "https://pub.dartlang.org" source: hosted - version: "1.0.4" + version: "2.0.1" flutter_test: dependency: "direct dev" description: flutter @@ -290,7 +290,7 @@ packages: name: lints url: "https://pub.dartlang.org" source: hosted - version: "1.0.1" + version: "2.0.0" logging: dependency: transitive description: @@ -495,4 +495,4 @@ packages: source: hosted version: "3.1.0" sdks: - dart: ">=2.17.0-0 <3.0.0" + dart: ">=2.17.0-206.0.dev <3.0.0" diff --git a/form_app/pubspec.yaml b/form_app/pubspec.yaml index 55a5c2f1d..9041639c1 100644 --- a/form_app/pubspec.yaml +++ b/form_app/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: "none" version: 1.0.0+1 environment: - sdk: '>=2.12.0 <3.0.0' + sdk: ">=2.17.0-0 <3.0.0" dependencies: flutter: @@ -24,7 +24,7 @@ dev_dependencies: sdk: flutter json_serializable: ^6.2.0 build_runner: ^2.1.8 - flutter_lints: ^1.0.0 + flutter_lints: ^2.0.1 flutter: uses-material-design: true diff --git a/game_template/lib/src/app_lifecycle/app_lifecycle.dart b/game_template/lib/src/app_lifecycle/app_lifecycle.dart index 90b93d949..b52d83431 100644 --- a/game_template/lib/src/app_lifecycle/app_lifecycle.dart +++ b/game_template/lib/src/app_lifecycle/app_lifecycle.dart @@ -50,14 +50,14 @@ class _AppLifecycleObserverState extends State @override void dispose() { - WidgetsBinding.instance!.removeObserver(this); + WidgetsBinding.instance.removeObserver(this); super.dispose(); } @override void initState() { super.initState(); - WidgetsBinding.instance!.addObserver(this); + WidgetsBinding.instance.addObserver(this); _log.info('Subscribed to app lifecycle updates'); } } diff --git a/game_template/pubspec.lock b/game_template/pubspec.lock index 2adfbcd0e..434156df3 100644 --- a/game_template/pubspec.lock +++ b/game_template/pubspec.lock @@ -7,21 +7,21 @@ packages: name: _fe_analyzer_shared url: "https://pub.dartlang.org" source: hosted - version: "31.0.0" + version: "39.0.0" analyzer: dependency: transitive description: name: analyzer url: "https://pub.dartlang.org" source: hosted - version: "2.8.0" + version: "4.0.0" archive: dependency: transitive description: name: archive url: "https://pub.dartlang.org" source: hosted - version: "3.2.2" + version: "3.3.0" args: dependency: transitive description: @@ -64,13 +64,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.3.1" - cli_util: - dependency: transitive - description: - name: cli_util - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.5" clock: dependency: transitive description: @@ -84,7 +77,7 @@ packages: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.15.0" + version: "1.16.0" convert: dependency: transitive description: @@ -98,14 +91,14 @@ packages: name: coverage url: "https://pub.dartlang.org" source: hosted - version: "1.0.3" + version: "1.2.0" crypto: dependency: transitive description: name: crypto url: "https://pub.dartlang.org" source: hosted - version: "3.0.1" + version: "3.0.2" cupertino_icons: dependency: "direct main" description: @@ -119,7 +112,7 @@ packages: name: fake_async url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.3.0" ffi: dependency: transitive description: @@ -140,35 +133,35 @@ packages: name: firebase_core url: "https://pub.dartlang.org" source: hosted - version: "1.15.0" + version: "1.16.0" firebase_core_platform_interface: dependency: transitive description: name: firebase_core_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "4.2.5" + version: "4.3.0" firebase_core_web: dependency: transitive description: name: firebase_core_web url: "https://pub.dartlang.org" source: hosted - version: "1.6.2" + version: "1.6.3" firebase_crashlytics: dependency: "direct main" description: name: firebase_crashlytics url: "https://pub.dartlang.org" source: hosted - version: "2.6.3" + version: "2.7.2" firebase_crashlytics_platform_interface: dependency: transitive description: name: firebase_crashlytics_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "3.2.4" + version: "3.2.5" flutter: dependency: "direct main" description: flutter @@ -211,14 +204,14 @@ packages: name: games_services url: "https://pub.dartlang.org" source: hosted - version: "2.0.7" + version: "2.0.8" games_services_platform_interface: dependency: transitive description: name: games_services_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.0.5" + version: "2.0.6" glob: dependency: transitive description: @@ -232,7 +225,7 @@ packages: name: go_router url: "https://pub.dartlang.org" source: hosted - version: "3.0.1" + version: "3.1.0" google_mobile_ads: dependency: "direct main" description: @@ -309,14 +302,14 @@ packages: name: js url: "https://pub.dartlang.org" source: hosted - version: "0.6.3" + version: "0.6.4" json_annotation: dependency: transitive description: name: json_annotation url: "https://pub.dartlang.org" source: hosted - version: "4.4.0" + version: "4.5.0" lints: dependency: transitive description: @@ -344,7 +337,7 @@ packages: name: material_color_utilities url: "https://pub.dartlang.org" source: hosted - version: "0.1.3" + version: "0.1.4" meta: dependency: transitive description: @@ -358,7 +351,7 @@ packages: name: mime url: "https://pub.dartlang.org" source: hosted - version: "1.0.1" + version: "1.0.2" nested: dependency: transitive description: @@ -386,7 +379,7 @@ packages: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.8.0" + version: "1.8.1" path_provider: dependency: transitive description: @@ -400,7 +393,7 @@ packages: name: path_provider_android url: "https://pub.dartlang.org" source: hosted - version: "2.0.12" + version: "2.0.13" path_provider_ios: dependency: transitive description: @@ -436,20 +429,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.0.5" - path_to_regexp: - dependency: transitive - description: - name: path_to_regexp - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.0" petitparser: dependency: transitive description: name: petitparser url: "https://pub.dartlang.org" source: hosted - version: "4.4.0" + version: "5.0.0" platform: dependency: transitive description: @@ -491,7 +477,7 @@ packages: name: pub_semver url: "https://pub.dartlang.org" source: hosted - version: "2.1.0" + version: "2.1.1" shared_preferences: dependency: "direct main" description: @@ -554,7 +540,7 @@ packages: name: shelf url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.3.0" shelf_packages_handler: dependency: transitive description: @@ -601,7 +587,7 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.8.1" + version: "1.8.2" stack_trace: dependency: transitive description: @@ -636,21 +622,21 @@ packages: name: test url: "https://pub.dartlang.org" source: hosted - version: "1.19.5" + version: "1.21.1" test_api: dependency: transitive description: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.8" + version: "0.4.9" test_core: dependency: transitive description: name: test_core url: "https://pub.dartlang.org" source: hosted - version: "0.4.9" + version: "0.4.13" typed_data: dependency: transitive description: @@ -671,14 +657,14 @@ packages: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.1.1" + version: "2.1.2" vm_service: dependency: transitive description: name: vm_service url: "https://pub.dartlang.org" source: hosted - version: "7.5.0" + version: "8.2.2" watcher: dependency: transitive description: @@ -692,21 +678,21 @@ packages: name: web_socket_channel url: "https://pub.dartlang.org" source: hosted - version: "2.1.0" + version: "2.2.0" webkit_inspection_protocol: dependency: transitive description: name: webkit_inspection_protocol url: "https://pub.dartlang.org" source: hosted - version: "1.0.0" + version: "1.0.1" win32: dependency: transitive description: name: win32 url: "https://pub.dartlang.org" source: hosted - version: "2.4.1" + version: "2.5.2" xdg_directories: dependency: transitive description: @@ -720,7 +706,7 @@ packages: name: xml url: "https://pub.dartlang.org" source: hosted - version: "5.3.1" + version: "5.4.1" yaml: dependency: transitive description: @@ -729,5 +715,5 @@ packages: source: hosted version: "3.1.0" sdks: - dart: ">=2.16.0 <3.0.0" - flutter: ">=2.8.0" + dart: ">=2.17.0-0 <3.0.0" + flutter: ">=2.8.1" diff --git a/game_template/windows/flutter/generated_plugins.cmake b/game_template/windows/flutter/generated_plugins.cmake index 4d10c2518..b93c4c30c 100644 --- a/game_template/windows/flutter/generated_plugins.cmake +++ b/game_template/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/infinite_list/linux/flutter/generated_plugins.cmake b/infinite_list/linux/flutter/generated_plugins.cmake index 9e12128db..12c7443ed 100644 --- a/infinite_list/linux/flutter/generated_plugins.cmake +++ b/infinite_list/linux/flutter/generated_plugins.cmake @@ -6,6 +6,9 @@ list(APPEND FLUTTER_PLUGIN_LIST window_size ) +list(APPEND FLUTTER_FFI_PLUGIN_LIST +) + set(PLUGIN_BUNDLED_LIBRARIES) foreach(plugin ${FLUTTER_PLUGIN_LIST}) @@ -14,3 +17,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/infinite_list/pubspec.lock b/infinite_list/pubspec.lock index e7f0d366d..ceee6805b 100644 --- a/infinite_list/pubspec.lock +++ b/infinite_list/pubspec.lock @@ -42,7 +42,7 @@ packages: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.15.0" + version: "1.16.0" cupertino_icons: dependency: "direct main" description: @@ -56,7 +56,7 @@ packages: name: fake_async url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.3.0" flutter: dependency: "direct main" description: flutter @@ -68,7 +68,7 @@ packages: name: flutter_lints url: "https://pub.dartlang.org" source: hosted - version: "1.0.4" + version: "2.0.1" flutter_test: dependency: "direct dev" description: flutter @@ -80,7 +80,7 @@ packages: name: lints url: "https://pub.dartlang.org" source: hosted - version: "1.0.1" + version: "2.0.0" matcher: dependency: transitive description: @@ -94,7 +94,7 @@ packages: name: material_color_utilities url: "https://pub.dartlang.org" source: hosted - version: "0.1.3" + version: "0.1.4" meta: dependency: "direct main" description: @@ -115,7 +115,7 @@ packages: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.8.0" + version: "1.8.1" provider: dependency: "direct main" description: @@ -134,7 +134,7 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.8.1" + version: "1.8.2" stack_trace: dependency: transitive description: @@ -169,21 +169,14 @@ packages: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.8" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" + version: "0.4.9" vector_math: dependency: transitive description: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.1.1" + version: "2.1.2" window_size: dependency: "direct main" description: @@ -194,5 +187,5 @@ packages: source: git version: "0.1.0" sdks: - dart: ">=2.14.0 <3.0.0" + dart: ">=2.17.0-206.0.dev <3.0.0" flutter: ">=1.16.0" diff --git a/infinite_list/pubspec.yaml b/infinite_list/pubspec.yaml index 57e0efd61..57c30dc89 100644 --- a/infinite_list/pubspec.yaml +++ b/infinite_list/pubspec.yaml @@ -2,11 +2,10 @@ name: infinitelist description: > A sample implementation of an infinite list. publish_to: none - version: 1.0.0+1 environment: - sdk: ">=2.12.0 <3.0.0" + sdk: ">=2.17.0-0 <3.0.0" dependencies: flutter: @@ -23,7 +22,7 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - flutter_lints: ^1.0.0 + flutter_lints: ^2.0.1 flutter: uses-material-design: true diff --git a/infinite_list/windows/flutter/generated_plugins.cmake b/infinite_list/windows/flutter/generated_plugins.cmake index 154f23857..ff2147b2c 100644 --- a/infinite_list/windows/flutter/generated_plugins.cmake +++ b/infinite_list/windows/flutter/generated_plugins.cmake @@ -6,6 +6,9 @@ list(APPEND FLUTTER_PLUGIN_LIST window_size ) +list(APPEND FLUTTER_FFI_PLUGIN_LIST +) + set(PLUGIN_BUNDLED_LIBRARIES) foreach(plugin ${FLUTTER_PLUGIN_LIST}) @@ -14,3 +17,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/ios_app_clip/lib/main.dart b/ios_app_clip/lib/main.dart index 8999971d2..fb2a4b158 100644 --- a/ios_app_clip/lib/main.dart +++ b/ios_app_clip/lib/main.dart @@ -13,10 +13,10 @@ void main() { // The same content is shown for both the main app target and in the App // Clip. class Demo extends StatefulWidget { - const Demo({Key key}) : super(key: key); + const Demo({Key? key}) : super(key: key); @override - State createState() => _DemoState(); + State createState() => _DemoState(); } class _DemoState extends State { diff --git a/ios_app_clip/pubspec.lock b/ios_app_clip/pubspec.lock index a43f5e40b..d377ed93c 100644 --- a/ios_app_clip/pubspec.lock +++ b/ios_app_clip/pubspec.lock @@ -42,7 +42,7 @@ packages: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.15.0" + version: "1.16.0" cupertino_icons: dependency: "direct main" description: @@ -70,7 +70,7 @@ packages: name: fake_async url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.3.0" flutter: dependency: "direct main" description: flutter @@ -82,7 +82,7 @@ packages: name: flutter_lints url: "https://pub.dartlang.org" source: hosted - version: "1.0.4" + version: "2.0.1" flutter_test: dependency: "direct dev" description: flutter @@ -94,7 +94,7 @@ packages: name: lints url: "https://pub.dartlang.org" source: hosted - version: "1.0.1" + version: "2.0.0" matcher: dependency: transitive description: @@ -108,7 +108,7 @@ packages: name: material_color_utilities url: "https://pub.dartlang.org" source: hosted - version: "0.1.3" + version: "0.1.4" meta: dependency: transitive description: @@ -122,7 +122,7 @@ packages: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.8.0" + version: "1.8.1" plugin_platform_interface: dependency: transitive description: @@ -141,7 +141,7 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.8.1" + version: "1.8.2" stack_trace: dependency: transitive description: @@ -176,21 +176,14 @@ packages: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.8" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" + version: "0.4.9" vector_math: dependency: transitive description: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.1.1" + version: "2.1.2" sdks: - dart: ">=2.14.0 <3.0.0" + dart: ">=2.17.0-206.0.dev <3.0.0" flutter: ">=1.12.13+hotfix.5" diff --git a/ios_app_clip/pubspec.yaml b/ios_app_clip/pubspec.yaml index b81f8b7a7..dad1dd0de 100644 --- a/ios_app_clip/pubspec.yaml +++ b/ios_app_clip/pubspec.yaml @@ -6,7 +6,7 @@ publish_to: "none" # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: - sdk: ">=2.7.0 <3.0.0" + sdk: ">=2.17.0-0 <3.0.0" dependencies: flutter: @@ -18,6 +18,6 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - flutter_lints: ^1.0.0 + flutter_lints: ^2.0.1 flutter: diff --git a/isolate_example/lib/data_transfer_page.dart b/isolate_example/lib/data_transfer_page.dart index e00cf8ba8..a6fbfb59d 100644 --- a/isolate_example/lib/data_transfer_page.dart +++ b/isolate_example/lib/data_transfer_page.dart @@ -43,11 +43,11 @@ class DataTransferPage extends StatelessWidget { mainAxisSize: MainAxisSize.min, children: [ Container( + padding: const EdgeInsets.all(8), child: Text( 'Number Generator Progress', style: Theme.of(context).textTheme.headline6, ), - padding: const EdgeInsets.all(8), ), LinearProgressIndicator( value: controller.progressPercent, @@ -59,28 +59,28 @@ class DataTransferPage extends StatelessWidget { Column( children: [ ElevatedButton( - child: const Text('Transfer Data to 2nd Isolate'), style: ElevatedButton.styleFrom( primary: (controller.runningTest == 1) ? Colors.blueAccent : Colors.grey[300]), onPressed: () => controller.generateRandomNumbers(false), + child: const Text('Transfer Data to 2nd Isolate'), ), ElevatedButton( - child: const Text('Transfer Data with TransferableTypedData'), style: ElevatedButton.styleFrom( primary: (controller.runningTest == 2) ? Colors.blueAccent : Colors.grey[300]), onPressed: () => controller.generateRandomNumbers(true), + child: const Text('Transfer Data with TransferableTypedData'), ), ElevatedButton( - child: const Text('Generate on 2nd Isolate'), style: ElevatedButton.styleFrom( primary: (controller.runningTest == 3) ? Colors.blueAccent : Colors.grey[300]), onPressed: controller.generateOnSecondaryIsolate, + child: const Text('Generate on 2nd Isolate'), ), ], ), @@ -214,10 +214,10 @@ class RunningList extends StatelessWidget { return Column( children: [ Card( + color: Colors.lightGreenAccent, child: ListTile( title: Text(progress[index]), ), - color: Colors.lightGreenAccent, ), const Divider( color: Colors.blue, diff --git a/isolate_example/lib/infinite_process_page.dart b/isolate_example/lib/infinite_process_page.dart index 6dceae569..e31ee97ca 100644 --- a/isolate_example/lib/infinite_process_page.dart +++ b/isolate_example/lib/infinite_process_page.dart @@ -58,14 +58,14 @@ class InfiniteProcessPage extends StatelessWidget { alignment: MainAxisAlignment.center, children: [ ElevatedButton( - child: const Text('Start'), style: ElevatedButton.styleFrom(elevation: 8.0), onPressed: () => controller.start(), + child: const Text('Start'), ), ElevatedButton( - child: const Text('Terminate'), style: ElevatedButton.styleFrom(elevation: 8.0), onPressed: () => controller.terminate(), + child: const Text('Terminate'), ), ], ), @@ -205,13 +205,13 @@ class RunningList extends StatelessWidget { return Column( children: [ Card( + color: (controller.created && !controller.paused) + ? Colors.lightGreenAccent + : Colors.deepOrangeAccent, child: ListTile( leading: Text('${sums.length - index}.'), title: Text('${sums[index]}.'), ), - color: (controller.created && !controller.paused) - ? Colors.lightGreenAccent - : Colors.deepOrangeAccent, ), const Divider( color: Colors.blue, diff --git a/isolate_example/lib/performance_page.dart b/isolate_example/lib/performance_page.dart index 014e4337b..c520573fd 100644 --- a/isolate_example/lib/performance_page.dart +++ b/isolate_example/lib/performance_page.dart @@ -33,7 +33,7 @@ class PerformancePage extends StatefulWidget { const PerformancePage({Key? key}) : super(key: key); @override - _PerformancePageState createState() => _PerformancePageState(); + State createState() => _PerformancePageState(); } class _PerformancePageState extends State { @@ -55,12 +55,12 @@ class _PerformancePageState extends State { future: computeFuture, builder: (context, snapshot) { return ElevatedButton( - child: const Text('Compute on Main'), style: ElevatedButton.styleFrom(elevation: 8.0), onPressed: snapshot.connectionState == ConnectionState.done ? () => handleComputeOnMain(context) : null, + child: const Text('Compute on Main'), ); }, ), @@ -68,12 +68,12 @@ class _PerformancePageState extends State { future: computeFuture, builder: (context, snapshot) { return ElevatedButton( - child: const Text('Compute on Secondary'), style: ElevatedButton.styleFrom(elevation: 8.0), onPressed: snapshot.connectionState == ConnectionState.done ? () => handleComputeOnSecondary(context) - : null); + : null, + child: const Text('Compute on Secondary')); }, ), ], @@ -130,10 +130,10 @@ class SmoothAnimationWidget extends StatefulWidget { const SmoothAnimationWidget({Key? key}) : super(key: key); @override - SmoothAnimationWidgetState createState() => SmoothAnimationWidgetState(); + State createState() => _SmoothAnimationWidgetState(); } -class SmoothAnimationWidgetState extends State +class _SmoothAnimationWidgetState extends State with TickerProviderStateMixin { late final AnimationController _animationController; late final Animation _borderAnimation; @@ -160,9 +160,6 @@ class SmoothAnimationWidgetState extends State animation: _borderAnimation, builder: (context, child) { return Container( - child: const FlutterLogo( - size: 200, - ), alignment: Alignment.bottomCenter, width: 350, height: 200, @@ -176,6 +173,9 @@ class SmoothAnimationWidgetState extends State ), borderRadius: _borderAnimation.value, ), + child: const FlutterLogo( + size: 200, + ), ); }, ), diff --git a/isolate_example/linux/flutter/generated_plugins.cmake b/isolate_example/linux/flutter/generated_plugins.cmake index 9e12128db..12c7443ed 100644 --- a/isolate_example/linux/flutter/generated_plugins.cmake +++ b/isolate_example/linux/flutter/generated_plugins.cmake @@ -6,6 +6,9 @@ list(APPEND FLUTTER_PLUGIN_LIST window_size ) +list(APPEND FLUTTER_FFI_PLUGIN_LIST +) + set(PLUGIN_BUNDLED_LIBRARIES) foreach(plugin ${FLUTTER_PLUGIN_LIST}) @@ -14,3 +17,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/isolate_example/pubspec.lock b/isolate_example/pubspec.lock index 36a527d69..5249aedad 100644 --- a/isolate_example/pubspec.lock +++ b/isolate_example/pubspec.lock @@ -42,14 +42,14 @@ packages: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.15.0" + version: "1.16.0" fake_async: dependency: transitive description: name: fake_async url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.3.0" flutter: dependency: "direct main" description: flutter @@ -61,7 +61,7 @@ packages: name: flutter_lints url: "https://pub.dartlang.org" source: hosted - version: "1.0.4" + version: "2.0.1" flutter_test: dependency: "direct dev" description: flutter @@ -73,7 +73,7 @@ packages: name: lints url: "https://pub.dartlang.org" source: hosted - version: "1.0.1" + version: "2.0.0" matcher: dependency: transitive description: @@ -87,7 +87,7 @@ packages: name: material_color_utilities url: "https://pub.dartlang.org" source: hosted - version: "0.1.3" + version: "0.1.4" meta: dependency: transitive description: @@ -108,7 +108,7 @@ packages: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.8.0" + version: "1.8.1" provider: dependency: "direct main" description: @@ -127,7 +127,7 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.8.1" + version: "1.8.2" stack_trace: dependency: transitive description: @@ -162,21 +162,14 @@ packages: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.8" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" + version: "0.4.9" vector_math: dependency: transitive description: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.1.1" + version: "2.1.2" window_size: dependency: "direct main" description: @@ -187,5 +180,5 @@ packages: source: git version: "0.1.0" sdks: - dart: ">=2.14.0 <3.0.0" + dart: ">=2.17.0-206.0.dev <3.0.0" flutter: ">=1.16.0" diff --git a/isolate_example/pubspec.yaml b/isolate_example/pubspec.yaml index d05c3ed20..5476b75f5 100644 --- a/isolate_example/pubspec.yaml +++ b/isolate_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-0 <3.0.0" dependencies: flutter: @@ -18,7 +18,7 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - flutter_lints: ^1.0.0 + flutter_lints: ^2.0.1 flutter: uses-material-design: true diff --git a/isolate_example/windows/flutter/generated_plugins.cmake b/isolate_example/windows/flutter/generated_plugins.cmake index 154f23857..ff2147b2c 100644 --- a/isolate_example/windows/flutter/generated_plugins.cmake +++ b/isolate_example/windows/flutter/generated_plugins.cmake @@ -6,6 +6,9 @@ list(APPEND FLUTTER_PLUGIN_LIST window_size ) +list(APPEND FLUTTER_FFI_PLUGIN_LIST +) + set(PLUGIN_BUNDLED_LIBRARIES) foreach(plugin ${FLUTTER_PLUGIN_LIST}) @@ -14,3 +17,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/jsonexample/linux/flutter/generated_plugins.cmake b/jsonexample/linux/flutter/generated_plugins.cmake index 9e12128db..12c7443ed 100644 --- a/jsonexample/linux/flutter/generated_plugins.cmake +++ b/jsonexample/linux/flutter/generated_plugins.cmake @@ -6,6 +6,9 @@ list(APPEND FLUTTER_PLUGIN_LIST window_size ) +list(APPEND FLUTTER_FFI_PLUGIN_LIST +) + set(PLUGIN_BUNDLED_LIBRARIES) foreach(plugin ${FLUTTER_PLUGIN_LIST}) @@ -14,3 +17,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/jsonexample/pubspec.lock b/jsonexample/pubspec.lock index ecc007cbf..58e2a01a4 100644 --- a/jsonexample/pubspec.lock +++ b/jsonexample/pubspec.lock @@ -7,14 +7,14 @@ packages: name: _fe_analyzer_shared url: "https://pub.dartlang.org" source: hosted - version: "38.0.0" + version: "39.0.0" analyzer: dependency: transitive description: name: analyzer url: "https://pub.dartlang.org" source: hosted - version: "3.4.1" + version: "4.0.0" args: dependency: transitive description: @@ -42,7 +42,7 @@ packages: name: build url: "https://pub.dartlang.org" source: hosted - version: "2.2.1" + version: "2.3.0" build_config: dependency: transitive description: @@ -63,7 +63,7 @@ packages: name: build_resolvers url: "https://pub.dartlang.org" source: hosted - version: "2.0.6" + version: "2.0.8" build_runner: dependency: "direct dev" description: @@ -140,7 +140,7 @@ packages: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.15.0" + version: "1.16.0" convert: dependency: transitive description: @@ -154,21 +154,21 @@ packages: name: crypto url: "https://pub.dartlang.org" source: hosted - version: "3.0.1" + version: "3.0.2" dart_style: dependency: transitive description: name: dart_style url: "https://pub.dartlang.org" source: hosted - version: "2.2.2" + version: "2.2.3" fake_async: dependency: transitive description: name: fake_async url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.3.0" file: dependency: transitive description: @@ -194,7 +194,7 @@ packages: name: flutter_lints url: "https://pub.dartlang.org" source: hosted - version: "1.0.4" + version: "2.0.1" flutter_test: dependency: "direct dev" description: flutter @@ -269,7 +269,7 @@ packages: name: lints url: "https://pub.dartlang.org" source: hosted - version: "1.0.1" + version: "2.0.0" logging: dependency: transitive description: @@ -290,7 +290,7 @@ packages: name: material_color_utilities url: "https://pub.dartlang.org" source: hosted - version: "0.1.3" + version: "0.1.4" meta: dependency: transitive description: @@ -304,7 +304,7 @@ packages: name: mime url: "https://pub.dartlang.org" source: hosted - version: "1.0.1" + version: "1.0.2" package_config: dependency: transitive description: @@ -318,7 +318,7 @@ packages: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.8.0" + version: "1.8.1" pool: dependency: transitive description: @@ -346,7 +346,7 @@ packages: name: quiver url: "https://pub.dartlang.org" source: hosted - version: "3.0.1+1" + version: "3.1.0" shelf: dependency: transitive description: @@ -372,21 +372,21 @@ packages: name: source_gen url: "https://pub.dartlang.org" source: hosted - version: "1.2.1" + version: "1.2.2" source_helper: dependency: transitive description: name: source_helper url: "https://pub.dartlang.org" source: hosted - version: "1.3.1" + version: "1.3.2" source_span: dependency: transitive description: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.8.1" + version: "1.8.2" stack_trace: dependency: transitive description: @@ -428,7 +428,7 @@ packages: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.8" + version: "0.4.9" timing: dependency: transitive description: @@ -449,7 +449,7 @@ packages: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.1.1" + version: "2.1.2" watcher: dependency: transitive description: @@ -463,7 +463,7 @@ packages: name: web_socket_channel url: "https://pub.dartlang.org" source: hosted - version: "2.1.0" + version: "2.2.0" window_size: dependency: "direct main" description: @@ -481,4 +481,4 @@ packages: source: hosted version: "3.1.0" sdks: - dart: ">=2.16.0 <3.0.0" + dart: ">=2.17.0-206.0.dev <3.0.0" diff --git a/jsonexample/pubspec.yaml b/jsonexample/pubspec.yaml index c72589f67..431cceda8 100644 --- a/jsonexample/pubspec.yaml +++ b/jsonexample/pubspec.yaml @@ -3,7 +3,7 @@ description: A demonstration of JSON parsing publish_to: none environment: - sdk: ">=2.12.0 <3.0.0" + sdk: ">=2.17.0-0 <3.0.0" dependencies: json_annotation: ^4.5.0 @@ -24,7 +24,7 @@ dev_dependencies: build_runner: ^2.1.10 built_value_generator: ^8.3.0 json_serializable: ^6.1.6 - flutter_lints: ^1.0.0 + flutter_lints: ^2.0.1 flutter: uses-material-design: true diff --git a/jsonexample/windows/flutter/generated_plugins.cmake b/jsonexample/windows/flutter/generated_plugins.cmake index 154f23857..ff2147b2c 100644 --- a/jsonexample/windows/flutter/generated_plugins.cmake +++ b/jsonexample/windows/flutter/generated_plugins.cmake @@ -6,6 +6,9 @@ list(APPEND FLUTTER_PLUGIN_LIST window_size ) +list(APPEND FLUTTER_FFI_PLUGIN_LIST +) + set(PLUGIN_BUNDLED_LIBRARIES) foreach(plugin ${FLUTTER_PLUGIN_LIST}) @@ -14,3 +17,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/material_3_demo/lib/color_palettes_screen.dart b/material_3_demo/lib/color_palettes_screen.dart index 33466d2a7..ed09096dc 100644 --- a/material_3_demo/lib/color_palettes_screen.dart +++ b/material_3_demo/lib/color_palettes_screen.dart @@ -281,15 +281,15 @@ class ColorChip extends StatelessWidget { final Color labelColor = onColor ?? contrastColor(color); return Container( - color: color, - child: Padding( - padding: const EdgeInsets.all(16), - child: Row( - children: [ - Expanded(child: Text(label, style: TextStyle(color: labelColor))), - ], - ), - ) + color: color, + child: Padding( + padding: const EdgeInsets.all(16), + child: Row( + children: [ + Expanded(child: Text(label, style: TextStyle(color: labelColor))), + ], + ), + ), ); } } diff --git a/material_3_demo/lib/component_screen.dart b/material_3_demo/lib/component_screen.dart index e3b5484ff..8eb41788d 100644 --- a/material_3_demo/lib/component_screen.dart +++ b/material_3_demo/lib/component_screen.dart @@ -26,9 +26,9 @@ class ComponentScreen extends StatelessWidget { _colDivider, showNavBottomBar ? const NavigationBars( - selectedIndex: 0, - isExampleBar: true, - ) + selectedIndex: 0, + isExampleBar: true, + ) : Container(), ], ), @@ -41,24 +41,25 @@ const _rowDivider = SizedBox(width: 10); const _colDivider = SizedBox(height: 10); const double _cardWidth = 115; -void Function()? handlePressed(BuildContext context, bool isDisabled, String buttonName) { +void Function()? handlePressed( + BuildContext context, bool isDisabled, String buttonName) { return isDisabled ? null : () { - final snackBar = SnackBar( - content: Text( - 'Yay! $buttonName is clicked!', - style: TextStyle(color: Theme.of(context).colorScheme.surface), - ), - action: SnackBarAction( - textColor: Theme.of(context).colorScheme.surface, - label: 'Close', - onPressed: () {}, - ), - ); + final snackBar = SnackBar( + content: Text( + 'Yay! $buttonName is clicked!', + style: TextStyle(color: Theme.of(context).colorScheme.surface), + ), + action: SnackBarAction( + textColor: Theme.of(context).colorScheme.surface, + label: 'Close', + onPressed: () {}, + ), + ); - ScaffoldMessenger.of(context).showSnackBar(snackBar); - }; + ScaffoldMessenger.of(context).showSnackBar(snackBar); + }; } class Buttons extends StatefulWidget { @@ -148,7 +149,7 @@ class ButtonsWithIcon extends StatelessWidget { children: [ ElevatedButton.icon( onPressed: - handlePressed(context, false, "ElevatedButton with Icon"), + handlePressed(context, false, "ElevatedButton with Icon"), icon: const Icon(Icons.add), label: const Text("Icon"), ), @@ -173,14 +174,14 @@ class ButtonsWithIcon extends StatelessWidget { primary: Theme.of(context).colorScheme.secondaryContainer, ).copyWith(elevation: ButtonStyleButton.allOrNull(0.0)), onPressed: - handlePressed(context, false, "FilledTonalButton with Icon"), + handlePressed(context, false, "FilledTonalButton with Icon"), label: const Text('Icon'), icon: const Icon(Icons.add), ), _colDivider, OutlinedButton.icon( onPressed: - handlePressed(context, false, "OutlinedButton with Icon"), + handlePressed(context, false, "OutlinedButton with Icon"), icon: const Icon(Icons.add), label: const Text("Icon"), ), @@ -334,22 +335,23 @@ class Dialogs extends StatefulWidget { class _DialogsState extends State { void openDialog(BuildContext context) { showDialog( - context: context, - builder: (context) => AlertDialog( - title: const Text("Basic Dialog Title"), - content: const Text( - "A dialog is a type of modal window that appears in front of app content to provide critical information, or prompt for a decision to be made."), - actions: [ - TextButton( - child: const Text('Dismiss'), - onPressed: () => Navigator.of(context).pop(), - ), - TextButton( - child: const Text('Action'), - onPressed: () => Navigator.of(context).pop(), - ), - ], - )); + context: context, + builder: (context) => AlertDialog( + title: const Text("Basic Dialog Title"), + content: const Text( + "A dialog is a type of modal window that appears in front of app content to provide critical information, or prompt for a decision to be made."), + actions: [ + TextButton( + child: const Text('Dismiss'), + onPressed: () => Navigator.of(context).pop(), + ), + TextButton( + child: const Text('Action'), + onPressed: () => Navigator.of(context).pop(), + ), + ], + ), + ); } @override @@ -395,17 +397,19 @@ const List appBarDestinations = [ ]; final List navRailDestinations = appBarDestinations - .map((destination) => NavigationRailDestination( - icon: Tooltip( - message: destination.label, - child: destination.icon, - ), - selectedIcon: Tooltip( - message: destination.label, - child: destination.selectedIcon, - ), - label: Text(destination.label) -)) + .map( + (destination) => NavigationRailDestination( + icon: Tooltip( + message: destination.label, + child: destination.icon, + ), + selectedIcon: Tooltip( + message: destination.label, + child: destination.selectedIcon, + ), + label: Text(destination.label), + ), + ) .toList(); const List exampleBarDestinations = [ @@ -436,9 +440,9 @@ class NavigationBars extends StatefulWidget { const NavigationBars( {Key? key, - this.onSelectItem, - required this.selectedIndex, - required this.isExampleBar}) + this.onSelectItem, + required this.selectedIndex, + required this.isExampleBar}) : super(key: key); @override @@ -465,7 +469,7 @@ class _NavigationBarsState extends State { if (!widget.isExampleBar) widget.onSelectItem!(index); }, destinations: - widget.isExampleBar ? exampleBarDestinations : appBarDestinations, + widget.isExampleBar ? exampleBarDestinations : appBarDestinations, ); } } diff --git a/navigation_and_routing/lib/src/app.dart b/navigation_and_routing/lib/src/app.dart index c4fe838e5..e897400d9 100644 --- a/navigation_and_routing/lib/src/app.dart +++ b/navigation_and_routing/lib/src/app.dart @@ -12,7 +12,7 @@ class Bookstore extends StatefulWidget { const Bookstore({Key? key}) : super(key: key); @override - _BookstoreState createState() => _BookstoreState(); + State createState() => _BookstoreState(); } class _BookstoreState extends State { diff --git a/navigation_and_routing/lib/src/screens/books.dart b/navigation_and_routing/lib/src/screens/books.dart index 2a436629f..1be63dbd8 100644 --- a/navigation_and_routing/lib/src/screens/books.dart +++ b/navigation_and_routing/lib/src/screens/books.dart @@ -14,7 +14,7 @@ class BooksScreen extends StatefulWidget { }) : super(key: key); @override - _BooksScreenState createState() => _BooksScreenState(); + State createState() => _BooksScreenState(); } class _BooksScreenState extends State diff --git a/navigation_and_routing/lib/src/screens/navigator.dart b/navigation_and_routing/lib/src/screens/navigator.dart index 863361da5..2d0b1fe3e 100644 --- a/navigation_and_routing/lib/src/screens/navigator.dart +++ b/navigation_and_routing/lib/src/screens/navigator.dart @@ -25,7 +25,7 @@ class BookstoreNavigator extends StatefulWidget { }) : super(key: key); @override - _BookstoreNavigatorState createState() => _BookstoreNavigatorState(); + State createState() => _BookstoreNavigatorState(); } class _BookstoreNavigatorState extends State { diff --git a/navigation_and_routing/lib/src/screens/settings.dart b/navigation_and_routing/lib/src/screens/settings.dart index 993c49901..e003da272 100644 --- a/navigation_and_routing/lib/src/screens/settings.dart +++ b/navigation_and_routing/lib/src/screens/settings.dart @@ -12,7 +12,7 @@ class SettingsScreen extends StatefulWidget { const SettingsScreen({Key? key}) : super(key: key); @override - _SettingsScreenState createState() => _SettingsScreenState(); + State createState() => _SettingsScreenState(); } class _SettingsScreenState extends State { diff --git a/navigation_and_routing/lib/src/screens/sign_in.dart b/navigation_and_routing/lib/src/screens/sign_in.dart index 0e8ca838c..4ca735379 100644 --- a/navigation_and_routing/lib/src/screens/sign_in.dart +++ b/navigation_and_routing/lib/src/screens/sign_in.dart @@ -20,7 +20,7 @@ class SignInScreen extends StatefulWidget { }) : super(key: key); @override - _SignInScreenState createState() => _SignInScreenState(); + State createState() => _SignInScreenState(); } class _SignInScreenState extends State { diff --git a/navigation_and_routing/pubspec.lock b/navigation_and_routing/pubspec.lock index f9bd31aec..fb44b79b4 100644 --- a/navigation_and_routing/pubspec.lock +++ b/navigation_and_routing/pubspec.lock @@ -138,7 +138,7 @@ packages: name: flutter_lints url: "https://pub.dartlang.org" source: hosted - version: "1.0.4" + version: "2.0.1" flutter_test: dependency: "direct dev" description: flutter @@ -197,7 +197,7 @@ packages: name: lints url: "https://pub.dartlang.org" source: hosted - version: "1.0.1" + version: "2.0.0" logging: dependency: transitive description: @@ -514,5 +514,5 @@ packages: source: hosted version: "3.1.0" sdks: - dart: ">=2.16.0 <3.0.0" + dart: ">=2.17.0-206.0.dev <3.0.0" flutter: ">=2.10.0" diff --git a/navigation_and_routing/pubspec.yaml b/navigation_and_routing/pubspec.yaml index 3450ad9f4..61c1b1509 100644 --- a/navigation_and_routing/pubspec.yaml +++ b/navigation_and_routing/pubspec.yaml @@ -1,9 +1,11 @@ name: bookstore description: Navigation and routing sample app -publish_to: 'none' # Remove this line if you wish to publish to pub.dev +publish_to: "none" # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 + environment: - sdk: ">=2.12.0 <3.0.0" + sdk: ">=2.17.0-0 <3.0.0" + dependencies: adaptive_navigation: ^0.0.3 collection: ^1.15.0 @@ -18,10 +20,12 @@ dependencies: git: url: https://github.com/google/flutter-desktop-embedding.git path: plugins/window_size + dev_dependencies: - flutter_lints: ^1.0.0 + flutter_lints: ^2.0.1 flutter_test: sdk: flutter test: ^1.16.0 + flutter: uses-material-design: true diff --git a/null_safety/null_safe_app/pubspec.lock b/null_safety/null_safe_app/pubspec.lock index 91b5cc170..2302c67b5 100644 --- a/null_safety/null_safe_app/pubspec.lock +++ b/null_safety/null_safe_app/pubspec.lock @@ -42,7 +42,7 @@ packages: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.15.0" + version: "1.16.0" cupertino_icons: dependency: "direct main" description: @@ -56,7 +56,7 @@ packages: name: fake_async url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.3.0" flutter: dependency: "direct main" description: flutter @@ -68,7 +68,7 @@ packages: name: flutter_lints url: "https://pub.dartlang.org" source: hosted - version: "1.0.4" + version: "2.0.1" flutter_test: dependency: "direct dev" description: flutter @@ -80,7 +80,7 @@ packages: name: lints url: "https://pub.dartlang.org" source: hosted - version: "1.0.1" + version: "2.0.0" matcher: dependency: transitive description: @@ -94,7 +94,7 @@ packages: name: material_color_utilities url: "https://pub.dartlang.org" source: hosted - version: "0.1.3" + version: "0.1.4" meta: dependency: transitive description: @@ -108,7 +108,7 @@ packages: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.8.0" + version: "1.8.1" sky_engine: dependency: transitive description: flutter @@ -120,7 +120,7 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.8.1" + version: "1.8.2" stack_trace: dependency: transitive description: @@ -155,21 +155,14 @@ packages: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.8" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" + version: "0.4.9" vector_math: dependency: transitive description: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.1.1" + version: "2.1.2" window_size: dependency: "direct main" description: @@ -180,5 +173,4 @@ packages: source: git version: "0.1.0" sdks: - dart: ">=2.14.0 <3.0.0" - flutter: ">=2.0.0" + dart: ">=2.17.0-206.0.dev <3.0.0" diff --git a/null_safety/null_safe_app/pubspec.yaml b/null_safety/null_safe_app/pubspec.yaml index dcf3fad70..da8dffd95 100644 --- a/null_safety/null_safe_app/pubspec.yaml +++ b/null_safety/null_safe_app/pubspec.yaml @@ -4,8 +4,7 @@ publish_to: "none" # Do not publish apps & package using the null safety experim version: 1.2.0 environment: - sdk: ">=2.12.0 <3.0.0" - flutter: ">=2.0.0" + sdk: ">=2.17.0-0 <3.0.0" dependencies: flutter: @@ -19,7 +18,7 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - flutter_lints: ^1.0.0 + flutter_lints: ^2.0.1 flutter: uses-material-design: true diff --git a/null_safety/null_safe_app/windows/flutter/generated_plugins.cmake b/null_safety/null_safe_app/windows/flutter/generated_plugins.cmake index 154f23857..ff2147b2c 100644 --- a/null_safety/null_safe_app/windows/flutter/generated_plugins.cmake +++ b/null_safety/null_safe_app/windows/flutter/generated_plugins.cmake @@ -6,6 +6,9 @@ list(APPEND FLUTTER_PLUGIN_LIST window_size ) +list(APPEND FLUTTER_FFI_PLUGIN_LIST +) + set(PLUGIN_BUNDLED_LIBRARIES) foreach(plugin ${FLUTTER_PLUGIN_LIST}) @@ -14,3 +17,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/null_safety/null_unsafe_app/pubspec.lock b/null_safety/null_unsafe_app/pubspec.lock index 6d07d58cb..2302c67b5 100644 --- a/null_safety/null_unsafe_app/pubspec.lock +++ b/null_safety/null_unsafe_app/pubspec.lock @@ -42,7 +42,7 @@ packages: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.15.0" + version: "1.16.0" cupertino_icons: dependency: "direct main" description: @@ -56,7 +56,7 @@ packages: name: fake_async url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.3.0" flutter: dependency: "direct main" description: flutter @@ -68,7 +68,7 @@ packages: name: flutter_lints url: "https://pub.dartlang.org" source: hosted - version: "1.0.4" + version: "2.0.1" flutter_test: dependency: "direct dev" description: flutter @@ -80,7 +80,7 @@ packages: name: lints url: "https://pub.dartlang.org" source: hosted - version: "1.0.1" + version: "2.0.0" matcher: dependency: transitive description: @@ -94,7 +94,7 @@ packages: name: material_color_utilities url: "https://pub.dartlang.org" source: hosted - version: "0.1.3" + version: "0.1.4" meta: dependency: transitive description: @@ -108,7 +108,7 @@ packages: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.8.0" + version: "1.8.1" sky_engine: dependency: transitive description: flutter @@ -120,7 +120,7 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.8.1" + version: "1.8.2" stack_trace: dependency: transitive description: @@ -155,21 +155,14 @@ packages: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.8" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" + version: "0.4.9" vector_math: dependency: transitive description: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.1.1" + version: "2.1.2" window_size: dependency: "direct main" description: @@ -180,4 +173,4 @@ packages: source: git version: "0.1.0" sdks: - dart: ">=2.14.0 <3.0.0" + dart: ">=2.17.0-206.0.dev <3.0.0" diff --git a/null_safety/null_unsafe_app/pubspec.yaml b/null_safety/null_unsafe_app/pubspec.yaml index fafb7d447..a399d6f18 100644 --- a/null_safety/null_unsafe_app/pubspec.yaml +++ b/null_safety/null_unsafe_app/pubspec.yaml @@ -18,7 +18,7 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - flutter_lints: ^1.0.0 + flutter_lints: ^2.0.1 flutter: uses-material-design: true diff --git a/null_safety/null_unsafe_app/windows/flutter/generated_plugins.cmake b/null_safety/null_unsafe_app/windows/flutter/generated_plugins.cmake index 154f23857..ff2147b2c 100644 --- a/null_safety/null_unsafe_app/windows/flutter/generated_plugins.cmake +++ b/null_safety/null_unsafe_app/windows/flutter/generated_plugins.cmake @@ -6,6 +6,9 @@ list(APPEND FLUTTER_PLUGIN_LIST window_size ) +list(APPEND FLUTTER_FFI_PLUGIN_LIST +) + set(PLUGIN_BUNDLED_LIBRARIES) foreach(plugin ${FLUTTER_PLUGIN_LIST}) @@ -14,3 +17,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/place_tracker/lib/place_details.dart b/place_tracker/lib/place_details.dart index 54f8a880f..71e718c0c 100644 --- a/place_tracker/lib/place_details.dart +++ b/place_tracker/lib/place_details.dart @@ -19,10 +19,10 @@ class PlaceDetails extends StatefulWidget { }) : super(key: key); @override - PlaceDetailsState createState() => PlaceDetailsState(); + State createState() => _PlaceDetailsState(); } -class PlaceDetailsState extends State { +class _PlaceDetailsState extends State { late Place _place; GoogleMapController? _mapController; final Set _markers = {}; diff --git a/place_tracker/lib/place_list.dart b/place_tracker/lib/place_list.dart index 3ecaf19f7..f041ff053 100644 --- a/place_tracker/lib/place_list.dart +++ b/place_tracker/lib/place_list.dart @@ -13,10 +13,10 @@ class PlaceList extends StatefulWidget { const PlaceList({Key? key}) : super(key: key); @override - PlaceListState createState() => PlaceListState(); + State createState() => _PlaceListState(); } -class PlaceListState extends State { +class _PlaceListState extends State { final ScrollController _scrollController = ScrollController(); @override @@ -77,16 +77,16 @@ class _CategoryButton extends StatelessWidget { @override Widget build(BuildContext context) { - late String _buttonText; + late String buttonText; switch (category) { case PlaceCategory.favorite: - _buttonText = 'Favorites'; + buttonText = 'Favorites'; break; case PlaceCategory.visited: - _buttonText = 'Visited'; + buttonText = 'Visited'; break; case PlaceCategory.wantToGo: - _buttonText = 'Want To Go'; + buttonText = 'Want To Go'; } return Container( @@ -102,7 +102,7 @@ class _CategoryButton extends StatelessWidget { height: 50.0, child: TextButton( child: Text( - _buttonText, + buttonText, style: TextStyle( fontSize: selected ? 20.0 : 18.0, color: selected ? Colors.blue : Colors.black87, diff --git a/place_tracker/lib/place_map.dart b/place_tracker/lib/place_map.dart index 06ce02927..92a36081f 100644 --- a/place_tracker/lib/place_map.dart +++ b/place_tracker/lib/place_map.dart @@ -59,10 +59,10 @@ class PlaceMap extends StatefulWidget { }) : super(key: key); @override - PlaceMapState createState() => PlaceMapState(); + State createState() => _PlaceMapState(); } -class PlaceMapState extends State { +class _PlaceMapState extends State { Completer mapController = Completer(); MapType _currentMapType = MapType.normal; @@ -170,16 +170,18 @@ class PlaceMapState extends State { Future _confirmAddPlace(BuildContext context) async { if (_pendingMarker != null) { // Create a new Place and map it to the marker we just added. + final appState = Provider.of(context, listen: false); final newPlace = Place( id: const Uuid().v1(), latLng: _pendingMarker!.position, name: _pendingMarker!.infoWindow.title!, - category: - Provider.of(context, listen: false).selectedCategory, + category: appState.selectedCategory, ); - var placeMarker = await _getPlaceMarkerIcon(context, - Provider.of(context, listen: false).selectedCategory); + final scaffoldMessenger = ScaffoldMessenger.of(context); + + var placeMarker = + await _getPlaceMarkerIcon(context, appState.selectedCategory); setState(() { final updatedMarker = _pendingMarker!.copyWith( @@ -202,7 +204,7 @@ class PlaceMapState extends State { }); // Show a confirmation snackbar that has an action to edit the new place. - ScaffoldMessenger.of(context).showSnackBar( + scaffoldMessenger.showSnackBar( SnackBar( duration: const Duration(seconds: 3), content: @@ -217,20 +219,17 @@ class PlaceMapState extends State { ); // Add the new place to the places stored in appState. - final newPlaces = - List.from(Provider.of(context, listen: false).places) - ..add(newPlace); + final newPlaces = List.from(appState.places)..add(newPlace); // Manually update our map configuration here since our map is already // updated with the new marker. Otherwise, the map would be reconfigured // in the main build method due to a modified AppState. _configuration = MapConfiguration( places: newPlaces, - selectedCategory: - Provider.of(context, listen: false).selectedCategory, + selectedCategory: appState.selectedCategory, ); - Provider.of(context, listen: false).setPlaces(newPlaces); + appState.setPlaces(newPlaces); } } @@ -472,19 +471,19 @@ class _AddPlaceButtonBar extends StatelessWidget { children: [ ElevatedButton( style: ElevatedButton.styleFrom(primary: Colors.blue), + onPressed: onSavePressed, child: const Text( 'Save', style: TextStyle(color: Colors.white, fontSize: 16.0), ), - onPressed: onSavePressed, ), ElevatedButton( style: ElevatedButton.styleFrom(primary: Colors.red), + onPressed: onCancelPressed, child: const Text( 'Cancel', style: TextStyle(color: Colors.white, fontSize: 16.0), ), - onPressed: onCancelPressed, ), ], ), diff --git a/place_tracker/pubspec.lock b/place_tracker/pubspec.lock index 670098e6b..1bab659b7 100644 --- a/place_tracker/pubspec.lock +++ b/place_tracker/pubspec.lock @@ -82,7 +82,7 @@ packages: name: flutter_lints url: "https://pub.dartlang.org" source: hosted - version: "1.0.4" + version: "2.0.1" flutter_plugin_android_lifecycle: dependency: transitive description: @@ -155,7 +155,7 @@ packages: name: lints url: "https://pub.dartlang.org" source: hosted - version: "1.0.1" + version: "2.0.0" matcher: dependency: transitive description: @@ -295,5 +295,5 @@ packages: source: hosted version: "2.1.1" sdks: - dart: ">=2.14.0 <3.0.0" + dart: ">=2.17.0-206.0.dev <3.0.0" flutter: ">=2.5.0" diff --git a/place_tracker/pubspec.yaml b/place_tracker/pubspec.yaml index d4d64eee9..b1a4fd67a 100644 --- a/place_tracker/pubspec.yaml +++ b/place_tracker/pubspec.yaml @@ -4,7 +4,7 @@ description: A new Flutter project. version: 1.0.0+1 environment: - sdk: '>=2.12.0 <3.0.0' + sdk: ">=2.17.0-0 <3.0.0" dependencies: flutter: @@ -19,7 +19,7 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - flutter_lints: ^1.0.0 + flutter_lints: ^2.0.1 flutter: assets: diff --git a/platform_channels/lib/src/add_pet_details.dart b/platform_channels/lib/src/add_pet_details.dart index 22a6358d9..dc49a33f0 100644 --- a/platform_channels/lib/src/add_pet_details.dart +++ b/platform_channels/lib/src/add_pet_details.dart @@ -13,7 +13,7 @@ class AddPetDetails extends StatefulWidget { const AddPetDetails({Key? key}) : super(key: key); @override - _AddPetDetailsState createState() => _AddPetDetailsState(); + State createState() => _AddPetDetailsState(); } class _AddPetDetailsState extends State { diff --git a/platform_channels/lib/src/event_channel_demo.dart b/platform_channels/lib/src/event_channel_demo.dart index 1b2c16357..ba013aa8e 100644 --- a/platform_channels/lib/src/event_channel_demo.dart +++ b/platform_channels/lib/src/event_channel_demo.dart @@ -34,15 +34,15 @@ class EventChannelDemo extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.center, children: [ Text( - 'x axis: ' + snapshot.data!.x.toStringAsFixed(3), + 'x axis: ${snapshot.data!.x.toStringAsFixed(3)}', style: textStyle, ), Text( - 'y axis: ' + snapshot.data!.y.toStringAsFixed(3), + 'y axis: ${snapshot.data!.y.toStringAsFixed(3)}', style: textStyle, ), Text( - 'z axis: ' + snapshot.data!.z.toStringAsFixed(3), + 'z axis: ${snapshot.data!.z.toStringAsFixed(3)}', style: textStyle, ) ], diff --git a/platform_channels/lib/src/method_channel_demo.dart b/platform_channels/lib/src/method_channel_demo.dart index 221dfb1cf..2db100b38 100644 --- a/platform_channels/lib/src/method_channel_demo.dart +++ b/platform_channels/lib/src/method_channel_demo.dart @@ -13,7 +13,7 @@ class MethodChannelDemo extends StatefulWidget { const MethodChannelDemo({Key? key}) : super(key: key); @override - _MethodChannelDemoState createState() => _MethodChannelDemoState(); + State createState() => _MethodChannelDemoState(); } class _MethodChannelDemoState extends State { diff --git a/platform_channels/lib/src/pet_list_screen.dart b/platform_channels/lib/src/pet_list_screen.dart index 1a5444f39..e24956639 100644 --- a/platform_channels/lib/src/pet_list_screen.dart +++ b/platform_channels/lib/src/pet_list_screen.dart @@ -12,7 +12,7 @@ class PetListScreen extends StatefulWidget { const PetListScreen({Key? key}) : super(key: key); @override - _PetListScreenState createState() => _PetListScreenState(); + State createState() => _PetListScreenState(); } class _PetListScreenState extends State { @@ -24,10 +24,15 @@ class _PetListScreenState extends State { super.initState(); // Receives a string of json object from the platform and converts it // to PetModel. + final scaffoldMessenger = ScaffoldMessenger.of(context); const BasicMessageChannel('stringCodecDemo', StringCodec()) .setMessageHandler((message) async { if (message == null) { - showSnackBar('An error occurred while adding pet details.', context); + scaffoldMessenger.showSnackBar( + const SnackBar( + content: Text('An error occurred while adding pet details.'), + ), + ); } else { setState(() { petListModel = PetListModel.fromJson(message); @@ -77,11 +82,16 @@ class BuildPetList extends StatelessWidget { trailing: IconButton( icon: const Icon(Icons.delete), onPressed: () async { + final scaffoldMessenger = ScaffoldMessenger.of(context); try { await PetListMessageChannel.removePet(index); - showSnackBar('Removed successfully!', context); + scaffoldMessenger.showSnackBar( + const SnackBar(content: Text('Removed successfully!')), + ); } catch (error) { - showSnackBar((error as PlatformException).message!, context); + scaffoldMessenger.showSnackBar(SnackBar( + content: Text((error as PlatformException).message!), + )); } }, ), @@ -90,9 +100,3 @@ class BuildPetList extends StatelessWidget { ); } } - -void showSnackBar(String message, BuildContext context) { - ScaffoldMessenger.of(context).showSnackBar(SnackBar( - content: Text(message), - )); -} diff --git a/platform_channels/lib/src/platform_image_demo.dart b/platform_channels/lib/src/platform_image_demo.dart index ce649ba8a..b29b73e3e 100644 --- a/platform_channels/lib/src/platform_image_demo.dart +++ b/platform_channels/lib/src/platform_image_demo.dart @@ -16,7 +16,7 @@ class PlatformImageDemo extends StatefulWidget { const PlatformImageDemo({Key? key}) : super(key: key); @override - _PlatformImageDemoState createState() => _PlatformImageDemoState(); + State createState() => _PlatformImageDemoState(); } class _PlatformImageDemoState extends State { diff --git a/platform_channels/pubspec.lock b/platform_channels/pubspec.lock index 25f311b6e..9eb292a5b 100644 --- a/platform_channels/pubspec.lock +++ b/platform_channels/pubspec.lock @@ -42,7 +42,7 @@ packages: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.15.0" + version: "1.16.0" cupertino_icons: dependency: "direct main" description: @@ -56,7 +56,7 @@ packages: name: fake_async url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.3.0" flutter: dependency: "direct main" description: flutter @@ -68,7 +68,7 @@ packages: name: flutter_lints url: "https://pub.dartlang.org" source: hosted - version: "1.0.4" + version: "2.0.1" flutter_test: dependency: "direct dev" description: flutter @@ -80,7 +80,7 @@ packages: name: lints url: "https://pub.dartlang.org" source: hosted - version: "1.0.1" + version: "2.0.0" matcher: dependency: transitive description: @@ -94,7 +94,7 @@ packages: name: material_color_utilities url: "https://pub.dartlang.org" source: hosted - version: "0.1.3" + version: "0.1.4" meta: dependency: transitive description: @@ -108,7 +108,7 @@ packages: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.8.0" + version: "1.8.1" sky_engine: dependency: transitive description: flutter @@ -120,7 +120,7 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.8.1" + version: "1.8.2" stack_trace: dependency: transitive description: @@ -155,20 +155,13 @@ packages: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.8" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" + version: "0.4.9" vector_math: dependency: transitive description: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.1.1" + version: "2.1.2" sdks: - dart: ">=2.14.0 <3.0.0" + dart: ">=2.17.0-206.0.dev <3.0.0" diff --git a/platform_channels/pubspec.yaml b/platform_channels/pubspec.yaml index 0b630eb1a..87dba9a66 100644 --- a/platform_channels/pubspec.yaml +++ b/platform_channels/pubspec.yaml @@ -4,7 +4,7 @@ description: A new Flutter project. version: 1.0.0+1 environment: - sdk: ">=2.12.0 <3.0.0" + sdk: ">=2.17.0-0 <3.0.0" dependencies: flutter: @@ -15,7 +15,7 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - flutter_lints: ^1.0.0 + flutter_lints: ^2.0.1 flutter: uses-material-design: true diff --git a/platform_channels/test/src/event_channel_demo_test.dart b/platform_channels/test/src/event_channel_demo_test.dart index 1de93ed43..9b6732536 100644 --- a/platform_channels/test/src/event_channel_demo_test.dart +++ b/platform_channels/test/src/event_channel_demo_test.dart @@ -20,7 +20,7 @@ void main() { // and add the incoming message to the StreamController used by the EventChannel // after decoding the message with codec used by the EventChannel. void emitValues(ByteData? event) { - ServicesBinding.instance?.defaultBinaryMessenger.handlePlatformMessage( + ServicesBinding.instance.defaultBinaryMessenger.handlePlatformMessage( 'eventChannelDemo', event, (reply) {}, @@ -29,7 +29,7 @@ void main() { // Register a mock for EventChannel. EventChannel under the hood uses // MethodChannel to listen and cancel the created stream. - ServicesBinding.instance?.defaultBinaryMessenger + ServicesBinding.instance.defaultBinaryMessenger .setMockMessageHandler('eventChannelDemo', (message) async { // Decode the message into MethodCallHandler. final methodCall = standardMethod.decodeMethodCall(message); @@ -57,15 +57,15 @@ void main() { // Check the values of axis. The value is rounded to 3 decimal places. expect( - find.text('x axis: ' + sensorValues[0].toStringAsFixed(3)), + find.text('x axis: ${sensorValues[0].toStringAsFixed(3)}'), findsOneWidget, ); expect( - find.text('y axis: ' + sensorValues[1].toStringAsFixed(3)), + find.text('y axis: ${sensorValues[1].toStringAsFixed(3)}'), findsOneWidget, ); expect( - find.text('z axis: ' + sensorValues[2].toStringAsFixed(3)), + find.text('z axis: ${sensorValues[2].toStringAsFixed(3)}'), findsOneWidget, ); }); diff --git a/platform_design/lib/main.dart b/platform_design/lib/main.dart index 98e44c6a9..66c65d1c6 100644 --- a/platform_design/lib/main.dart +++ b/platform_design/lib/main.dart @@ -52,7 +52,7 @@ class PlatformAdaptingHomePage extends StatefulWidget { const PlatformAdaptingHomePage({Key? key}) : super(key: key); @override - _PlatformAdaptingHomePageState createState() => + State createState() => _PlatformAdaptingHomePageState(); } diff --git a/platform_design/lib/news_tab.dart b/platform_design/lib/news_tab.dart index 5debbb4be..87896a1a1 100644 --- a/platform_design/lib/news_tab.dart +++ b/platform_design/lib/news_tab.dart @@ -18,7 +18,7 @@ class NewsTab extends StatefulWidget { const NewsTab({Key? key}) : super(key: key); @override - _NewsTabState createState() => _NewsTabState(); + State createState() => _NewsTabState(); } class _NewsTabState extends State { diff --git a/platform_design/lib/profile_tab.dart b/platform_design/lib/profile_tab.dart index 20df6a41a..e203ac494 100644 --- a/platform_design/lib/profile_tab.dart +++ b/platform_design/lib/profile_tab.dart @@ -229,9 +229,9 @@ class LogOutButton extends StatelessWidget { message: _logoutMessage, actions: [ CupertinoActionSheetAction( - child: const Text('Reprogram the night man'), isDestructiveAction: true, onPressed: () => Navigator.pop(context), + child: const Text('Reprogram the night man'), ), CupertinoActionSheetAction( child: const Text('Got it'), @@ -239,9 +239,9 @@ class LogOutButton extends StatelessWidget { ), ], cancelButton: CupertinoActionSheetAction( - child: const Text('Cancel'), isDefaultAction: true, onPressed: () => Navigator.pop(context), + child: const Text('Cancel'), ), ); }, diff --git a/platform_design/lib/settings_tab.dart b/platform_design/lib/settings_tab.dart index 6b9ea42c1..c39cfd13f 100644 --- a/platform_design/lib/settings_tab.dart +++ b/platform_design/lib/settings_tab.dart @@ -15,7 +15,7 @@ class SettingsTab extends StatefulWidget { const SettingsTab({Key? key}) : super(key: key); @override - _SettingsTabState createState() => _SettingsTabState(); + State createState() => _SettingsTabState(); } class _SettingsTabState extends State { diff --git a/platform_design/lib/songs_tab.dart b/platform_design/lib/songs_tab.dart index 6acf3d334..71f8e1e26 100644 --- a/platform_design/lib/songs_tab.dart +++ b/platform_design/lib/songs_tab.dart @@ -20,7 +20,7 @@ class SongsTab extends StatefulWidget { final Widget? androidDrawer; @override - _SongsTabState createState() => _SongsTabState(); + State createState() => _SongsTabState(); } class _SongsTabState extends State { @@ -96,7 +96,7 @@ class _SongsTabState extends State { // done in a real app but it's done here since this app // unrealistically toggles the current platform for demonstration // purposes. - WidgetsBinding.instance!.reassembleApplication(); + WidgetsBinding.instance.reassembleApplication(); } // =========================================================================== @@ -145,8 +145,8 @@ class _SongsTabState extends State { CupertinoSliverNavigationBar( trailing: CupertinoButton( padding: EdgeInsets.zero, - child: const Icon(CupertinoIcons.shuffle), onPressed: _togglePlatform, + child: const Icon(CupertinoIcons.shuffle), ), ), CupertinoSliverRefreshControl( diff --git a/platform_design/pubspec.lock b/platform_design/pubspec.lock index b072817e5..28964b13a 100644 --- a/platform_design/pubspec.lock +++ b/platform_design/pubspec.lock @@ -42,7 +42,7 @@ packages: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.15.0" + version: "1.16.0" cupertino_icons: dependency: "direct main" description: @@ -63,7 +63,7 @@ packages: name: fake_async url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.3.0" flutter: dependency: "direct main" description: flutter @@ -75,7 +75,7 @@ packages: name: flutter_lints url: "https://pub.dartlang.org" source: hosted - version: "1.0.4" + version: "2.0.1" flutter_lorem: dependency: "direct main" description: @@ -94,7 +94,7 @@ packages: name: lints url: "https://pub.dartlang.org" source: hosted - version: "1.0.1" + version: "2.0.0" matcher: dependency: transitive description: @@ -108,7 +108,7 @@ packages: name: material_color_utilities url: "https://pub.dartlang.org" source: hosted - version: "0.1.3" + version: "0.1.4" meta: dependency: transitive description: @@ -122,7 +122,7 @@ packages: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.8.0" + version: "1.8.1" sky_engine: dependency: transitive description: flutter @@ -134,7 +134,7 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.8.1" + version: "1.8.2" stack_trace: dependency: transitive description: @@ -169,20 +169,13 @@ packages: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.8" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" + version: "0.4.9" vector_math: dependency: transitive description: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.1.1" + version: "2.1.2" sdks: - dart: ">=2.14.0 <3.0.0" + dart: ">=2.17.0-206.0.dev <3.0.0" diff --git a/platform_design/pubspec.yaml b/platform_design/pubspec.yaml index e0d70976c..8db47ef8c 100644 --- a/platform_design/pubspec.yaml +++ b/platform_design/pubspec.yaml @@ -3,7 +3,7 @@ description: A project showcasing a Flutter app following different platform IA version: 1.0.0+1 environment: - sdk: ">=2.12.0 <3.0.0" + sdk: ">=2.17.0-0 <3.0.0" dependencies: english_words: ^4.0.0 @@ -16,7 +16,7 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - flutter_lints: ^1.0.0 + flutter_lints: ^2.0.1 flutter: uses-material-design: true diff --git a/platform_view_swift/lib/main.dart b/platform_view_swift/lib/main.dart index 305918000..ffe19916b 100644 --- a/platform_view_swift/lib/main.dart +++ b/platform_view_swift/lib/main.dart @@ -12,7 +12,7 @@ void main() { } class PlatformView extends StatelessWidget { - const PlatformView({Key key}) : super(key: key); + const PlatformView({Key? key}) : super(key: key); @override Widget build(BuildContext context) { @@ -27,12 +27,10 @@ class PlatformView extends StatelessWidget { } class HomePage extends StatefulWidget { - const HomePage({ - Key key, - }) : super(key: key); + const HomePage({Key? key}) : super(key: key); @override - _HomePageState createState() => _HomePageState(); + State createState() => _HomePageState(); } class _HomePageState extends State { @@ -44,7 +42,7 @@ class _HomePageState extends State { Future _launchPlatformCount() async { final platformCounter = await _methodChannel.invokeMethod('switchView', _counter); - setState(() => _counter = platformCounter); + setState(() => _counter = platformCounter ?? 0); } @override @@ -67,8 +65,8 @@ class _HomePageState extends State { ), const SizedBox(height: 18), ElevatedButton( - child: const Text('Continue in iOS view'), onPressed: _launchPlatformCount, + child: const Text('Continue in iOS view'), ), ], ), diff --git a/platform_view_swift/pubspec.lock b/platform_view_swift/pubspec.lock index 25f311b6e..9eb292a5b 100644 --- a/platform_view_swift/pubspec.lock +++ b/platform_view_swift/pubspec.lock @@ -42,7 +42,7 @@ packages: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.15.0" + version: "1.16.0" cupertino_icons: dependency: "direct main" description: @@ -56,7 +56,7 @@ packages: name: fake_async url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.3.0" flutter: dependency: "direct main" description: flutter @@ -68,7 +68,7 @@ packages: name: flutter_lints url: "https://pub.dartlang.org" source: hosted - version: "1.0.4" + version: "2.0.1" flutter_test: dependency: "direct dev" description: flutter @@ -80,7 +80,7 @@ packages: name: lints url: "https://pub.dartlang.org" source: hosted - version: "1.0.1" + version: "2.0.0" matcher: dependency: transitive description: @@ -94,7 +94,7 @@ packages: name: material_color_utilities url: "https://pub.dartlang.org" source: hosted - version: "0.1.3" + version: "0.1.4" meta: dependency: transitive description: @@ -108,7 +108,7 @@ packages: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.8.0" + version: "1.8.1" sky_engine: dependency: transitive description: flutter @@ -120,7 +120,7 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.8.1" + version: "1.8.2" stack_trace: dependency: transitive description: @@ -155,20 +155,13 @@ packages: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.8" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" + version: "0.4.9" vector_math: dependency: transitive description: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.1.1" + version: "2.1.2" sdks: - dart: ">=2.14.0 <3.0.0" + dart: ">=2.17.0-206.0.dev <3.0.0" diff --git a/platform_view_swift/pubspec.yaml b/platform_view_swift/pubspec.yaml index c81908100..abc8128ae 100644 --- a/platform_view_swift/pubspec.yaml +++ b/platform_view_swift/pubspec.yaml @@ -4,7 +4,7 @@ description: A new Flutter project. version: 1.0.0+1 environment: - sdk: ">=2.5.0 <3.0.0" + sdk: ">=2.17.0-0 <3.0.0" dependencies: flutter: @@ -15,7 +15,7 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - flutter_lints: ^1.0.0 + flutter_lints: ^2.0.1 flutter: uses-material-design: true diff --git a/provider_counter/pubspec.lock b/provider_counter/pubspec.lock index 5435494f5..c07032791 100644 --- a/provider_counter/pubspec.lock +++ b/provider_counter/pubspec.lock @@ -42,7 +42,7 @@ packages: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.15.0" + version: "1.16.0" cupertino_icons: dependency: "direct main" description: @@ -56,7 +56,7 @@ packages: name: fake_async url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.3.0" flutter: dependency: "direct main" description: flutter @@ -68,7 +68,7 @@ packages: name: flutter_lints url: "https://pub.dartlang.org" source: hosted - version: "1.0.4" + version: "2.0.1" flutter_test: dependency: "direct dev" description: flutter @@ -80,7 +80,7 @@ packages: name: lints url: "https://pub.dartlang.org" source: hosted - version: "1.0.1" + version: "2.0.0" matcher: dependency: transitive description: @@ -94,7 +94,7 @@ packages: name: material_color_utilities url: "https://pub.dartlang.org" source: hosted - version: "0.1.3" + version: "0.1.4" meta: dependency: transitive description: @@ -115,7 +115,7 @@ packages: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.8.0" + version: "1.8.1" provider: dependency: "direct main" description: @@ -134,7 +134,7 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.8.1" + version: "1.8.2" stack_trace: dependency: transitive description: @@ -169,21 +169,14 @@ packages: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.8" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" + version: "0.4.9" vector_math: dependency: transitive description: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.1.1" + version: "2.1.2" window_size: dependency: "direct main" description: @@ -194,5 +187,5 @@ packages: source: git version: "0.1.0" sdks: - dart: ">=2.14.0 <3.0.0" + dart: ">=2.17.0-206.0.dev <3.0.0" flutter: ">=1.16.0" diff --git a/provider_counter/pubspec.yaml b/provider_counter/pubspec.yaml index f5bac73cc..f8de43d83 100644 --- a/provider_counter/pubspec.yaml +++ b/provider_counter/pubspec.yaml @@ -2,11 +2,10 @@ name: provider_counter description: > The starter Flutter application, but using Provider to manage state. publish_to: none - version: 1.0.0 environment: - sdk: ">=2.12.0-0 <3.0.0" + sdk: ">=2.17.0-0 <3.0.0" dependencies: flutter: @@ -22,7 +21,7 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - flutter_lints: ^1.0.0 + flutter_lints: ^2.0.1 flutter: uses-material-design: true diff --git a/provider_shopper/lib/screens/login.dart b/provider_shopper/lib/screens/login.dart index fd71bab19..f461fdd2e 100644 --- a/provider_shopper/lib/screens/login.dart +++ b/provider_shopper/lib/screens/login.dart @@ -35,13 +35,13 @@ class MyLogin extends StatelessWidget { height: 24, ), ElevatedButton( - child: const Text('ENTER'), onPressed: () { Navigator.pushReplacementNamed(context, '/catalog'); }, style: ElevatedButton.styleFrom( primary: Colors.yellow, ), + child: const Text('ENTER'), ) ], ), diff --git a/provider_shopper/linux/flutter/generated_plugins.cmake b/provider_shopper/linux/flutter/generated_plugins.cmake index 9e12128db..12c7443ed 100644 --- a/provider_shopper/linux/flutter/generated_plugins.cmake +++ b/provider_shopper/linux/flutter/generated_plugins.cmake @@ -6,6 +6,9 @@ list(APPEND FLUTTER_PLUGIN_LIST window_size ) +list(APPEND FLUTTER_FFI_PLUGIN_LIST +) + set(PLUGIN_BUNDLED_LIBRARIES) foreach(plugin ${FLUTTER_PLUGIN_LIST}) @@ -14,3 +17,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/provider_shopper/pubspec.lock b/provider_shopper/pubspec.lock index 37a0cae86..5249aedad 100644 --- a/provider_shopper/pubspec.lock +++ b/provider_shopper/pubspec.lock @@ -61,7 +61,7 @@ packages: name: flutter_lints url: "https://pub.dartlang.org" source: hosted - version: "1.0.4" + version: "2.0.1" flutter_test: dependency: "direct dev" description: flutter @@ -73,7 +73,7 @@ packages: name: lints url: "https://pub.dartlang.org" source: hosted - version: "1.0.1" + version: "2.0.0" matcher: dependency: transitive description: @@ -180,5 +180,5 @@ packages: source: git version: "0.1.0" sdks: - dart: ">=2.17.0-0 <3.0.0" + dart: ">=2.17.0-206.0.dev <3.0.0" flutter: ">=1.16.0" diff --git a/provider_shopper/pubspec.yaml b/provider_shopper/pubspec.yaml index 58bbcc03f..76edfb554 100644 --- a/provider_shopper/pubspec.yaml +++ b/provider_shopper/pubspec.yaml @@ -5,7 +5,7 @@ publish_to: none version: 1.0.0+1 environment: - sdk: ">=2.12.0 <3.0.0" + sdk: ">=2.17.0-0 <3.0.0" dependencies: flutter: @@ -23,7 +23,7 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - flutter_lints: ^1.0.0 + flutter_lints: ^2.0.1 flutter: uses-material-design: true diff --git a/simplistic_calculator/lib/main.dart b/simplistic_calculator/lib/main.dart index d7d42b12d..4d2e07b36 100644 --- a/simplistic_calculator/lib/main.dart +++ b/simplistic_calculator/lib/main.dart @@ -448,6 +448,7 @@ class CalculatorApp extends ConsumerWidget { } typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); + enum CalcButtonType { outlined, elevated } class CalcButton extends ConsumerWidget { diff --git a/simplistic_calculator/linux/flutter/generated_plugins.cmake b/simplistic_calculator/linux/flutter/generated_plugins.cmake index 9e12128db..12c7443ed 100644 --- a/simplistic_calculator/linux/flutter/generated_plugins.cmake +++ b/simplistic_calculator/linux/flutter/generated_plugins.cmake @@ -6,6 +6,9 @@ list(APPEND FLUTTER_PLUGIN_LIST window_size ) +list(APPEND FLUTTER_FFI_PLUGIN_LIST +) + set(PLUGIN_BUNDLED_LIBRARIES) foreach(plugin ${FLUTTER_PLUGIN_LIST}) @@ -14,3 +17,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/simplistic_calculator/pubspec.lock b/simplistic_calculator/pubspec.lock index 371a6350c..1a75b26c3 100644 --- a/simplistic_calculator/pubspec.lock +++ b/simplistic_calculator/pubspec.lock @@ -49,7 +49,7 @@ packages: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.15.0" + version: "1.16.0" cupertino_icons: dependency: "direct main" description: @@ -63,7 +63,7 @@ packages: name: fake_async url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.3.0" fluent_ui: dependency: "direct main" description: @@ -141,7 +141,7 @@ packages: name: material_color_utilities url: "https://pub.dartlang.org" source: hosted - version: "0.1.3" + version: "0.1.4" math_expressions: dependency: "direct main" description: @@ -162,14 +162,14 @@ packages: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.8.0" + version: "1.8.1" quiver: dependency: transitive description: name: quiver url: "https://pub.dartlang.org" source: hosted - version: "3.0.1+1" + version: "3.1.0" recase: dependency: transitive description: @@ -202,7 +202,7 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.8.1" + version: "1.8.2" stack_trace: dependency: transitive description: @@ -244,21 +244,14 @@ packages: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.8" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" + version: "0.4.9" vector_math: dependency: transitive description: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.1.1" + version: "2.1.2" window_size: dependency: "direct main" description: @@ -269,5 +262,5 @@ packages: source: git version: "0.1.0" sdks: - dart: ">=2.16.1 <3.0.0" + dart: ">=2.17.0-0 <3.0.0" flutter: ">=2.8.0" diff --git a/simplistic_calculator/typer/main_66.dart b/simplistic_calculator/typer/main_66.dart index dbda34bfc..d02f9d12e 100644 --- a/simplistic_calculator/typer/main_66.dart +++ b/simplistic_calculator/typer/main_66.dart @@ -196,6 +196,7 @@ class CalculatorApp extends ConsumerWidget { } typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); + enum CalcButtonType { outlined, elevated } class CalcButton extends ConsumerWidget { diff --git a/simplistic_calculator/typer/main_67.dart b/simplistic_calculator/typer/main_67.dart index dbb75242d..875b330cf 100644 --- a/simplistic_calculator/typer/main_67.dart +++ b/simplistic_calculator/typer/main_67.dart @@ -196,6 +196,7 @@ class CalculatorApp extends ConsumerWidget { } typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); + enum CalcButtonType { outlined, elevated } class CalcButton extends ConsumerWidget { diff --git a/simplistic_calculator/typer/main_68.dart b/simplistic_calculator/typer/main_68.dart index 02a3200b3..0be4dc474 100644 --- a/simplistic_calculator/typer/main_68.dart +++ b/simplistic_calculator/typer/main_68.dart @@ -196,6 +196,7 @@ class CalculatorApp extends ConsumerWidget { } typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); + enum CalcButtonType { outlined, elevated } class CalcButton extends ConsumerWidget { diff --git a/simplistic_calculator/typer/main_69.dart b/simplistic_calculator/typer/main_69.dart index 2d4407778..e6e66c850 100644 --- a/simplistic_calculator/typer/main_69.dart +++ b/simplistic_calculator/typer/main_69.dart @@ -196,6 +196,7 @@ class CalculatorApp extends ConsumerWidget { } typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); + enum CalcButtonType { outlined, elevated } class CalcButton extends ConsumerWidget { diff --git a/simplistic_calculator/typer/main_70.dart b/simplistic_calculator/typer/main_70.dart index 8d9c91c99..a350ac6aa 100644 --- a/simplistic_calculator/typer/main_70.dart +++ b/simplistic_calculator/typer/main_70.dart @@ -196,6 +196,7 @@ class CalculatorApp extends ConsumerWidget { } typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); + enum CalcButtonType { outlined, elevated } class CalcButton extends ConsumerWidget { diff --git a/simplistic_calculator/typer/main_71.dart b/simplistic_calculator/typer/main_71.dart index 888daf595..756b91ee8 100644 --- a/simplistic_calculator/typer/main_71.dart +++ b/simplistic_calculator/typer/main_71.dart @@ -197,6 +197,7 @@ class CalculatorApp extends ConsumerWidget { } typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); + enum CalcButtonType { outlined, elevated } class CalcButton extends ConsumerWidget { diff --git a/simplistic_calculator/typer/main_72.dart b/simplistic_calculator/typer/main_72.dart index efdb66f16..df509b09d 100644 --- a/simplistic_calculator/typer/main_72.dart +++ b/simplistic_calculator/typer/main_72.dart @@ -198,6 +198,7 @@ class CalculatorApp extends ConsumerWidget { } typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); + enum CalcButtonType { outlined, elevated } class CalcButton extends ConsumerWidget { diff --git a/simplistic_calculator/typer/main_73.dart b/simplistic_calculator/typer/main_73.dart index 2f04db7ab..1dfa75e4f 100644 --- a/simplistic_calculator/typer/main_73.dart +++ b/simplistic_calculator/typer/main_73.dart @@ -199,6 +199,7 @@ class CalculatorApp extends ConsumerWidget { } typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); + enum CalcButtonType { outlined, elevated } class CalcButton extends ConsumerWidget { diff --git a/simplistic_calculator/typer/main_74.dart b/simplistic_calculator/typer/main_74.dart index ee51e8b9f..a1f5a11d4 100644 --- a/simplistic_calculator/typer/main_74.dart +++ b/simplistic_calculator/typer/main_74.dart @@ -200,6 +200,7 @@ class CalculatorApp extends ConsumerWidget { } typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); + enum CalcButtonType { outlined, elevated } class CalcButton extends ConsumerWidget { diff --git a/simplistic_calculator/typer/main_75.dart b/simplistic_calculator/typer/main_75.dart index ce7d06e64..6ca647e76 100644 --- a/simplistic_calculator/typer/main_75.dart +++ b/simplistic_calculator/typer/main_75.dart @@ -202,6 +202,7 @@ class CalculatorApp extends ConsumerWidget { } typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); + enum CalcButtonType { outlined, elevated } class CalcButton extends ConsumerWidget { diff --git a/simplistic_calculator/typer/main_76.dart b/simplistic_calculator/typer/main_76.dart index 4592738ed..fe4e28092 100644 --- a/simplistic_calculator/typer/main_76.dart +++ b/simplistic_calculator/typer/main_76.dart @@ -203,6 +203,7 @@ class CalculatorApp extends ConsumerWidget { } typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); + enum CalcButtonType { outlined, elevated } class CalcButton extends ConsumerWidget { diff --git a/simplistic_calculator/typer/main_77.dart b/simplistic_calculator/typer/main_77.dart index 4a504cf92..3e39adb65 100644 --- a/simplistic_calculator/typer/main_77.dart +++ b/simplistic_calculator/typer/main_77.dart @@ -204,6 +204,7 @@ class CalculatorApp extends ConsumerWidget { } typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); + enum CalcButtonType { outlined, elevated } class CalcButton extends ConsumerWidget { diff --git a/simplistic_calculator/typer/main_78.dart b/simplistic_calculator/typer/main_78.dart index 15b9ecc62..e32d11334 100644 --- a/simplistic_calculator/typer/main_78.dart +++ b/simplistic_calculator/typer/main_78.dart @@ -205,6 +205,7 @@ class CalculatorApp extends ConsumerWidget { } typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); + enum CalcButtonType { outlined, elevated } class CalcButton extends ConsumerWidget { diff --git a/simplistic_calculator/typer/main_79.dart b/simplistic_calculator/typer/main_79.dart index 760f44c71..bcd5cb073 100644 --- a/simplistic_calculator/typer/main_79.dart +++ b/simplistic_calculator/typer/main_79.dart @@ -206,6 +206,7 @@ class CalculatorApp extends ConsumerWidget { } typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); + enum CalcButtonType { outlined, elevated } class CalcButton extends ConsumerWidget { diff --git a/simplistic_calculator/typer/main_80.dart b/simplistic_calculator/typer/main_80.dart index a42a1f70a..f33be9ae2 100644 --- a/simplistic_calculator/typer/main_80.dart +++ b/simplistic_calculator/typer/main_80.dart @@ -207,6 +207,7 @@ class CalculatorApp extends ConsumerWidget { } typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); + enum CalcButtonType { outlined, elevated } class CalcButton extends ConsumerWidget { diff --git a/simplistic_calculator/typer/main_81.dart b/simplistic_calculator/typer/main_81.dart index 7c4901488..890cb4389 100644 --- a/simplistic_calculator/typer/main_81.dart +++ b/simplistic_calculator/typer/main_81.dart @@ -215,6 +215,7 @@ class CalculatorApp extends ConsumerWidget { } typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); + enum CalcButtonType { outlined, elevated } class CalcButton extends ConsumerWidget { diff --git a/simplistic_calculator/typer/main_82.dart b/simplistic_calculator/typer/main_82.dart index a31c3f999..930d90c9b 100644 --- a/simplistic_calculator/typer/main_82.dart +++ b/simplistic_calculator/typer/main_82.dart @@ -215,6 +215,7 @@ class CalculatorApp extends ConsumerWidget { } typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); + enum CalcButtonType { outlined, elevated } class CalcButton extends ConsumerWidget { diff --git a/simplistic_calculator/typer/main_83.dart b/simplistic_calculator/typer/main_83.dart index 03c7a8fab..a30a6c6a9 100644 --- a/simplistic_calculator/typer/main_83.dart +++ b/simplistic_calculator/typer/main_83.dart @@ -220,6 +220,7 @@ class CalculatorApp extends ConsumerWidget { } typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); + enum CalcButtonType { outlined, elevated } class CalcButton extends ConsumerWidget { diff --git a/simplistic_calculator/typer/main_84.dart b/simplistic_calculator/typer/main_84.dart index c6d4d82be..542d66d61 100644 --- a/simplistic_calculator/typer/main_84.dart +++ b/simplistic_calculator/typer/main_84.dart @@ -225,6 +225,7 @@ class CalculatorApp extends ConsumerWidget { } typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); + enum CalcButtonType { outlined, elevated } class CalcButton extends ConsumerWidget { diff --git a/simplistic_calculator/typer/main_85.dart b/simplistic_calculator/typer/main_85.dart index 997546d05..a31e411ae 100644 --- a/simplistic_calculator/typer/main_85.dart +++ b/simplistic_calculator/typer/main_85.dart @@ -230,6 +230,7 @@ class CalculatorApp extends ConsumerWidget { } typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); + enum CalcButtonType { outlined, elevated } class CalcButton extends ConsumerWidget { diff --git a/simplistic_calculator/typer/main_86.dart b/simplistic_calculator/typer/main_86.dart index 473ab6e44..344cd1550 100644 --- a/simplistic_calculator/typer/main_86.dart +++ b/simplistic_calculator/typer/main_86.dart @@ -235,6 +235,7 @@ class CalculatorApp extends ConsumerWidget { } typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); + enum CalcButtonType { outlined, elevated } class CalcButton extends ConsumerWidget { diff --git a/simplistic_calculator/typer/main_87.dart b/simplistic_calculator/typer/main_87.dart index 5c208ff02..630f73986 100644 --- a/simplistic_calculator/typer/main_87.dart +++ b/simplistic_calculator/typer/main_87.dart @@ -236,6 +236,7 @@ class CalculatorApp extends ConsumerWidget { } typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); + enum CalcButtonType { outlined, elevated } class CalcButton extends ConsumerWidget { diff --git a/simplistic_calculator/typer/main_88.dart b/simplistic_calculator/typer/main_88.dart index fade893b0..13926876f 100644 --- a/simplistic_calculator/typer/main_88.dart +++ b/simplistic_calculator/typer/main_88.dart @@ -238,6 +238,7 @@ class CalculatorApp extends ConsumerWidget { } typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); + enum CalcButtonType { outlined, elevated } class CalcButton extends ConsumerWidget { diff --git a/simplistic_calculator/typer/main_89.dart b/simplistic_calculator/typer/main_89.dart index 25cddadda..c95dc5fa2 100644 --- a/simplistic_calculator/typer/main_89.dart +++ b/simplistic_calculator/typer/main_89.dart @@ -246,6 +246,7 @@ class CalculatorApp extends ConsumerWidget { } typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); + enum CalcButtonType { outlined, elevated } class CalcButton extends ConsumerWidget { diff --git a/simplistic_calculator/typer/main_90.dart b/simplistic_calculator/typer/main_90.dart index 672925625..c7d78be96 100644 --- a/simplistic_calculator/typer/main_90.dart +++ b/simplistic_calculator/typer/main_90.dart @@ -251,6 +251,7 @@ class CalculatorApp extends ConsumerWidget { } typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); + enum CalcButtonType { outlined, elevated } class CalcButton extends ConsumerWidget { diff --git a/simplistic_calculator/typer/main_92.dart b/simplistic_calculator/typer/main_92.dart index 4dd78c08f..5ee2af4a6 100644 --- a/simplistic_calculator/typer/main_92.dart +++ b/simplistic_calculator/typer/main_92.dart @@ -273,6 +273,7 @@ class CalculatorApp extends ConsumerWidget { } typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); + enum CalcButtonType { outlined, elevated } class CalcButton extends ConsumerWidget { diff --git a/simplistic_calculator/typer/main_93.dart b/simplistic_calculator/typer/main_93.dart index c7e8351bd..d01107c0a 100644 --- a/simplistic_calculator/typer/main_93.dart +++ b/simplistic_calculator/typer/main_93.dart @@ -273,6 +273,7 @@ class CalculatorApp extends ConsumerWidget { } typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); + enum CalcButtonType { outlined, elevated } class CalcButton extends ConsumerWidget { diff --git a/simplistic_calculator/typer/main_94.dart b/simplistic_calculator/typer/main_94.dart index 0a57e86d5..e6a173bdf 100644 --- a/simplistic_calculator/typer/main_94.dart +++ b/simplistic_calculator/typer/main_94.dart @@ -283,6 +283,7 @@ class CalculatorApp extends ConsumerWidget { } typedef CalculatorEngineCallback = void Function(CalculatorEngine engine); + enum CalcButtonType { outlined, elevated } class CalcButton extends ConsumerWidget { diff --git a/simplistic_calculator/windows/flutter/generated_plugins.cmake b/simplistic_calculator/windows/flutter/generated_plugins.cmake index 154f23857..ff2147b2c 100644 --- a/simplistic_calculator/windows/flutter/generated_plugins.cmake +++ b/simplistic_calculator/windows/flutter/generated_plugins.cmake @@ -6,6 +6,9 @@ list(APPEND FLUTTER_PLUGIN_LIST window_size ) +list(APPEND FLUTTER_FFI_PLUGIN_LIST +) + set(PLUGIN_BUNDLED_LIBRARIES) foreach(plugin ${FLUTTER_PLUGIN_LIST}) @@ -14,3 +17,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/simplistic_editor/lib/basic_text_field.dart b/simplistic_editor/lib/basic_text_field.dart index 03819f757..1261d963e 100644 --- a/simplistic_editor/lib/basic_text_field.dart +++ b/simplistic_editor/lib/basic_text_field.dart @@ -22,8 +22,10 @@ class BasicTextField extends StatefulWidget { } class _BasicTextFieldState extends State { - final GlobalKey textInputClientKey = GlobalKey(); - BasicTextInputClientState? get _textInputClient => textInputClientKey.currentState; + final GlobalKey textInputClientKey = + GlobalKey(); + BasicTextInputClientState? get _textInputClient => + textInputClientKey.currentState; RenderEditable get _renderEditable => _textInputClient!.renderEditable; // For text selection gestures. @@ -42,8 +44,8 @@ class _BasicTextFieldState extends State { return false; } - if (cause == SelectionChangedCause.longPress - || cause == SelectionChangedCause.scribble) { + if (cause == SelectionChangedCause.longPress || + cause == SelectionChangedCause.scribble) { return true; } @@ -54,7 +56,8 @@ class _BasicTextFieldState extends State { return false; } - void _handleSelectionChanged(TextSelection selection, SelectionChangedCause? cause) { + void _handleSelectionChanged( + TextSelection selection, SelectionChangedCause? cause) { final bool willShowSelectionHandles = _shouldShowSelectionHandles(cause); if (willShowSelectionHandles != _showSelectionHandles) { setState(() { @@ -128,16 +131,20 @@ class _BasicTextFieldState extends State { case TargetPlatform.linux: case TargetPlatform.windows: _renderEditable.selectWordsInRange( - from: longPressMoveUpdateDetails.globalPosition - longPressMoveUpdateDetails.offsetFromOrigin, + from: longPressMoveUpdateDetails.globalPosition - + longPressMoveUpdateDetails.offsetFromOrigin, to: longPressMoveUpdateDetails.globalPosition, cause: SelectionChangedCause.longPress, ); break; } }, - onLongPressEnd: (longPressEndDetails) => _textInputClient!.showToolbar(), - onHorizontalDragStart: (dragStartDetails) => _onDragStart(dragStartDetails), - onHorizontalDragUpdate: (dragUpdateDetails) => _onDragUpdate(dragUpdateDetails), + onLongPressEnd: (longPressEndDetails) => + _textInputClient!.showToolbar(), + onHorizontalDragStart: (dragStartDetails) => + _onDragStart(dragStartDetails), + onHorizontalDragUpdate: (dragUpdateDetails) => + _onDragUpdate(dragUpdateDetails), child: SizedBox( height: double.infinity, width: MediaQuery.of(context).size.width, @@ -160,4 +167,4 @@ class _BasicTextFieldState extends State { ), ); } -} \ No newline at end of file +} diff --git a/simplistic_editor/lib/basic_text_input_client.dart b/simplistic_editor/lib/basic_text_input_client.dart index dbc0cfdd6..7be351a9f 100644 --- a/simplistic_editor/lib/basic_text_input_client.dart +++ b/simplistic_editor/lib/basic_text_input_client.dart @@ -11,7 +11,8 @@ import 'toggle_button_state_manager.dart'; /// Signature for the callback that reports when the user changes the selection /// (including the cursor location). -typedef SelectionChangedCallback = void Function(TextSelection selection, SelectionChangedCause? cause); +typedef SelectionChangedCallback = void Function( + TextSelection selection, SelectionChangedCause? cause); /// A basic text input client. An implementation of [DeltaTextInputClient] meant to /// send/receive information from the framework to the platform's text input plugin @@ -39,11 +40,13 @@ class BasicTextInputClient extends StatefulWidget { } class BasicTextInputClientState extends State - with TextSelectionDelegate implements DeltaTextInputClient { + with TextSelectionDelegate + implements DeltaTextInputClient { final GlobalKey _textKey = GlobalKey(); late final ToggleButtonsStateManager toggleButtonStateManager; late final TextEditingDeltaHistoryManager textEditingDeltaHistoryManager; - final ClipboardStatusNotifier? _clipboardStatus = kIsWeb ? null : ClipboardStatusNotifier(); + final ClipboardStatusNotifier? _clipboardStatus = + kIsWeb ? null : ClipboardStatusNotifier(); @override void initState() { @@ -124,7 +127,7 @@ class BasicTextInputClientState extends State } @override - void updateEditingValue(TextEditingValue value) { /* Not using */} + void updateEditingValue(TextEditingValue value) {/* Not using */} @override void updateEditingValueWithDeltas(List textEditingDeltas) { @@ -143,14 +146,18 @@ class BasicTextInputClientState extends State return; } - final bool selectionChanged = _value.selection.start != value.selection.start || _value.selection.end != value.selection.end; - textEditingDeltaHistoryManager.updateTextEditingDeltaHistoryOnInput(textEditingDeltas); + final bool selectionChanged = + _value.selection.start != value.selection.start || + _value.selection.end != value.selection.end; + textEditingDeltaHistoryManager + .updateTextEditingDeltaHistoryOnInput(textEditingDeltas); _value = value; if (widget.controller is ReplacementTextEditingController) { for (final TextEditingDelta delta in textEditingDeltas) { - (widget.controller as ReplacementTextEditingController).syncReplacementRanges(delta); + (widget.controller as ReplacementTextEditingController) + .syncReplacementRanges(delta); } } @@ -246,7 +253,8 @@ class BasicTextInputClientState extends State if (_hasFocus) { if (!_value.selection.isValid) { // Place cursor at the end if the selection is invalid when we receive focus. - final TextSelection validSelection = TextSelection.collapsed(offset: _value.text.length); + final TextSelection validSelection = + TextSelection.collapsed(offset: _value.text.length); _handleSelectionChanged(validSelection, null); toggleButtonStateManager.updateToggleButtonsOnSelection(validSelection); } @@ -264,17 +272,20 @@ class BasicTextInputClientState extends State ); } - void _userUpdateTextEditingValueWithDelta(TextEditingDelta textEditingDelta, SelectionChangedCause cause) { + void _userUpdateTextEditingValueWithDelta( + TextEditingDelta textEditingDelta, SelectionChangedCause cause) { TextEditingValue value = _value; value = textEditingDelta.apply(value); if (widget.controller is ReplacementTextEditingController) { - (widget.controller as ReplacementTextEditingController).syncReplacementRanges(textEditingDelta); + (widget.controller as ReplacementTextEditingController) + .syncReplacementRanges(textEditingDelta); } if (value != _value) { - textEditingDeltaHistoryManager.updateTextEditingDeltaHistoryOnInput([textEditingDelta]); + textEditingDeltaHistoryManager + .updateTextEditingDeltaHistoryOnInput([textEditingDelta]); } userUpdateTextEditingValue(value, cause); @@ -292,16 +303,18 @@ class BasicTextInputClientState extends State DeleteCharacterIntent: CallbackAction( onInvoke: (intent) => _delete(), ), - ExtendSelectionByCharacterIntent: CallbackAction( - onInvoke: (intent) => _extendSelection(intent.forward, intent.collapseSelection), + ExtendSelectionByCharacterIntent: + CallbackAction( + onInvoke: (intent) => + _extendSelection(intent.forward, intent.collapseSelection), ), - SelectAllTextIntent : CallbackAction( + SelectAllTextIntent: CallbackAction( onInvoke: (intent) => selectAll(intent.cause), ), - CopySelectionTextIntent : CallbackAction( + CopySelectionTextIntent: CallbackAction( onInvoke: (intent) => copySelection(intent.cause), ), - PasteTextIntent : CallbackAction( + PasteTextIntent: CallbackAction( onInvoke: (intent) => pasteText(intent.cause), ), }; @@ -311,7 +324,8 @@ class BasicTextInputClientState extends State late final TextRange deletedRange; late final TextRange newComposing; - final int deletedLength = _value.text.substring(0, _selection.baseOffset).characters.last.length; + final int deletedLength = + _value.text.substring(0, _selection.baseOffset).characters.last.length; if (_selection.isCollapsed) { if (_selection.baseOffset == 0) return; @@ -323,7 +337,8 @@ class BasicTextInputClientState extends State deletedRange = _selection; } - final bool isComposing = _selection.isCollapsed && _value.isComposingRangeValid; + final bool isComposing = + _selection.isCollapsed && _value.isComposingRangeValid; if (isComposing) { newComposing = TextRange.collapsed(deletedRange.start); @@ -347,15 +362,26 @@ class BasicTextInputClientState extends State if (collapseSelection) { if (!_selection.isCollapsed) { - final int firstOffset = _selection.isNormalized ? _selection.start : _selection.end; - final int lastOffset = _selection.isNormalized ? _selection.end : _selection.start; - selection = TextSelection.collapsed(offset: forward ? lastOffset : firstOffset); + final int firstOffset = + _selection.isNormalized ? _selection.start : _selection.end; + final int lastOffset = + _selection.isNormalized ? _selection.end : _selection.start; + selection = + TextSelection.collapsed(offset: forward ? lastOffset : firstOffset); } else { if (forward && _selection.baseOffset == _value.text.length) return; if (!forward && _selection.baseOffset == 0) return; final int adjustment = forward - ? _value.text.substring(_selection.baseOffset).characters.first.length - : -_value.text.substring(0, _selection.baseOffset).characters.last.length; + ? _value.text + .substring(_selection.baseOffset) + .characters + .first + .length + : -_value.text + .substring(0, _selection.baseOffset) + .characters + .last + .length; selection = TextSelection.collapsed( offset: _selection.baseOffset + adjustment, ); @@ -365,7 +391,11 @@ class BasicTextInputClientState extends State if (!forward && _selection.extentOffset == 0) return; final int adjustment = forward ? _value.text.substring(_selection.baseOffset).characters.first.length - : -_value.text.substring(0, _selection.baseOffset).characters.last.length; + : -_value.text + .substring(0, _selection.baseOffset) + .characters + .last + .length; selection = TextSelection( baseOffset: _selection.baseOffset, extentOffset: _selection.extentOffset + adjustment, @@ -382,7 +412,6 @@ class BasicTextInputClientState extends State ); } - /// For updates to text editing value. void _didChangeTextEditingValue() { _updateRemoteTextEditingValueIfNeeded(); @@ -448,12 +477,13 @@ class BasicTextInputClientState extends State case TargetPlatform.linux: case TargetPlatform.windows: _userUpdateTextEditingValueWithDelta( - TextEditingDeltaNonTextUpdate( - oldText: textEditingValue.text, - selection: TextSelection.collapsed(offset: textEditingValue.selection.end), - composing: TextRange.empty, - ), - cause, + TextEditingDeltaNonTextUpdate( + oldText: textEditingValue.text, + selection: TextSelection.collapsed( + offset: textEditingValue.selection.end), + composing: TextRange.empty, + ), + cause, ); break; } @@ -469,14 +499,15 @@ class BasicTextInputClientState extends State if (cutRange.isCollapsed) return; Clipboard.setData(ClipboardData(text: cutRange.textInside(text))); - final int lastSelectionIndex = math.min(cutRange.baseOffset, cutRange.extentOffset); + final int lastSelectionIndex = + math.min(cutRange.baseOffset, cutRange.extentOffset); _userUpdateTextEditingValueWithDelta( TextEditingDeltaReplacement( - oldText: textEditingValue.text, - replacementText: '', - replacedRange: cutRange, - selection: TextSelection.collapsed(offset: lastSelectionIndex), - composing: TextRange.empty, + oldText: textEditingValue.text, + replacementText: '', + replacedRange: cutRange, + selection: TextSelection.collapsed(offset: lastSelectionIndex), + composing: TextRange.empty, ), cause, ); @@ -505,15 +536,16 @@ class BasicTextInputClientState extends State // After the paste, the cursor should be collapsed and located after the // pasted content. - final int lastSelectionIndex = math.max(pasteRange.baseOffset, pasteRange.baseOffset + data.text!.length); + final int lastSelectionIndex = math.max( + pasteRange.baseOffset, pasteRange.baseOffset + data.text!.length); _userUpdateTextEditingValueWithDelta( TextEditingDeltaReplacement( - oldText: textEditingValue.text, - replacementText: data.text!, - replacedRange: pasteRange, - selection: TextSelection.collapsed(offset: lastSelectionIndex), - composing: TextRange.empty, + oldText: textEditingValue.text, + replacementText: data.text!, + replacedRange: pasteRange, + selection: TextSelection.collapsed(offset: lastSelectionIndex), + composing: TextRange.empty, ), cause, ); @@ -523,12 +555,13 @@ class BasicTextInputClientState extends State @override void selectAll(SelectionChangedCause cause) { - final TextSelection newSelection = _value.selection.copyWith(baseOffset: 0, extentOffset: _value.text.length); + final TextSelection newSelection = _value.selection + .copyWith(baseOffset: 0, extentOffset: _value.text.length); _userUpdateTextEditingValueWithDelta( TextEditingDeltaNonTextUpdate( - oldText: textEditingValue.text, - selection: newSelection, - composing: TextRange.empty + oldText: textEditingValue.text, + selection: newSelection, + composing: TextRange.empty, ), cause, ); @@ -538,31 +571,38 @@ class BasicTextInputClientState extends State TextEditingValue get textEditingValue => _value; @override - void userUpdateTextEditingValue(TextEditingValue value, SelectionChangedCause cause) { + void userUpdateTextEditingValue( + TextEditingValue value, SelectionChangedCause cause) { if (value == _value) return; final bool selectionChanged = _value.selection != value.selection; - if (cause == SelectionChangedCause.drag || cause == SelectionChangedCause.longPress || cause == SelectionChangedCause.tap) { + if (cause == SelectionChangedCause.drag || + cause == SelectionChangedCause.longPress || + cause == SelectionChangedCause.tap) { // Here the change is coming from gestures which call on RenderEditable to change the selection. // Create a TextEditingDeltaNonTextUpdate so we can keep track of the delta history. RenderEditable // does not report a delta on selection change. final bool textChanged = _value.text != value.text; if (selectionChanged && !textChanged) { - final TextEditingDeltaNonTextUpdate selectionUpdate = TextEditingDeltaNonTextUpdate( - oldText: value.text, - selection: value.selection, - composing: value.composing, + final TextEditingDeltaNonTextUpdate selectionUpdate = + TextEditingDeltaNonTextUpdate( + oldText: value.text, + selection: value.selection, + composing: value.composing, ); if (widget.controller is ReplacementTextEditingController) { - (widget.controller as ReplacementTextEditingController).syncReplacementRanges(selectionUpdate); + (widget.controller as ReplacementTextEditingController) + .syncReplacementRanges(selectionUpdate); } - textEditingDeltaHistoryManager.updateTextEditingDeltaHistoryOnInput([selectionUpdate]); + textEditingDeltaHistoryManager + .updateTextEditingDeltaHistoryOnInput([selectionUpdate]); } } - final bool selectionRangeChanged = _value.selection.start != value.selection.start - || _value.selection.end != value.selection.end; + final bool selectionRangeChanged = + _value.selection.start != value.selection.start || + _value.selection.end != value.selection.end; _value = value; @@ -570,7 +610,8 @@ class BasicTextInputClientState extends State _handleSelectionChanged(_value.selection, cause); if (selectionRangeChanged) { - toggleButtonStateManager.updateToggleButtonsOnSelection(_value.selection); + toggleButtonStateManager + .updateToggleButtonsOnSelection(_value.selection); } } } @@ -581,9 +622,11 @@ class BasicTextInputClientState extends State final LayerLink _toolbarLayerLink = LayerLink(); TextSelectionOverlay? _selectionOverlay; - RenderEditable get renderEditable => _textKey.currentContext!.findRenderObject()! as RenderEditable; + RenderEditable get renderEditable => + _textKey.currentContext!.findRenderObject()! as RenderEditable; - void _handleSelectionChanged(TextSelection selection, SelectionChangedCause? cause) { + void _handleSelectionChanged( + TextSelection selection, SelectionChangedCause? cause) { // We return early if the selection is not valid. This can happen when the // text of [EditableText] is updated at the same time as the selection is // changed by a gesture event. @@ -647,20 +690,27 @@ class BasicTextInputClientState extends State exception: exception, stack: stack, library: 'widgets', - context: ErrorDescription('while calling onSelectionChanged for $cause'), + context: + ErrorDescription('while calling onSelectionChanged for $cause'), )); } } - static final Map _defaultWebShortcuts = { + static final Map _defaultWebShortcuts = + { // Activation - const SingleActivator(LogicalKeyboardKey.space): DoNothingAndStopPropagationIntent(), + const SingleActivator(LogicalKeyboardKey.space): + DoNothingAndStopPropagationIntent(), // Scrolling - const SingleActivator(LogicalKeyboardKey.arrowUp): DoNothingAndStopPropagationIntent(), - const SingleActivator(LogicalKeyboardKey.arrowDown): DoNothingAndStopPropagationIntent(), - const SingleActivator(LogicalKeyboardKey.arrowLeft): DoNothingAndStopPropagationIntent(), - const SingleActivator(LogicalKeyboardKey.arrowRight): DoNothingAndStopPropagationIntent(), + const SingleActivator(LogicalKeyboardKey.arrowUp): + DoNothingAndStopPropagationIntent(), + const SingleActivator(LogicalKeyboardKey.arrowDown): + DoNothingAndStopPropagationIntent(), + const SingleActivator(LogicalKeyboardKey.arrowLeft): + DoNothingAndStopPropagationIntent(), + const SingleActivator(LogicalKeyboardKey.arrowRight): + DoNothingAndStopPropagationIntent(), }; @override @@ -684,7 +734,8 @@ class BasicTextInputClientState extends State cursorColor: Colors.blue, backgroundCursorColor: Colors.grey[100], showCursor: ValueNotifier(_hasFocus), - forceLine: true, // Whether text field will take full line regardless of width. + forceLine: + true, // Whether text field will take full line regardless of width. readOnly: false, // editable text-field. hasFocus: _hasFocus, maxLines: null, // multi-line text-field. @@ -699,7 +750,8 @@ class BasicTextInputClientState extends State textHeightBehavior: DefaultTextHeightBehavior.of(context), textWidthBasis: TextWidthBasis.parent, obscuringCharacter: '•', - obscureText: false, // This is a non-private text field that does not require obfuscation. + obscureText: + false, // This is a non-private text field that does not require obfuscation. offset: position, onCaretChanged: null, rendererIgnoresPointer: true, @@ -708,7 +760,8 @@ class BasicTextInputClientState extends State cursorRadius: const Radius.circular(2.0), cursorOffset: Offset.zero, paintCursorAboveText: false, - enableInteractiveSelection: true, // make true to enable selection on mobile. + enableInteractiveSelection: + true, // make true to enable selection on mobile. textSelectionDelegate: this, devicePixelRatio: MediaQuery.of(context).devicePixelRatio, promptRectRange: null, @@ -900,4 +953,4 @@ class _Editable extends MultiChildRenderObjectWidget { ..clipBehavior = clipBehavior ..setPromptRectRange(promptRectRange); } -} \ No newline at end of file +} diff --git a/simplistic_editor/lib/main.dart b/simplistic_editor/lib/main.dart index fbd0ea9fe..55b66073a 100644 --- a/simplistic_editor/lib/main.dart +++ b/simplistic_editor/lib/main.dart @@ -38,14 +38,15 @@ class MyHomePage extends StatefulWidget { class _MyHomePageState extends State { final ReplacementTextEditingController _replacementTextEditingController = - ReplacementTextEditingController( + ReplacementTextEditingController( text: 'The quick brown fox jumps over the lazy dog.', ); final FocusNode _focusNode = FocusNode(); final List _isSelected = [false, false, false]; final List _textEditingDeltaHistory = []; - void _updateTextEditingDeltaHistory(List textEditingDeltas) { + void _updateTextEditingDeltaHistory( + List textEditingDeltas) { for (final TextEditingDelta delta in textEditingDeltas) { _textEditingDeltaHistory.add(delta); } @@ -53,7 +54,8 @@ class _MyHomePageState extends State { setState(() {}); } - List _buildTextEditingDeltaHistoryViews(List textEditingDeltas) { + List _buildTextEditingDeltaHistoryViews( + List textEditingDeltas) { List textEditingDeltaViews = []; for (final TextEditingDelta delta in textEditingDeltas) { @@ -61,7 +63,8 @@ class _MyHomePageState extends State { if (delta is TextEditingDeltaInsertion) { deltaView = TextEditingDeltaView( - deltaType: delta.runtimeType.toString().replaceAll('TextEditingDelta', ''), + deltaType: + delta.runtimeType.toString().replaceAll('TextEditingDelta', ''), deltaText: delta.textInserted, deltaRange: TextRange.collapsed(delta.insertionOffset), newSelection: delta.selection, @@ -69,7 +72,8 @@ class _MyHomePageState extends State { ); } else if (delta is TextEditingDeltaDeletion) { deltaView = TextEditingDeltaView( - deltaType: delta.runtimeType.toString().replaceAll('TextEditingDelta', ''), + deltaType: + delta.runtimeType.toString().replaceAll('TextEditingDelta', ''), deltaText: delta.textDeleted, deltaRange: delta.deletedRange, newSelection: delta.selection, @@ -77,7 +81,8 @@ class _MyHomePageState extends State { ); } else if (delta is TextEditingDeltaReplacement) { deltaView = TextEditingDeltaView( - deltaType: delta.runtimeType.toString().replaceAll('TextEditingDelta', ''), + deltaType: + delta.runtimeType.toString().replaceAll('TextEditingDelta', ''), deltaText: delta.replacementText, deltaRange: delta.replacedRange, newSelection: delta.selection, @@ -85,7 +90,8 @@ class _MyHomePageState extends State { ); } else if (delta is TextEditingDeltaNonTextUpdate) { deltaView = TextEditingDeltaView( - deltaType: delta.runtimeType.toString().replaceAll('TextEditingDelta', ''), + deltaType: + delta.runtimeType.toString().replaceAll('TextEditingDelta', ''), deltaText: '', deltaRange: TextRange.empty, newSelection: delta.selection, @@ -111,7 +117,8 @@ class _MyHomePageState extends State { // When the selection changes we want to check the replacements at the new // selection. Enable/disable toggle buttons based on the replacements found // at the new selection. - final List replacementStyles = _replacementTextEditingController.getReplacementsAtSelection(selection); + final List replacementStyles = + _replacementTextEditingController.getReplacementsAtSelection(selection); final List hasChanged = [false, false, false]; if (replacementStyles.isEmpty) { @@ -157,9 +164,9 @@ class _MyHomePageState extends State { void _updateToggleButtonsStateOnButtonPressed(int index) { Map attributeMap = const { - 0 : TextStyle(fontWeight: FontWeight.bold), - 1 : TextStyle(fontStyle: FontStyle.italic), - 2 : TextStyle(decoration: TextDecoration.underline), + 0: TextStyle(fontWeight: FontWeight.bold), + 1: TextStyle(fontStyle: FontStyle.italic), + 2: TextStyle(decoration: TextDecoration.underline), }; final TextRange replacementRange = TextRange( @@ -172,14 +179,15 @@ class _MyHomePageState extends State { _replacementTextEditingController.applyReplacement( TextEditingInlineSpanReplacement( replacementRange, - (string, range) => TextSpan(text: string, style: attributeMap[index]), + (string, range) => TextSpan(text: string, style: attributeMap[index]), true, ), ); setState(() {}); } else { _replacementTextEditingController.disableExpand(attributeMap[index]!); - _replacementTextEditingController.removeReplacementsAtRange(replacementRange, attributeMap[index]); + _replacementTextEditingController.removeReplacementsAtRange( + replacementRange, attributeMap[index]); setState(() {}); } } @@ -188,8 +196,8 @@ class _MyHomePageState extends State { return Text( text, style: const TextStyle( - fontWeight: FontWeight.w600, - decoration: TextDecoration.underline, + fontWeight: FontWeight.w600, + decoration: TextDecoration.underline, ), ); } @@ -200,35 +208,38 @@ class _MyHomePageState extends State { child: Row( children: [ Expanded( - child: Tooltip( - message: 'The type of text input that is occurring.' - ' Check out the documentation for TextEditingDelta for more information.', - child: _buildTextEditingDeltaViewHeading('Delta Type'), - ), + child: Tooltip( + message: 'The type of text input that is occurring.' + ' Check out the documentation for TextEditingDelta for more information.', + child: _buildTextEditingDeltaViewHeading('Delta Type'), + ), ), Expanded( - child: Tooltip( - message: 'The text that is being inserted or deleted', - child: _buildTextEditingDeltaViewHeading('Delta Text'), - ), + child: Tooltip( + message: 'The text that is being inserted or deleted', + child: _buildTextEditingDeltaViewHeading('Delta Text'), + ), ), Expanded( - child: Tooltip( - message: 'The offset in the text where the text input is occurring.', - child: _buildTextEditingDeltaViewHeading('Delta Offset'), - ), + child: Tooltip( + message: + 'The offset in the text where the text input is occurring.', + child: _buildTextEditingDeltaViewHeading('Delta Offset'), + ), ), Expanded( - child: Tooltip( - message: 'The new text selection range after the text input has occurred.', - child: _buildTextEditingDeltaViewHeading('New Selection'), - ), + child: Tooltip( + message: + 'The new text selection range after the text input has occurred.', + child: _buildTextEditingDeltaViewHeading('New Selection'), + ), ), Expanded( - child: Tooltip( - message: 'The new composing range after the text input has occurred.', - child: _buildTextEditingDeltaViewHeading('New Composing'), - ), + child: Tooltip( + message: + 'The new composing range after the text input has occurred.', + child: _buildTextEditingDeltaViewHeading('New Composing'), + ), ), ], ), @@ -247,8 +258,7 @@ class _MyHomePageState extends State { ' more powerful rich text editing applications such as this small example. This feature is supported on all platforms.'; return DialogRoute( context: context, - builder: (context) => - const AlertDialog( + builder: (context) => const AlertDialog( title: Center(child: Text('About')), content: Text(aboutContent), ), @@ -264,7 +274,7 @@ class _MyHomePageState extends State { IconButton( onPressed: () { Navigator.of(context).restorablePush(_aboutDialogBuilder); - }, + }, icon: const Icon(Icons.info_outline), ), ], @@ -274,8 +284,10 @@ class _MyHomePageState extends State { child: Center( child: ToggleButtonsStateManager( isToggleButtonsSelected: _isSelected, - updateToggleButtonsStateOnButtonPressed: _updateToggleButtonsStateOnButtonPressed, - updateToggleButtonStateOnSelectionChanged: _updateToggleButtonsStateOnSelectionChanged, + updateToggleButtonsStateOnButtonPressed: + _updateToggleButtonsStateOnButtonPressed, + updateToggleButtonStateOnSelectionChanged: + _updateToggleButtonsStateOnSelectionChanged, child: Column( children: [ Padding( @@ -285,24 +297,27 @@ class _MyHomePageState extends State { children: [ ToggleButtonsStateManager( isToggleButtonsSelected: _isSelected, - updateToggleButtonsStateOnButtonPressed: _updateToggleButtonsStateOnButtonPressed, - updateToggleButtonStateOnSelectionChanged: _updateToggleButtonsStateOnSelectionChanged, - child: Builder( - builder: (innerContext) { - final ToggleButtonsStateManager manager = ToggleButtonsStateManager.of(innerContext); - - return ToggleButtons( - borderRadius: const BorderRadius.all(Radius.circular(4.0)), - isSelected: manager.toggleButtonsState, - onPressed: (index) => manager.updateToggleButtonsOnButtonPressed(index), - children: const [ - Icon(Icons.format_bold), - Icon(Icons.format_italic), - Icon(Icons.format_underline), - ], - ); - } - ), + updateToggleButtonsStateOnButtonPressed: + _updateToggleButtonsStateOnButtonPressed, + updateToggleButtonStateOnSelectionChanged: + _updateToggleButtonsStateOnSelectionChanged, + child: Builder(builder: (innerContext) { + final ToggleButtonsStateManager manager = + ToggleButtonsStateManager.of(innerContext); + + return ToggleButtons( + borderRadius: + const BorderRadius.all(Radius.circular(4.0)), + isSelected: manager.toggleButtonsState, + onPressed: (index) => manager + .updateToggleButtonsOnButtonPressed(index), + children: const [ + Icon(Icons.format_bold), + Icon(Icons.format_italic), + Icon(Icons.format_underline), + ], + ); + }), ), ], ), @@ -312,14 +327,17 @@ class _MyHomePageState extends State { padding: const EdgeInsets.symmetric(horizontal: 35.0), child: ToggleButtonsStateManager( isToggleButtonsSelected: _isSelected, - updateToggleButtonsStateOnButtonPressed: _updateToggleButtonsStateOnButtonPressed, - updateToggleButtonStateOnSelectionChanged: _updateToggleButtonsStateOnSelectionChanged, + updateToggleButtonsStateOnButtonPressed: + _updateToggleButtonsStateOnButtonPressed, + updateToggleButtonStateOnSelectionChanged: + _updateToggleButtonsStateOnSelectionChanged, child: TextEditingDeltaHistoryManager( history: _textEditingDeltaHistory, updateHistoryOnInput: _updateTextEditingDeltaHistory, child: BasicTextField( controller: _replacementTextEditingController, - style: const TextStyle(fontSize: 18.0, color: Colors.black), + style: const TextStyle( + fontSize: 18.0, color: Colors.black), focusNode: _focusNode, ), ), @@ -336,18 +354,23 @@ class _MyHomePageState extends State { updateHistoryOnInput: _updateTextEditingDeltaHistory, child: Builder( builder: (innerContext) { - final TextEditingDeltaHistoryManager manager = TextEditingDeltaHistoryManager.of(innerContext); + final TextEditingDeltaHistoryManager manager = + TextEditingDeltaHistoryManager.of( + innerContext); return ListView.separated( - padding: const EdgeInsets.symmetric(horizontal: 35.0), + padding: const EdgeInsets.symmetric( + horizontal: 35.0), itemBuilder: (context, index) { - return _buildTextEditingDeltaHistoryViews(manager.textEditingDeltaHistory)[index]; + return _buildTextEditingDeltaHistoryViews( + manager.textEditingDeltaHistory)[index]; }, - itemCount: manager.textEditingDeltaHistory.length, + itemCount: + manager.textEditingDeltaHistory.length, separatorBuilder: (context, index) { return const SizedBox(height: 2.0); }, ); - } + }, ), ), ), @@ -371,7 +394,7 @@ class TextEditingDeltaView extends StatelessWidget { required this.deltaText, required this.deltaRange, required this.newSelection, - required this.newComposing + required this.newComposing, }) : super(key: key); final String deltaType; diff --git a/simplistic_editor/lib/replacements.dart b/simplistic_editor/lib/replacements.dart index e0ccd135b..15e148914 100644 --- a/simplistic_editor/lib/replacements.dart +++ b/simplistic_editor/lib/replacements.dart @@ -58,39 +58,44 @@ class TextEditingInlineSpanReplacement { final TextRange deletedRange = delta.deletedRange; final int deletedLength = delta.textDeleted.length; - if (range.start >= deletedRange.start - && (range.start < deletedRange.end && range.end > deletedRange.end)) { + if (range.start >= deletedRange.start && + (range.start < deletedRange.end && range.end > deletedRange.end)) { return copy( range: TextRange( start: deletedRange.end - deletedLength, end: range.end - deletedLength, ), ); - } else if ((range.start < deletedRange.start && range.end > deletedRange.start) - && range.end <= deletedRange.end) { + } else if ((range.start < deletedRange.start && + range.end > deletedRange.start) && + range.end <= deletedRange.end) { return copy( range: TextRange( start: range.start, end: deletedRange.start, ), ); - } else if (range.start < deletedRange.start && range.end > deletedRange.end) { + } else if (range.start < deletedRange.start && + range.end > deletedRange.end) { return copy( range: TextRange( start: range.start, end: range.end - deletedLength, ), ); - } else if (range.start >= deletedRange.start && range.end <= deletedRange.end) { + } else if (range.start >= deletedRange.start && + range.end <= deletedRange.end) { return null; - } else if (range.start > deletedRange.start && range.start >= deletedRange.end) { + } else if (range.start > deletedRange.start && + range.start >= deletedRange.end) { return copy( range: TextRange( start: range.start - deletedLength, end: range.end - deletedLength, ), ); - } else if (range.end <= deletedRange.start && range.end < deletedRange.end) { + } else if (range.end <= deletedRange.start && + range.end < deletedRange.end) { return copy( range: TextRange( start: range.start, @@ -102,7 +107,8 @@ class TextEditingInlineSpanReplacement { return null; } - TextEditingInlineSpanReplacement? onInsertion(TextEditingDeltaInsertion delta) { + TextEditingInlineSpanReplacement? onInsertion( + TextEditingDeltaInsertion delta) { final int insertionOffset = delta.insertionOffset; final int insertedLength = delta.textInserted.length; @@ -122,7 +128,8 @@ class TextEditingInlineSpanReplacement { ), ); } - } if (range.start < insertionOffset && range.end < insertionOffset) { + } + if (range.start < insertionOffset && range.end < insertionOffset) { return copy( range: TextRange( start: range.start, @@ -148,20 +155,21 @@ class TextEditingInlineSpanReplacement { return null; } - List? onReplacement(TextEditingDeltaReplacement delta) { + List? onReplacement( + TextEditingDeltaReplacement delta) { final TextRange replacedRange = delta.replacedRange; - final bool replacementShortenedText = delta.replacementText.length < - delta.textReplaced.length; - final bool replacementLengthenedText = delta.replacementText.length > - delta.textReplaced.length; - final bool replacementEqualLength = delta.replacementText.length == - delta.textReplaced.length; - final int changedOffset = replacementShortenedText ? delta.textReplaced - .length - delta.replacementText.length + final bool replacementShortenedText = + delta.replacementText.length < delta.textReplaced.length; + final bool replacementLengthenedText = + delta.replacementText.length > delta.textReplaced.length; + final bool replacementEqualLength = + delta.replacementText.length == delta.textReplaced.length; + final int changedOffset = replacementShortenedText + ? delta.textReplaced.length - delta.replacementText.length : delta.replacementText.length - delta.textReplaced.length; - if (range.start >= replacedRange.start - && (range.start < replacedRange.end && range.end > replacedRange.end)) { + if (range.start >= replacedRange.start && + (range.start < replacedRange.end && range.end > replacedRange.end)) { if (replacementShortenedText) { return [ copy( @@ -190,8 +198,9 @@ class TextEditingInlineSpanReplacement { ), ]; } - } else if ((range.start < replacedRange.start && range.end > replacedRange.start) - && range.end <= replacedRange.end) { + } else if ((range.start < replacedRange.start && + range.end > replacedRange.start) && + range.end <= replacedRange.end) { return [ copy( range: TextRange( @@ -200,7 +209,8 @@ class TextEditingInlineSpanReplacement { ), ), ]; - } else if (range.start < replacedRange.start && range.end > replacedRange.end) { + } else if (range.start < replacedRange.start && + range.end > replacedRange.end) { if (replacementShortenedText) { return [ copy( @@ -247,10 +257,12 @@ class TextEditingInlineSpanReplacement { ), ]; } - } else if (range.start >= replacedRange.start && range.end <= replacedRange.end) { + } else if (range.start >= replacedRange.start && + range.end <= replacedRange.end) { // remove attribute. return null; - } else if (range.start > replacedRange.start && range.start >= replacedRange.end) { + } else if (range.start > replacedRange.start && + range.start >= replacedRange.end) { if (replacementShortenedText) { return [ copy( @@ -272,7 +284,8 @@ class TextEditingInlineSpanReplacement { } else if (replacementEqualLength) { return [this]; } - } else if (range.end <= replacedRange.start && range.end < replacedRange.end) { + } else if (range.end <= replacedRange.start && + range.end < replacedRange.end) { return [ copy( range: TextRange( @@ -286,9 +299,11 @@ class TextEditingInlineSpanReplacement { return null; } - TextEditingInlineSpanReplacement? onNonTextUpdate(TextEditingDeltaNonTextUpdate delta) { + TextEditingInlineSpanReplacement? onNonTextUpdate( + TextEditingDeltaNonTextUpdate delta) { if (range.isCollapsed) { - if (range.start != delta.selection.start && range.end != delta.selection.end) { + if (range.start != delta.selection.start && + range.end != delta.selection.end) { return null; } } @@ -296,8 +311,8 @@ class TextEditingInlineSpanReplacement { } List? removeRange(TextRange removalRange) { - if (range.start >= removalRange.start - && (range.start < removalRange.end && range.end > removalRange.end)) { + if (range.start >= removalRange.start && + (range.start < removalRange.end && range.end > removalRange.end)) { return [ copy( range: TextRange( @@ -306,8 +321,9 @@ class TextEditingInlineSpanReplacement { ), ), ]; - } else if ((range.start < removalRange.start && range.end > removalRange.start) - && range.end <= removalRange.end) { + } else if ((range.start < removalRange.start && + range.end > removalRange.start) && + range.end <= removalRange.end) { return [ copy( range: TextRange( @@ -316,7 +332,8 @@ class TextEditingInlineSpanReplacement { ), ), ]; - } else if (range.start < removalRange.start && range.end > removalRange.end) { + } else if (range.start < removalRange.start && + range.end > removalRange.end) { return [ copy( range: TextRange( @@ -332,11 +349,14 @@ class TextEditingInlineSpanReplacement { ), ), ]; - } else if (range.start >= removalRange.start && range.end <= removalRange.end) { + } else if (range.start >= removalRange.start && + range.end <= removalRange.end) { return null; - } else if (range.start > removalRange.start && range.start >= removalRange.end) { + } else if (range.start > removalRange.start && + range.start >= removalRange.end) { return [this]; - } else if (range.end <= removalRange.start && range.end < removalRange.end) { + } else if (range.end <= removalRange.start && + range.end < removalRange.end) { return [this]; } else if (removalRange.isCollapsed && range.end == removalRange.start) { return [this]; @@ -348,7 +368,8 @@ class TextEditingInlineSpanReplacement { /// Creates a new replacement with all properties copied except for range, which /// is updated to the specified value. TextEditingInlineSpanReplacement copy({TextRange? range, bool? expand}) { - return TextEditingInlineSpanReplacement(range ?? this.range, generator, expand ?? this.expand); + return TextEditingInlineSpanReplacement( + range ?? this.range, generator, expand ?? this.expand); } @override @@ -371,7 +392,7 @@ class ReplacementTextEditingController extends TextEditingController { String? text, List? replacements, this.composingRegionReplaceable = true, - }) : replacements = replacements ?? [], + }) : replacements = replacements ?? [], super(text: text); /// Creates a controller for an editable text field from an initial [TextEditingValue]. @@ -379,7 +400,7 @@ class ReplacementTextEditingController extends TextEditingController { /// This constructor treats a null [value] argument as if it were [TextEditingValue.empty]. ReplacementTextEditingController.fromValue(TextEditingValue? value, {List? replacements, - this.composingRegionReplaceable = true}) + this.composingRegionReplaceable = true}) : super.fromValue(value); /// The [TextEditingInlineSpanReplacement]s that are evaluated on the editing value. @@ -494,7 +515,8 @@ class ReplacementTextEditingController extends TextEditingController { } } - for (final TextEditingInlineSpanReplacement replacementToRemove in toRemove) { + for (final TextEditingInlineSpanReplacement replacementToRemove + in toRemove) { replacements!.remove(replacementToRemove); } @@ -507,17 +529,19 @@ class ReplacementTextEditingController extends TextEditingController { TextStyle? style, required bool withComposing, }) { - assert(!value.composing.isValid - || !withComposing - || value.isComposingRangeValid); + assert(!value.composing.isValid || + !withComposing || + value.isComposingRangeValid); // Keep a mapping of TextRanges to the InlineSpan to replace it with. - final Map rangeSpanMapping = {}; + final Map rangeSpanMapping = + {}; // Iterate through TextEditingInlineSpanReplacements, handling overlapping // replacements and mapping them towards a generated InlineSpan. if (replacements != null) { - for (final TextEditingInlineSpanReplacement replacement in replacements!) { + for (final TextEditingInlineSpanReplacement replacement + in replacements!) { _addToMappingWithOverlaps( replacement.generator, TextRange(start: replacement.range.start, end: replacement.range.end), @@ -532,9 +556,9 @@ class ReplacementTextEditingController extends TextEditingController { // be thrown and this EditableText will be built with a broken subtree. // // Add composing region as a replacement to a TextSpan with underline. - if (composingRegionReplaceable - && value.isComposingRangeValid - && withComposing) { + if (composingRegionReplaceable && + value.isComposingRangeValid && + withComposing) { _addToMappingWithOverlaps((value, range) { final TextStyle composingStyle = style != null ? style.merge(const TextStyle(decoration: TextDecoration.underline)) @@ -556,7 +580,8 @@ class ReplacementTextEditingController extends TextEditingController { int previousEndIndex = 0; for (final TextRange range in sortedRanges) { if (range.start > previousEndIndex) { - spans.add(TextSpan(text: value.text.substring(previousEndIndex, range.start))); + spans.add(TextSpan( + text: value.text.substring(previousEndIndex, range.start))); } spans.add(rangeSpanMapping[range]!); previousEndIndex = range.end; @@ -583,8 +608,8 @@ class ReplacementTextEditingController extends TextEditingController { bool overlap = false; List overlapRanges = []; for (final TextRange range in rangeSpanMapping.keys) { - if (math.max(matchedRange.start, range.start) - <= math.min(matchedRange.end, range.end)) { + if (math.max(matchedRange.start, range.start) <= + math.min(matchedRange.end, range.end)) { overlap = true; overlapRanges.add(range); } @@ -593,10 +618,18 @@ class ReplacementTextEditingController extends TextEditingController { final List> overlappingTriples = >[]; if (overlap) { - overlappingTriples.add([matchedRange.start, matchedRange.end, generator(matchedRange.textInside(text), matchedRange).style]); + overlappingTriples.add([ + matchedRange.start, + matchedRange.end, + generator(matchedRange.textInside(text), matchedRange).style + ]); for (final TextRange overlappingRange in overlapRanges) { - overlappingTriples.add([overlappingRange.start, overlappingRange.end, rangeSpanMapping[overlappingRange]!.style]); + overlappingTriples.add([ + overlappingRange.start, + overlappingRange.end, + rangeSpanMapping[overlappingRange]!.style + ]); rangeSpanMapping.remove(overlappingRange); } @@ -608,10 +641,11 @@ class ReplacementTextEditingController extends TextEditingController { if (toRemoveRangesThatHaveBeenMerged.contains(tripleA)) continue; for (int j = i + 1; j < overlappingTriples.length; j++) { final List tripleB = overlappingTriples[j]; - if (math.max(tripleA[0] as int, tripleB[0] as int) - <= math.min(tripleA[1] as int, tripleB[1] as int) - && tripleA[2] == tripleB[2]) { - toRemoveRangesThatHaveBeenMerged.addAll([tripleA, tripleB]); + if (math.max(tripleA[0] as int, tripleB[0] as int) <= + math.min(tripleA[1] as int, tripleB[1] as int) && + tripleA[2] == tripleB[2]) { + toRemoveRangesThatHaveBeenMerged + .addAll([tripleA, tripleB]); tripleA = [ math.min(tripleA[0] as int, tripleB[0] as int), math.max(tripleA[1] as int, tripleB[1] as int), @@ -621,9 +655,9 @@ class ReplacementTextEditingController extends TextEditingController { } } - if (didOverlap - && !toAddRangesThatHaveBeenMerged.contains(tripleA) - && !toRemoveRangesThatHaveBeenMerged.contains(tripleA)) { + if (didOverlap && + !toAddRangesThatHaveBeenMerged.contains(tripleA) && + !toRemoveRangesThatHaveBeenMerged.contains(tripleA)) { toAddRangesThatHaveBeenMerged.add(tripleA); } } @@ -658,15 +692,14 @@ class ReplacementTextEditingController extends TextEditingController { } Set styles = {}; - List otherEndPoints = endPoints.getRange(1, endPoints.length).toList(); + List otherEndPoints = + endPoints.getRange(1, endPoints.length).toList(); for (int i = 0; i < endPoints.length - 1; i++) { styles = styles.difference(end[endPoints[i]]!); styles.addAll(start[endPoints[i]]!); TextStyle? mergedStyles; - final TextRange uniqueRange = TextRange( - start: endPoints[i], - end: otherEndPoints[i] - ); + final TextRange uniqueRange = + TextRange(start: endPoints[i], end: otherEndPoints[i]); for (final TextStyle style in styles) { if (mergedStyles == null) { mergedStyles = style; @@ -674,10 +707,8 @@ class ReplacementTextEditingController extends TextEditingController { mergedStyles = mergedStyles.merge(style); } } - rangeSpanMapping[uniqueRange] = TextSpan( - text: uniqueRange.textInside(text), - style: mergedStyles - ); + rangeSpanMapping[uniqueRange] = + TextSpan(text: uniqueRange.textInside(text), style: mergedStyles); } } @@ -704,8 +735,9 @@ class ReplacementTextEditingController extends TextEditingController { for (final TextEditingInlineSpanReplacement replacement in replacements!) { if (replacement.range.end == selection.start) { - TextStyle? replacementStyle = - (replacement.generator('', const TextRange.collapsed(0)) as TextSpan).style; + TextStyle? replacementStyle = (replacement.generator( + '', const TextRange.collapsed(0)) as TextSpan) + .style; if (replacementStyle! == style) { toRemove.add(replacement); toAdd.add(replacement.copy(expand: false)); @@ -713,11 +745,13 @@ class ReplacementTextEditingController extends TextEditingController { } } - for (final TextEditingInlineSpanReplacement replacementToRemove in toRemove) { + for (final TextEditingInlineSpanReplacement replacementToRemove + in toRemove) { replacements!.remove(replacementToRemove); } - for (final TextEditingInlineSpanReplacement replacementWithExpandDisabled in toAdd) { + for (final TextEditingInlineSpanReplacement replacementWithExpandDisabled + in toAdd) { replacements!.add(replacementWithExpandDisabled); } } @@ -733,30 +767,27 @@ class ReplacementTextEditingController extends TextEditingController { for (final TextEditingInlineSpanReplacement replacement in replacements!) { if (selection.isCollapsed) { - if (math.max(replacement.range.start, selection.start) - <= math.min(replacement.range.end, selection.end)) { + if (math.max(replacement.range.start, selection.start) <= + math.min(replacement.range.end, selection.end)) { if (selection.end != replacement.range.start) { if (selection.start == replacement.range.end) { if (replacement.expand) { - stylesAtSelection.add(replacement - .generator('', replacement.range) - .style!); + stylesAtSelection + .add(replacement.generator('', replacement.range).style!); } } else { - stylesAtSelection.add(replacement - .generator('', replacement.range) - .style!); + stylesAtSelection + .add(replacement.generator('', replacement.range).style!); } } } } else { - if (math.max(replacement.range.start, selection.start) - <= math.min(replacement.range.end, selection.end)) { + if (math.max(replacement.range.start, selection.start) <= + math.min(replacement.range.end, selection.end)) { if (replacement.range.start <= selection.start && replacement.range.end >= selection.end) { - stylesAtSelection.add(replacement - .generator('', replacement.range) - .style!); + stylesAtSelection + .add(replacement.generator('', replacement.range).style!); } } } @@ -769,17 +800,19 @@ class ReplacementTextEditingController extends TextEditingController { final List toRemove = []; final List toAdd = []; - for(int i = 0; i < replacements!.length; i++) { + for (int i = 0; i < replacements!.length; i++) { TextEditingInlineSpanReplacement replacement = replacements![i]; - InlineSpan replacementSpan = replacement.generator('', const TextRange.collapsed(0)); + InlineSpan replacementSpan = + replacement.generator('', const TextRange.collapsed(0)); TextStyle? replacementStyle = replacementSpan.style; late final TextEditingInlineSpanReplacement? mutatedReplacement; - if ((math.max(replacement.range.start, removalRange.start) - <= math.min(replacement.range.end, removalRange.end)) - && replacementStyle != null) { + if ((math.max(replacement.range.start, removalRange.start) <= + math.min(replacement.range.end, removalRange.end)) && + replacementStyle != null) { if (replacementStyle == attribute!) { - List? newReplacements = replacement.removeRange(removalRange); + List? newReplacements = + replacement.removeRange(removalRange); if (newReplacements != null) { if (newReplacements.length == 1) { @@ -809,4 +842,4 @@ class ReplacementTextEditingController extends TextEditingController { replacements!.remove(replacementToRemove); } } -} \ No newline at end of file +} diff --git a/simplistic_editor/lib/text_editing_delta_history_manager.dart b/simplistic_editor/lib/text_editing_delta_history_manager.dart index ba7712b18..4f2a1d5d1 100644 --- a/simplistic_editor/lib/text_editing_delta_history_manager.dart +++ b/simplistic_editor/lib/text_editing_delta_history_manager.dart @@ -3,7 +3,8 @@ import 'package:flutter/widgets.dart'; /// Signature for the callback that updates text editing delta history when a new delta /// is received. -typedef TextEditingDeltaHistoryUpdateCallback = void Function(List textEditingDeltas); +typedef TextEditingDeltaHistoryUpdateCallback = void Function( + List textEditingDeltas); class TextEditingDeltaHistoryManager extends InheritedWidget { const TextEditingDeltaHistoryManager({ @@ -11,25 +12,29 @@ class TextEditingDeltaHistoryManager extends InheritedWidget { required Widget child, required List history, required TextEditingDeltaHistoryUpdateCallback updateHistoryOnInput, - }) - : _textEditingDeltaHistory = history, + }) : _textEditingDeltaHistory = history, _updateTextEditingDeltaHistoryOnInput = updateHistoryOnInput, super(key: key, child: child); static TextEditingDeltaHistoryManager of(BuildContext context) { - final TextEditingDeltaHistoryManager? result = context.dependOnInheritedWidgetOfExactType(); + final TextEditingDeltaHistoryManager? result = context + .dependOnInheritedWidgetOfExactType(); assert(result != null, 'No ToggleButtonsStateManager found in context'); return result!; } final List _textEditingDeltaHistory; - final TextEditingDeltaHistoryUpdateCallback _updateTextEditingDeltaHistoryOnInput; + final TextEditingDeltaHistoryUpdateCallback + _updateTextEditingDeltaHistoryOnInput; - List get textEditingDeltaHistory => _textEditingDeltaHistory; - TextEditingDeltaHistoryUpdateCallback get updateTextEditingDeltaHistoryOnInput => _updateTextEditingDeltaHistoryOnInput; + List get textEditingDeltaHistory => + _textEditingDeltaHistory; + TextEditingDeltaHistoryUpdateCallback + get updateTextEditingDeltaHistoryOnInput => + _updateTextEditingDeltaHistoryOnInput; @override bool updateShouldNotify(TextEditingDeltaHistoryManager oldWidget) { return textEditingDeltaHistory != oldWidget.textEditingDeltaHistory; } -} \ No newline at end of file +} diff --git a/simplistic_editor/lib/toggle_button_state_manager.dart b/simplistic_editor/lib/toggle_button_state_manager.dart index c1ffd1562..a45273154 100644 --- a/simplistic_editor/lib/toggle_button_state_manager.dart +++ b/simplistic_editor/lib/toggle_button_state_manager.dart @@ -2,40 +2,52 @@ import 'package:flutter/widgets.dart'; /// Signature for the callback that updates toggle button state when the user changes the selection /// (including the cursor location). -typedef UpdateToggleButtonsStateOnSelectionChangedCallback = void Function(TextSelection selection); +typedef UpdateToggleButtonsStateOnSelectionChangedCallback = void Function( + TextSelection selection); /// Signature for the callback that updates toggle button state when the user /// presses the toggle button. -typedef UpdateToggleButtonsStateOnButtonPressedCallback = void Function(int index); +typedef UpdateToggleButtonsStateOnButtonPressedCallback = void Function( + int index); class ToggleButtonsStateManager extends InheritedWidget { const ToggleButtonsStateManager({ Key? key, required Widget child, required List isToggleButtonsSelected, - required UpdateToggleButtonsStateOnButtonPressedCallback updateToggleButtonsStateOnButtonPressed, - required UpdateToggleButtonsStateOnSelectionChangedCallback updateToggleButtonStateOnSelectionChanged, - }) - : _isToggleButtonsSelected = isToggleButtonsSelected, - _updateToggleButtonsStateOnButtonPressed = updateToggleButtonsStateOnButtonPressed, - _updateToggleButtonStateOnSelectionChanged = updateToggleButtonStateOnSelectionChanged, + required UpdateToggleButtonsStateOnButtonPressedCallback + updateToggleButtonsStateOnButtonPressed, + required UpdateToggleButtonsStateOnSelectionChangedCallback + updateToggleButtonStateOnSelectionChanged, + }) : _isToggleButtonsSelected = isToggleButtonsSelected, + _updateToggleButtonsStateOnButtonPressed = + updateToggleButtonsStateOnButtonPressed, + _updateToggleButtonStateOnSelectionChanged = + updateToggleButtonStateOnSelectionChanged, super(key: key, child: child); static ToggleButtonsStateManager of(BuildContext context) { - final ToggleButtonsStateManager? result = context.dependOnInheritedWidgetOfExactType(); + final ToggleButtonsStateManager? result = + context.dependOnInheritedWidgetOfExactType(); assert(result != null, 'No ToggleButtonsStateManager found in context'); return result!; } final List _isToggleButtonsSelected; - final UpdateToggleButtonsStateOnButtonPressedCallback _updateToggleButtonsStateOnButtonPressed; - final UpdateToggleButtonsStateOnSelectionChangedCallback _updateToggleButtonStateOnSelectionChanged; + final UpdateToggleButtonsStateOnButtonPressedCallback + _updateToggleButtonsStateOnButtonPressed; + final UpdateToggleButtonsStateOnSelectionChangedCallback + _updateToggleButtonStateOnSelectionChanged; List get toggleButtonsState => _isToggleButtonsSelected; - UpdateToggleButtonsStateOnButtonPressedCallback get updateToggleButtonsOnButtonPressed => _updateToggleButtonsStateOnButtonPressed; - UpdateToggleButtonsStateOnSelectionChangedCallback get updateToggleButtonsOnSelection => _updateToggleButtonStateOnSelectionChanged; + UpdateToggleButtonsStateOnButtonPressedCallback + get updateToggleButtonsOnButtonPressed => + _updateToggleButtonsStateOnButtonPressed; + UpdateToggleButtonsStateOnSelectionChangedCallback + get updateToggleButtonsOnSelection => + _updateToggleButtonStateOnSelectionChanged; @override bool updateShouldNotify(ToggleButtonsStateManager oldWidget) => toggleButtonsState != oldWidget.toggleButtonsState; -} \ No newline at end of file +} diff --git a/simplistic_editor/test/main_screen_test.dart b/simplistic_editor/test/main_screen_test.dart index ee7ae761c..39e584895 100644 --- a/simplistic_editor/test/main_screen_test.dart +++ b/simplistic_editor/test/main_screen_test.dart @@ -12,46 +12,51 @@ import 'package:simplistic_editor/basic_text_input_client.dart'; import 'package:simplistic_editor/main.dart'; void main() { - testWidgets('Default main page shows all components', - (tester) async { - await tester.pumpWidget(const MyApp()); - - // Elements on Style ToggleButton Toolbar. - expect(find.widgetWithIcon(ToggleButtons, Icons.format_bold), - findsOneWidget); - expect(find.widgetWithIcon(ToggleButtons, Icons.format_italic), findsOneWidget); - expect( - find.widgetWithIcon(ToggleButtons, Icons.format_underline), findsOneWidget); - - // Elements on the main screen - // Delta labels. - expect( - find.widgetWithText(Tooltip, "Delta Type"), findsOneWidget); - expect(find.widgetWithText(Tooltip, "Delta Text"), findsOneWidget); - expect( - find.widgetWithText(Tooltip, "Delta Offset"), - findsOneWidget); - expect( - find.widgetWithText(Tooltip, "New Selection"), findsOneWidget); - expect(find.widgetWithText(Tooltip, "New Composing"), findsOneWidget); - - // Selection delta is generated and delta history is visible. - await tester.tap(find.byType(BasicTextInputClient)); - await tester.pumpAndSettle(); - expect( - find.widgetWithText(TextEditingDeltaView, "NonTextUpdate"), findsOneWidget); - - // Find tooltips. - expect(find.byTooltip('The text that is being inserted or deleted'), findsOneWidget); - expect(find.byTooltip('The type of text input that is occurring. Check out the documentation for TextEditingDelta for more information.'), findsOneWidget); - expect(find.byTooltip('The offset in the text where the text input is occurring.'), findsOneWidget); - expect(find.byTooltip('The new text selection range after the text input has occurred.'), findsOneWidget); - - // About Dialog - expect( - find.widgetWithIcon(IconButton, Icons.info_outline), findsOneWidget); - await tester.tap(find.widgetWithIcon(IconButton, Icons.info_outline)); - await tester.pumpAndSettle(); - expect(find.widgetWithText(Center, 'About'), findsOneWidget); - }); + testWidgets('Default main page shows all components', (tester) async { + await tester.pumpWidget(const MyApp()); + + // Elements on Style ToggleButton Toolbar. + expect( + find.widgetWithIcon(ToggleButtons, Icons.format_bold), findsOneWidget); + expect(find.widgetWithIcon(ToggleButtons, Icons.format_italic), + findsOneWidget); + expect(find.widgetWithIcon(ToggleButtons, Icons.format_underline), + findsOneWidget); + + // Elements on the main screen + // Delta labels. + expect(find.widgetWithText(Tooltip, "Delta Type"), findsOneWidget); + expect(find.widgetWithText(Tooltip, "Delta Text"), findsOneWidget); + expect(find.widgetWithText(Tooltip, "Delta Offset"), findsOneWidget); + expect(find.widgetWithText(Tooltip, "New Selection"), findsOneWidget); + expect(find.widgetWithText(Tooltip, "New Composing"), findsOneWidget); + + // Selection delta is generated and delta history is visible. + await tester.tap(find.byType(BasicTextInputClient)); + await tester.pumpAndSettle(); + expect(find.widgetWithText(TextEditingDeltaView, "NonTextUpdate"), + findsOneWidget); + + // Find tooltips. + expect(find.byTooltip('The text that is being inserted or deleted'), + findsOneWidget); + expect( + find.byTooltip( + 'The type of text input that is occurring. Check out the documentation for TextEditingDelta for more information.'), + findsOneWidget); + expect( + find.byTooltip( + 'The offset in the text where the text input is occurring.'), + findsOneWidget); + expect( + find.byTooltip( + 'The new text selection range after the text input has occurred.'), + findsOneWidget); + + // About Dialog + expect(find.widgetWithIcon(IconButton, Icons.info_outline), findsOneWidget); + await tester.tap(find.widgetWithIcon(IconButton, Icons.info_outline)); + await tester.pumpAndSettle(); + expect(find.widgetWithText(Center, 'About'), findsOneWidget); + }); } diff --git a/testing_app/integration_test/perf_test.dart b/testing_app/integration_test/perf_test.dart index 73d12b8e9..68dd64044 100644 --- a/testing_app/integration_test/perf_test.dart +++ b/testing_app/integration_test/perf_test.dart @@ -9,8 +9,7 @@ import 'package:testing_app/main.dart'; void main() { group('Testing App Performance Tests', () { - final binding = IntegrationTestWidgetsFlutterBinding.ensureInitialized() - as IntegrationTestWidgetsFlutterBinding; + final binding = IntegrationTestWidgetsFlutterBinding.ensureInitialized(); // The fullyLive frame policy simulates // the way Flutter responds to animations. diff --git a/testing_app/linux/flutter/generated_plugins.cmake b/testing_app/linux/flutter/generated_plugins.cmake index 51436ae8c..2e1de87a7 100644 --- a/testing_app/linux/flutter/generated_plugins.cmake +++ b/testing_app/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/testing_app/pubspec.lock b/testing_app/pubspec.lock index 9f7f85f3c..e2ffae02e 100644 --- a/testing_app/pubspec.lock +++ b/testing_app/pubspec.lock @@ -7,21 +7,21 @@ packages: name: _fe_analyzer_shared url: "https://pub.dartlang.org" source: hosted - version: "31.0.0" + version: "39.0.0" analyzer: dependency: transitive description: name: analyzer url: "https://pub.dartlang.org" source: hosted - version: "2.8.0" + version: "4.0.0" archive: dependency: transitive description: name: archive url: "https://pub.dartlang.org" source: hosted - version: "3.1.6" + version: "3.1.11" args: dependency: transitive description: @@ -57,13 +57,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.3.1" - cli_util: - dependency: transitive - description: - name: cli_util - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.5" clock: dependency: transitive description: @@ -77,7 +70,7 @@ packages: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.15.0" + version: "1.16.0" convert: dependency: transitive description: @@ -91,7 +84,7 @@ packages: name: coverage url: "https://pub.dartlang.org" source: hosted - version: "1.0.3" + version: "1.2.0" crypto: dependency: transitive description: @@ -112,7 +105,7 @@ packages: name: fake_async url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.3.0" file: dependency: transitive description: @@ -136,7 +129,7 @@ packages: name: flutter_lints url: "https://pub.dartlang.org" source: hosted - version: "1.0.4" + version: "2.0.1" flutter_test: dependency: "direct dev" description: flutter @@ -200,7 +193,7 @@ packages: name: lints url: "https://pub.dartlang.org" source: hosted - version: "1.0.1" + version: "2.0.0" logging: dependency: transitive description: @@ -221,7 +214,7 @@ packages: name: material_color_utilities url: "https://pub.dartlang.org" source: hosted - version: "0.1.3" + version: "0.1.4" meta: dependency: transitive description: @@ -235,7 +228,7 @@ packages: name: mime url: "https://pub.dartlang.org" source: hosted - version: "1.0.1" + version: "1.0.2" nested: dependency: transitive description: @@ -263,7 +256,7 @@ packages: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.8.0" + version: "1.8.1" platform: dependency: transitive description: @@ -352,7 +345,7 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.8.1" + version: "1.8.2" stack_trace: dependency: transitive description: @@ -394,21 +387,21 @@ packages: name: test url: "https://pub.dartlang.org" source: hosted - version: "1.19.5" + version: "1.21.1" test_api: dependency: transitive description: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.8" + version: "0.4.9" test_core: dependency: transitive description: name: test_core url: "https://pub.dartlang.org" source: hosted - version: "0.4.9" + version: "0.4.13" typed_data: dependency: transitive description: @@ -422,14 +415,14 @@ packages: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.1.1" + version: "2.1.2" vm_service: dependency: transitive description: name: vm_service url: "https://pub.dartlang.org" source: hosted - version: "7.5.0" + version: "8.2.2" watcher: dependency: transitive description: @@ -443,7 +436,7 @@ packages: name: web_socket_channel url: "https://pub.dartlang.org" source: hosted - version: "2.1.0" + version: "2.2.0" webdriver: dependency: transitive description: @@ -457,7 +450,7 @@ packages: name: webkit_inspection_protocol url: "https://pub.dartlang.org" source: hosted - version: "1.0.0" + version: "1.0.1" yaml: dependency: transitive description: @@ -466,5 +459,5 @@ packages: source: hosted version: "3.1.0" sdks: - dart: ">=2.16.0 <3.0.0" + dart: ">=2.17.0-206.0.dev <3.0.0" flutter: ">=1.16.0" diff --git a/testing_app/pubspec.yaml b/testing_app/pubspec.yaml index c53c17913..e9ad16357 100644 --- a/testing_app/pubspec.yaml +++ b/testing_app/pubspec.yaml @@ -4,7 +4,7 @@ description: A sample that shows testing in Flutter. version: 1.0.0+1 environment: - sdk: ">=2.12.0 <3.0.0" + sdk: ">=2.17.0-0 <3.0.0" dependencies: flutter: @@ -19,7 +19,7 @@ dev_dependencies: flutter_test: sdk: flutter test: ^1.16.8 - flutter_lints: ^1.0.0 + flutter_lints: ^2.0.1 flutter: uses-material-design: true diff --git a/testing_app/windows/flutter/generated_plugins.cmake b/testing_app/windows/flutter/generated_plugins.cmake index 4d10c2518..b93c4c30c 100644 --- a/testing_app/windows/flutter/generated_plugins.cmake +++ b/testing_app/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/tool/flutter_ci_script_beta.sh b/tool/flutter_ci_script_beta.sh index 1f4fc0ede..ec569675e 100755 --- a/tool/flutter_ci_script_beta.sh +++ b/tool/flutter_ci_script_beta.sh @@ -15,39 +15,30 @@ declare -ar PROJECT_NAMES=( "add_to_app/prebuilt_module/flutter_module" "android_splash_screen" "animations" - # TODO(domesticmouse): Re-enable once Dart 2.17 is stable - # "desktop_photo_search/fluent_ui" - # TODO(domesticmouse): Re-enable once Dart 2.17 is stable - # "desktop_photo_search/material" + "desktop_photo_search/fluent_ui" + "desktop_photo_search/material" "experimental/federated_plugin/federated_plugin" "experimental/web_dashboard" "experimental/linting_tool" "flutter_maps_firestore" "form_app" - # TODO: Re-enable once WidgetBinding.instance is non-null - # in stable Flutter. - # "game_template" + "game_template" "infinite_list" "ios_app_clip" "isolate_example" "jsonexample" - # TODO(domesticmouse): Re-enable once Dart 2.17 is stable - # "material_3_demo" + "material_3_demo" "navigation_and_routing" "null_safety/null_safe_app" "null_safety/null_unsafe_app" "place_tracker" - # TODO(domesticmouse): Re-enable once Dart 2.17 is stable - # "platform_channels" - # TODO(domesticmouse): Re-enable once Dart 2.17 is stable - # "platform_design" + "platform_channels" + "platform_design" "platform_view_swift" "provider_counter" "provider_shopper" - # TODO(domesticmouse): Re-enable once Dart 2.17 is stable - # "simplistic_editor" - # TODO(domesticmouse): Re-enable once Dart 2.17 is stable - # "testing_app" + "simplistic_editor" + "testing_app" "veggieseasons" ) diff --git a/tool/flutter_ci_script_stable.sh b/tool/flutter_ci_script_stable.sh index 666ba7a72..40ecf362f 100755 --- a/tool/flutter_ci_script_stable.sh +++ b/tool/flutter_ci_script_stable.sh @@ -27,8 +27,7 @@ declare -ar PROJECT_NAMES=( "ios_app_clip" "isolate_example" "jsonexample" - # TODO(domesticmouse): Re-enable once Dart 2.17 is stable - # "material_3_demo" + "material_3_demo" "navigation_and_routing" "null_safety/null_safe_app" "null_safety/null_unsafe_app" @@ -38,8 +37,7 @@ declare -ar PROJECT_NAMES=( "platform_view_swift" "provider_counter" "provider_shopper" - # TODO: Re-enable once Dart 2.17 is stable - # "simplistic_editor" + "simplistic_editor" "testing_app" "veggieseasons" ) diff --git a/veggieseasons/lib/screens/details.dart b/veggieseasons/lib/screens/details.dart index 1714e69ed..9dc372da4 100644 --- a/veggieseasons/lib/screens/details.dart +++ b/veggieseasons/lib/screens/details.dart @@ -255,7 +255,7 @@ class DetailsScreen extends StatefulWidget { } @override - _DetailsScreenState createState() => _DetailsScreenState(); + State createState() => _DetailsScreenState(); } class _DetailsScreenState extends State with RestorationMixin { diff --git a/veggieseasons/lib/screens/search.dart b/veggieseasons/lib/screens/search.dart index ee3c9b49d..79713e0ce 100644 --- a/veggieseasons/lib/screens/search.dart +++ b/veggieseasons/lib/screens/search.dart @@ -15,7 +15,7 @@ class SearchScreen extends StatefulWidget { final String? restorationId; @override - _SearchScreenState createState() => _SearchScreenState(); + State createState() => _SearchScreenState(); } class _SearchScreenState extends State with RestorationMixin { @@ -76,11 +76,14 @@ class _SearchScreenState extends State with RestorationMixin { // This invisible and otherwise unnecessary search box is used to // pad the list entries downward, so none will be underneath the // real search box when the list is at its top scroll position. - child: _createSearchBox(focus: false), visible: false, maintainSize: true, maintainAnimation: true, maintainState: true, + // This invisible and otherwise unnecessary search box is used to + // pad the list entries downward, so none will be underneath the + // real search box when the list is at its top scroll position. + child: _createSearchBox(focus: false), ); } else { return Padding( diff --git a/veggieseasons/lib/screens/settings.dart b/veggieseasons/lib/screens/settings.dart index ae4cbd84d..ce491efca 100644 --- a/veggieseasons/lib/screens/settings.dart +++ b/veggieseasons/lib/screens/settings.dart @@ -166,11 +166,16 @@ class CalorieSettingsScreen extends StatelessWidget { } } -class SettingsScreen extends StatelessWidget { +class SettingsScreen extends StatefulWidget { const SettingsScreen({this.restorationId, Key? key}) : super(key: key); final String? restorationId; + @override + State createState() => _SettingsScreenState(); +} + +class _SettingsScreenState extends State { SettingsItem _buildCaloriesItem(BuildContext context, Preferences prefs) { return SettingsItem( label: 'Calorie Target', @@ -237,6 +242,7 @@ class SettingsScreen extends StatelessWidget { child: const Text('Yes'), onPressed: () async { await prefs.restoreDefaults(); + if (!mounted) return; Navigator.pop(context); }, ), @@ -257,7 +263,7 @@ class SettingsScreen extends StatelessWidget { final prefs = Provider.of(context); return RestorationScope( - restorationId: restorationId, + restorationId: widget.restorationId, child: CupertinoPageScaffold( child: Container( color: diff --git a/veggieseasons/lib/widgets/close_button.dart b/veggieseasons/lib/widgets/close_button.dart index 6a9f784a7..4ef6e6646 100644 --- a/veggieseasons/lib/widgets/close_button.dart +++ b/veggieseasons/lib/widgets/close_button.dart @@ -47,7 +47,8 @@ class ColorChangingIcon extends ImplicitlyAnimatedWidget { final double? size; @override - _ColorChangingIconState createState() => _ColorChangingIconState(); + AnimatedWidgetBaseState createState() => + _ColorChangingIconState(); } class _ColorChangingIconState @@ -81,12 +82,10 @@ class CloseButton extends StatefulWidget { final VoidCallback onPressed; @override - CloseButtonState createState() { - return CloseButtonState(); - } + State createState() => _CloseButtonState(); } -class CloseButtonState extends State { +class _CloseButtonState extends State { bool tapInProgress = false; @override diff --git a/veggieseasons/lib/widgets/settings_item.dart b/veggieseasons/lib/widgets/settings_item.dart index c5739d7b3..8c08a701c 100644 --- a/veggieseasons/lib/widgets/settings_item.dart +++ b/veggieseasons/lib/widgets/settings_item.dart @@ -75,10 +75,10 @@ class SettingsItem extends StatefulWidget { final SettingsItemCallback? onPress; @override - State createState() => SettingsItemState(); + State createState() => _SettingsItemState(); } -class SettingsItemState extends State { +class _SettingsItemState extends State { bool pressed = false; @override diff --git a/veggieseasons/lib/widgets/trivia.dart b/veggieseasons/lib/widgets/trivia.dart index ac91a27f0..1873de90a 100644 --- a/veggieseasons/lib/widgets/trivia.dart +++ b/veggieseasons/lib/widgets/trivia.dart @@ -13,7 +13,7 @@ class TriviaView extends StatefulWidget { const TriviaView({this.id, this.restorationId, Key? key}) : super(key: key); @override - _TriviaViewState createState() => _TriviaViewState(); + State createState() => _TriviaViewState(); } /// Possible states of the game. diff --git a/veggieseasons/lib/widgets/veggie_card.dart b/veggieseasons/lib/widgets/veggie_card.dart index 2e081cf41..73cb451f7 100644 --- a/veggieseasons/lib/widgets/veggie_card.dart +++ b/veggieseasons/lib/widgets/veggie_card.dart @@ -66,7 +66,7 @@ class PressableCard extends StatefulWidget { final Duration duration; @override - _PressableCardState createState() => _PressableCardState(); + State createState() => _PressableCardState(); } class _PressableCardState extends State { diff --git a/veggieseasons/pubspec.lock b/veggieseasons/pubspec.lock index e739077bd..96522fabf 100644 --- a/veggieseasons/pubspec.lock +++ b/veggieseasons/pubspec.lock @@ -56,14 +56,14 @@ packages: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.15.0" + version: "1.16.0" crypto: dependency: transitive description: name: crypto url: "https://pub.dartlang.org" source: hosted - version: "3.0.1" + version: "3.0.2" cupertino_icons: dependency: "direct main" description: @@ -77,7 +77,7 @@ packages: name: fake_async url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.3.0" ffi: dependency: transitive description: @@ -110,7 +110,7 @@ packages: name: flutter_lints url: "https://pub.dartlang.org" source: hosted - version: "1.0.4" + version: "2.0.1" flutter_test: dependency: "direct dev" description: flutter @@ -148,14 +148,14 @@ packages: name: js url: "https://pub.dartlang.org" source: hosted - version: "0.6.3" + version: "0.6.4" lints: dependency: transitive description: name: lints url: "https://pub.dartlang.org" source: hosted - version: "1.0.1" + version: "2.0.0" matcher: dependency: transitive description: @@ -169,7 +169,7 @@ packages: name: material_color_utilities url: "https://pub.dartlang.org" source: hosted - version: "0.1.3" + version: "0.1.4" meta: dependency: transitive description: @@ -190,7 +190,7 @@ packages: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.8.0" + version: "1.8.1" path_provider_linux: dependency: transitive description: @@ -218,7 +218,7 @@ packages: name: petitparser url: "https://pub.dartlang.org" source: hosted - version: "4.4.0" + version: "5.0.0" platform: dependency: transitive description: @@ -314,7 +314,7 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.8.1" + version: "1.8.2" stack_trace: dependency: transitive description: @@ -349,7 +349,7 @@ packages: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.8" + version: "0.4.9" typed_data: dependency: transitive description: @@ -363,14 +363,14 @@ packages: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.1.1" + version: "2.1.2" win32: dependency: transitive description: name: win32 url: "https://pub.dartlang.org" source: hosted - version: "2.5.1" + version: "2.5.2" window_size: dependency: "direct main" description: @@ -393,7 +393,7 @@ packages: name: xml url: "https://pub.dartlang.org" source: hosted - version: "5.3.1" + version: "5.4.1" yaml: dependency: transitive description: @@ -402,5 +402,5 @@ packages: source: hosted version: "3.1.0" sdks: - dart: ">=2.15.0 <3.0.0" + dart: ">=2.17.0-206.0.dev <3.0.0" flutter: ">=2.8.0" diff --git a/veggieseasons/pubspec.yaml b/veggieseasons/pubspec.yaml index df2b62bfd..c4e056722 100644 --- a/veggieseasons/pubspec.yaml +++ b/veggieseasons/pubspec.yaml @@ -5,7 +5,7 @@ publish_to: none version: 1.2.0 environment: - sdk: '>=2.12.0 <3.0.0' + sdk: ">=2.17.0-0 <3.0.0" dependencies: flutter: @@ -24,7 +24,7 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - flutter_lints: ^1.0.0 + flutter_lints: ^2.0.1 flutter_launcher_icons: ^0.9.0 flutter: diff --git a/web/_tool/verify_packages.dart b/web/_tool/verify_packages.dart index 70a197858..8cfc8d8c9 100644 --- a/web/_tool/verify_packages.dart +++ b/web/_tool/verify_packages.dart @@ -11,6 +11,8 @@ import 'common.dart'; void main() async { final packageDirs = listPackageDirs(Directory.current) .map((path) => p.relative(path, from: Directory.current.path)) + // TODO: remove this when `slide_puzzle` is removed from samples repo + .where((path) => !path.contains('slide_puzzle')) .toList(); print('Package dirs:\n${packageDirs.map((path) => ' $path').join('\n')}'); diff --git a/web/charts/lib/behaviors/selection_user_managed.dart b/web/charts/lib/behaviors/selection_user_managed.dart index c5760b45f..855a47679 100644 --- a/web/charts/lib/behaviors/selection_user_managed.dart +++ b/web/charts/lib/behaviors/selection_user_managed.dart @@ -130,7 +130,7 @@ class SelectionUserManagedState extends State { onPressed: _handleClearSelection, child: const Text('Clear Selection')); return Column( - children: [SizedBox(child: chart, height: 150.0), clearSelection]); + children: [SizedBox(height: 150.0, child: chart), clearSelection]); } void _infoSelectionModelUpdated(charts.SelectionModel model) { diff --git a/web/charts/lib/behaviors/slider.dart b/web/charts/lib/behaviors/slider.dart index 4b2c7d842..b4f5d4ad1 100644 --- a/web/charts/lib/behaviors/slider.dart +++ b/web/charts/lib/behaviors/slider.dart @@ -118,7 +118,7 @@ class _SliderCallbackState extends State { }); } - SchedulerBinding.instance!.addPostFrameCallback(rebuild); + SchedulerBinding.instance.addPostFrameCallback(rebuild); } @override diff --git a/web/charts/lib/gallery_scaffold.dart b/web/charts/lib/gallery_scaffold.dart index b172b8471..8acaf2e75 100644 --- a/web/charts/lib/gallery_scaffold.dart +++ b/web/charts/lib/gallery_scaffold.dart @@ -43,7 +43,7 @@ class GalleryScaffold extends StatefulWidget { }); @override - _GalleryScaffoldState createState() => _GalleryScaffoldState(); + State createState() => _GalleryScaffoldState(); } class _GalleryScaffoldState extends State { @@ -61,7 +61,7 @@ class _GalleryScaffoldState extends State { SizedBox(height: 250.0, child: widget.childBuilder()), ])), floatingActionButton: FloatingActionButton( - child: const Icon(Icons.refresh), onPressed: _handleButtonPress), + onPressed: _handleButtonPress, child: const Icon(Icons.refresh)), ); } } diff --git a/web/charts/lib/main.dart b/web/charts/lib/main.dart index 93c130dfe..64aa979c3 100644 --- a/web/charts/lib/main.dart +++ b/web/charts/lib/main.dart @@ -22,13 +22,13 @@ class GalleryApp extends StatefulWidget { const GalleryApp({Key? key}) : super(key: key); @override - GalleryAppState createState() => GalleryAppState(); + State createState() => _GalleryAppState(); } /// The main gallery app state. /// /// Controls performance overlay, and instantiates a [Home] widget. -class GalleryAppState extends State { +class _GalleryAppState extends State { // Initialize app settings from the default configuration. bool _showPerformanceOverlay = defaultConfig.showPerformanceOverlay; diff --git a/web/charts/pubspec.lock b/web/charts/pubspec.lock index 93b7f0ec4..f02fe1b2d 100644 --- a/web/charts/pubspec.lock +++ b/web/charts/pubspec.lock @@ -47,7 +47,7 @@ packages: name: flutter_lints url: "https://pub.dartlang.org" source: hosted - version: "1.0.4" + version: "2.0.1" intl: dependency: "direct main" description: @@ -61,7 +61,7 @@ packages: name: lints url: "https://pub.dartlang.org" source: hosted - version: "1.0.1" + version: "2.0.0" logging: dependency: transitive description: @@ -103,5 +103,5 @@ packages: source: hosted version: "2.1.2" sdks: - dart: ">=2.14.0 <3.0.0" + dart: ">=2.17.0-206.0.dev <3.0.0" flutter: ">=2.5.0" diff --git a/web/charts/pubspec.yaml b/web/charts/pubspec.yaml index c2da983f4..3cd077396 100644 --- a/web/charts/pubspec.yaml +++ b/web/charts/pubspec.yaml @@ -3,7 +3,7 @@ description: Charts-Flutter Demo publish_to: none environment: - sdk: '>=2.12.0 <3.0.0' + sdk: ">=2.17.0-0 <3.0.0" dependencies: flutter: @@ -12,8 +12,8 @@ dependencies: meta: ^1.1.1 intl: ^0.17.0 -dev_dependencies: - flutter_lints: ^1.0.4 +dev_dependencies: + flutter_lints: ^2.0.1 flutter: uses-material-design: true diff --git a/web/game_template b/web/game_template new file mode 120000 index 000000000..987a86f6f --- /dev/null +++ b/web/game_template @@ -0,0 +1 @@ +../game_template \ No newline at end of file diff --git a/web/github_dataviz/lib/layered_chart.dart b/web/github_dataviz/lib/layered_chart.dart index b6ee1822d..ea89b4892 100644 --- a/web/github_dataviz/lib/layered_chart.dart +++ b/web/github_dataviz/lib/layered_chart.dart @@ -17,12 +17,12 @@ class LayeredChart extends StatefulWidget { : super(key: key); @override - State createState() { - return LayeredChartState(); + State createState() { + return _LayeredChartState(); } } -class LayeredChartState extends State { +class _LayeredChartState extends State { late List paths; late List capPaths; late List maxValues; @@ -167,13 +167,13 @@ class LayeredChartState extends State { return Container( color: Constants.backgroundColor, child: CustomPaint( - foregroundPainter: ChartPainter(this, widget.dataToPlot, + foregroundPainter: _ChartPainter(this, widget.dataToPlot, widget.milestones, 80, 50, 50, 12, 500, widget.animationValue), child: Container())); } } -class ChartPainter extends CustomPainter { +class _ChartPainter extends CustomPainter { static List colors = [ Colors.red[900], const Color(0xffc4721a), @@ -208,9 +208,9 @@ class ChartPainter extends CustomPainter { late Paint linePaint; late Paint fillPaint; - LayeredChartState state; + _LayeredChartState state; - ChartPainter( + _ChartPainter( this.state, this.dataToPlot, this.milestones, diff --git a/web/github_dataviz/lib/main.dart b/web/github_dataviz/lib/main.dart index 272b38e8d..c19df527f 100644 --- a/web/github_dataviz/lib/main.dart +++ b/web/github_dataviz/lib/main.dart @@ -22,7 +22,7 @@ class MainLayout extends StatefulWidget { const MainLayout({Key? key}) : super(key: key); @override - _MainLayoutState createState() => _MainLayoutState(); + State createState() => _MainLayoutState(); } class _MainLayoutState extends State with TickerProviderStateMixin { diff --git a/web/github_dataviz/lib/timeline.dart b/web/github_dataviz/lib/timeline.dart index 6576afe95..6562559a5 100644 --- a/web/github_dataviz/lib/timeline.dart +++ b/web/github_dataviz/lib/timeline.dart @@ -29,12 +29,12 @@ class Timeline extends StatefulWidget { : super(key: key); @override - State createState() { - return TimelineState(); + State createState() { + return _TimelineState(); } } -class TimelineState extends State { +class _TimelineState extends State { HashMap labelPainters = HashMap(); @override @@ -49,7 +49,7 @@ class TimelineState extends State { for (var weekLabel in widget.weekLabels) { labelPainters[weekLabel.label] = _makeTextPainter(Constants.milestoneTimelineColor, weekLabel.label); - labelPainters[weekLabel.label + '_red'] = + labelPainters['${weekLabel.label}_red'] = _makeTextPainter(Colors.redAccent, weekLabel.label); } } @@ -79,7 +79,7 @@ class TimelineState extends State { } }, child: CustomPaint( - foregroundPainter: TimelinePainter( + foregroundPainter: _TimelinePainter( this, widget.numWeeks, widget.animationValue, widget.weekLabels), child: Container( height: 200, @@ -106,8 +106,8 @@ class TimelineState extends State { } } -class TimelinePainter extends CustomPainter { - TimelineState state; +class _TimelinePainter extends CustomPainter { + _TimelineState state; late Paint mainLinePaint; late Paint milestoneLinePaint; @@ -123,7 +123,7 @@ class TimelinePainter extends CustomPainter { int yearNumber = 2015; - TimelinePainter( + _TimelinePainter( this.state, this.numWeeks, this.animationValue, this.weekLabels) { mainLinePaint = Paint(); mainLinePaint.style = PaintingStyle.stroke; diff --git a/web/github_dataviz/pubspec.lock b/web/github_dataviz/pubspec.lock index 46fe0ba48..1531074a0 100644 --- a/web/github_dataviz/pubspec.lock +++ b/web/github_dataviz/pubspec.lock @@ -47,7 +47,7 @@ packages: name: flutter_lints url: "https://pub.dartlang.org" source: hosted - version: "1.0.4" + version: "2.0.1" http: dependency: "direct main" description: @@ -75,7 +75,7 @@ packages: name: lints url: "https://pub.dartlang.org" source: hosted - version: "1.0.1" + version: "2.0.0" material_color_utilities: dependency: transitive description: @@ -138,4 +138,4 @@ packages: source: hosted version: "2.1.2" sdks: - dart: ">=2.14.0 <3.0.0" + dart: ">=2.17.0-206.0.dev <3.0.0" diff --git a/web/github_dataviz/pubspec.yaml b/web/github_dataviz/pubspec.yaml index da76ef5a4..0a5b48a99 100644 --- a/web/github_dataviz/pubspec.yaml +++ b/web/github_dataviz/pubspec.yaml @@ -1,7 +1,7 @@ name: github_dataviz environment: - sdk: '>=2.12.0 <3.0.0' + sdk: ">=2.17.0-0 <3.0.0" dependencies: flutter: @@ -10,7 +10,7 @@ dependencies: http: ^0.13.4 dev_dependencies: - flutter_lints: ^1.0.4 + flutter_lints: ^2.0.1 flutter: assets: diff --git a/web/particle_background/lib/main.dart b/web/particle_background/lib/main.dart index 6ba95bc3a..6879a2429 100644 --- a/web/particle_background/lib/main.dart +++ b/web/particle_background/lib/main.dart @@ -39,7 +39,7 @@ class Particles extends StatefulWidget { const Particles(this.numberOfParticles, {key}) : super(key: key); @override - _ParticlesState createState() => _ParticlesState(); + State createState() => _ParticlesState(); } class _ParticlesState extends State { diff --git a/web/particle_background/lib/simple_animations_package.dart b/web/particle_background/lib/simple_animations_package.dart index 7f2b5efdb..1cec3f7eb 100644 --- a/web/particle_background/lib/simple_animations_package.dart +++ b/web/particle_background/lib/simple_animations_package.dart @@ -36,7 +36,7 @@ class Rendering extends StatefulWidget { : super(key: key); @override - _RenderingState createState() => _RenderingState(); + State createState() => _RenderingState(); } class _RenderingState extends State @@ -199,7 +199,7 @@ class MultiTrackTween extends Animatable> { /// Single property to tween. Used by [MultiTrackTween]. class Track { final String name; - final List<_TrackItem> items = []; + final List items = []; Track(this.name); @@ -211,20 +211,20 @@ class Track { /// Optionally you can set a named parameter [curve] that applies an easing /// curve to the tween. Track add(Duration duration, Animatable tween, {Curve? curve}) { - items.add(_TrackItem(duration, tween, curve: curve)); + items.add(TrackItem(duration, tween, curve: curve)); return this; } } -class _TrackItem { +class TrackItem { final Duration duration; late Animatable tween; - _TrackItem(this.duration, Animatable _tween, {Curve? curve}) { + TrackItem(this.duration, Animatable tween, {Curve? curve}) { if (curve != null) { - tween = _tween.chain(CurveTween(curve: curve)); + this.tween = tween.chain(CurveTween(curve: curve)); } else { - tween = _tween; + this.tween = tween; } } } @@ -336,7 +336,7 @@ class ControlledAnimation extends StatefulWidget { super(key: key); @override - _ControlledAnimationState createState() => _ControlledAnimationState(); + State createState() => _ControlledAnimationState(); } class _ControlledAnimationState extends State diff --git a/web/particle_background/pubspec.lock b/web/particle_background/pubspec.lock index 448f6bcae..fec37ab96 100644 --- a/web/particle_background/pubspec.lock +++ b/web/particle_background/pubspec.lock @@ -26,14 +26,14 @@ packages: name: flutter_lints url: "https://pub.dartlang.org" source: hosted - version: "1.0.4" + version: "2.0.1" lints: dependency: transitive description: name: lints url: "https://pub.dartlang.org" source: hosted - version: "1.0.1" + version: "2.0.0" material_color_utilities: dependency: transitive description: @@ -61,4 +61,4 @@ packages: source: hosted version: "2.1.2" sdks: - dart: ">=2.14.0 <3.0.0" + dart: ">=2.17.0-206.0.dev <3.0.0" diff --git a/web/particle_background/pubspec.yaml b/web/particle_background/pubspec.yaml index d90c1f5ae..b99d326ed 100644 --- a/web/particle_background/pubspec.yaml +++ b/web/particle_background/pubspec.yaml @@ -3,12 +3,12 @@ description: Example for the simple_animations package homepage: https://github.com/felixblaschke/simple_animations environment: - sdk: '>=2.12.0 <3.0.0' + sdk: ">=2.17.0-0 <3.0.0" dependencies: flutter: sdk: flutter - flutter_lints: ^1.0.4 + flutter_lints: ^2.0.1 flutter: assets: - preview.png diff --git a/web/samples_index/lib/src/samples.yaml b/web/samples_index/lib/src/samples.yaml index 7a47ad235..357c5afa0 100644 --- a/web/samples_index/lib/src/samples.yaml +++ b/web/samples_index/lib/src/samples.yaml @@ -492,6 +492,10 @@ samples: platforms: ['windows', 'macos', 'linux'] type: sample +################### +#### Web Demos #### +################### + - name: Rich Text Editor author: Flutter screenshots: @@ -511,7 +515,8 @@ samples: links: [] tags: ["demo", "text"] platforms: ["ios", "android", "web", "windows", "macos", "linux"] - type: sample + type: demo + web: web/simplistic_editor - name: Material You author: Flutter @@ -541,13 +546,42 @@ samples: - AppBar packages: [] links: [] - tags: ["Material", "Material You"] + tags: ["material", "material you"] platforms: ["ios", "android", "web", "windows", "macos", "linux"] - type: sample - -################### -#### Web Demos #### -################### + type: demo + web: web/material_3_demo + + - name: Game Template + author: Flutter + screenshots: + - url: images/loading_screen.png + alt: Loading screen + - url: images/level_selector.png + alt: Level selection screen + source: https://github.com/flutter/samples/tree/master/game_template + description: > + This is a game template that shows how to build much of the dressing + around an actual game. The game itself is very simple - the value in this + sample is everything around the game. + difficulty: beginner + widgets: + - GoRouter + - AppLifecycleObserver + packages: + - audioplayers + - firebase_crashlytics + - games_services + - go_router + - google_mobile_ads + - in_app_purchase + - logging + - provider + - shared_preferences + links: [] + tags: ["games", "firebase", "ads", "crashlytics", "routing"] + platforms: ["ios", "android", "web", "windows", "macos", "linux"] + type: demo + web: web/material_3_demo - name: Charts author: Flutter diff --git a/web/samples_index/web/images/level_selector.png b/web/samples_index/web/images/level_selector.png new file mode 100644 index 0000000000000000000000000000000000000000..d3bf92a04569de2626f4ef7b0379f5f37bfa215d GIT binary patch literal 55013 zcmeEuby!n<_%|vlC7`4rp>&r>GZYbN=>{j=lA|Xgpdg@hBO*%42+0A{5tHtQ(H$d4 zkN4n{zvq4b{r&a2>)N%mbI!N#_}riGea@RF>WbHh=!o#}@UAI6eyD|qhtCasbqKBi zXNm*1{qXRJM(pI}pD4-8Ge2>2v9@!x!oz#~CO+}1POKsIi^;PuVn!D)YCXU_=6Dg; zeTm@lRZT)A=B!um$aNfFlSEA!Jh^^Bp*!pK%WV1gCCt>0!Ot!nzaSxMl{6^MDg_n4 zN**bL+qiVLopyEvRMwsdEMCD=CO2kP4yM9;Ok@3~;Y4~_sKnJ{T;#YZrw^*3dBat!io zzC5K5wf(PxQ)s!!r>D8pGo}T!)5JS$L+mnN3ktm2yYM}B#L-n4&yuH6y=#G$#r0SQ~Gs-QjKZTJO!}mJ?n{ifUJBNtK@^cfX7oj11!m zdO~d&-&F2@#;|>QnOUaGdzsmi9FN4a(;9_0g%_hAc$U^dei%sEjhANF@jkrF#&Ic6 zjD-23kK84DIpU=Y7Egov=kZKlT-CC}({jgueYp+q>gIh(@?ff`*M{+kRPlZ*3 zMZxmk7usJWKWDymK_Db{T2=gNXILdN=eejqzH?C5kD)2}bI{2RM#T%1ggGyJ?;C!g z};sN2yi$7jWsS@0NPFO%NMi54@{)+z9Z6v&vbU(>(NX?!%JFvBuqeB;e06}LNl?1Yc2KWX&}^;-4fEmIi2aa6|MLB;0GeVsFM zyLu>l$QSZJ=#%%88BW8vuW`PuKCKk3iW2#0Ik!}zcq+|`Oo|jX62^IaUe*RlYX>I# zNBO@wAv~nt&L+aYEPq+xas^T{#4RM2D1c}-Tt~s7iM+|9i7z~i3dTvwGaW|~?;lsC ze5iaizLV#gmZpwOK25y*#ABIC`0X@#eMzrb9FDP1EKBb+IMc#hjTB)j|cns%gM!)2YId!!G?U6D>Ij?G^uEnJcDOm`EZ? zvagBVte_*M&!a1O>-LuJE#pn?w-b>fkp+>Mq^D}M?0M|Rs?I6M&)CoYeQtg9*2T%e z$=@9_4WlKR$6HKn&79CS_bZ+nSsLFpATh`{xMH|qSYcFe^Z~)_{3GhJDRI5wh;fb~ zL#eOrS4)Pc={6J2r_Ig%p%&WC?x=)ks}68hq9YzCHh_^Bc+l4^LF!GSV!#1 z)cjicU_k@@{Q9El(!_f99L2Ks!cL?9kl0A&4@i3#+NIn)4AczjhK50zRAQUJ17*z@ zZ(SO^VnV=rHS}u2W!Y=O*KS-b7kEi?nRm2$NwfHVv0xR|p@db)8i~&>d&-oXM{Up6 zX1bf^BQiq_!@d%(5`763AOqdP$s$Fb88wSl(OpO(F;jhU!T6Q8EqMWrI8CZ&d!q86!G#e zDo@zG(`PcZlDBV*vX}PkYL2?g^Fa_1?Baw6wh)vX+ zOHHCT9+&F$CMd{X$ywF1ScdclIaaQ1uSN5G)JrqStJ134KH~1vP1Tp_+UhuT74;Rh z@m!=!7o{I0DYPp3YIOChipfy5nM(lfD9Z#fUURMSS{{91M_DURr(dOzuZ3T|b)YkD z3KBReO8JxOHSy8CYRCK&#?!i~$@kV9m z1hzh4nRK0y9#{>Uo=NKb%$Cb74n_ z?n&)tGHxYMW$3KyS7}ANlBQn;iR`7I$psU7viPDv(f1>&xXUA!M{k z)&$k56%O3nVPb@uFh$&?_vH(eIkavwF0U-dtf4)l!lFPvnYh3i`Dw-SXwOXA%o96DKffSJ9W9G%@Iy=CtFxJ$Jv^RE3J5?T5PpaVzl)oVfRKcQ zgn*#1fUqzha0j2ekFy8Zo6p&u<&R4Ks^_7VyM>$Ga}PTgXXf*I!OvVgJ!J0OIdACi z&maA?^0xb@C1>|PhXo8!;QWe!5Wk?n-*p2;rO(ewKC$z*ax{Es=LF0d(1xs#kf6Bq zuLA$qrGJ|IS5bq16&1X9@83oLb?LuFb=|GpKe1T5q&yN4R*q5+86`RC%fSaSaHdw%ROI{NM)8xKzo zPwC-(9q$Wk6IatH2d1xXhJ`=7^iYmc^S;8GsRia^GdhwlVHnPSW^f}?2s<1(F>ImM zKWq_Ew;y_k`U%&a@Vj=n$--(27iSj;rpjWW6B8&)D7Axb_d5=VJ+*|2?U=!juhwr` zY~GQ3fp_5|J^?xNp9gbtAJRYExtjff_+KZ_ugcw*doumtuiO5*-;ISi_h-kGC4&D^ z2{|)!?(=JZ-Sb!F)z`^&=BznAUj5G&$;ox9uKab+pN$5M6A*B_iBL*D_)qr;xJ@qo zw`0!u_*B(5i5PDGXDs+sMgQrQ9JAQPm*L|iAyNPB+e@OM|MZIa9sPy-3eKSq6#vt= z3-?1D{?jY+pOG&<+!2${V);+sUVK1`{-;+2bC2Ynyid*QzW(oN2l@j{FWv9y#rr+I ze+bNP>HVd=zm3B$lk(d*{9&hfAInnN{CkbNVCE)EwCGbi=ll<|>Xqd!8icI@})kb%o!xur!iK%=d zqbahG!TPki@9^Yr2=DY*?nzJRl|IGWav$~x{iSBc1iim6g1e1_kzp`Wf>`#G?p!jV zzIKtYCOs4B!t#z$Fiw{E?utP?;osrKoF)MFQJOs*7x72Geg7$-7#cl!ixv&ts@rT* z3{IUdG?Qd%!m<@zOBFaWmzsj+zrQLcIC?qXAC?sCH|6pfALX*@r zD#|_dR2{_JF4HwWpU=heciDFiK*&=RrnpEzZtHYW9>hSG0pB0l>~Xk+j8lrW@!n4~ zwK*&vxIfmu=_UI3?;z+yHPB=S+p_d|lb7p{kKmgvQo+dMt&KMtXq>oqggn3a9gmGc zi9T7|w7#7I;yn*BGLmw^F|%iB@65yo>gov8>ab zpP1M~M;4a4)4q7}U!=Nh;z#u+B?k$d4JpY+Rn)+1Oqe=^Pt<`}Gsv2PT<0!*4#jom zO?UDG*Oln$>f?-SXLajaCeZPOq=Fd~6O?2Ux)X5V)tD;?&CCF|=VIhhK2mxCi_KL% zvq*-;3F^>*dv^QgOqUqrC~5@mnj4g#*@Fj3%kJ?&+|+Q#;eHKQ1?uUkO~G5m!^#1(q9Te*mG*5# zkLKWchG9J|fLy*K2Bd>O^gah59aI;$!j4$PWN(=H95jtXAboXWWCe~j_SwhD_(Cn_ z@+g0)&zlw^gzS%+m_D!|4kZ1BoKxO)$nfn%5v(Y94&*mgwYU>x{fAaWPD+;IsBzA z^I-!arJAbm$0+ISA2gu(u$QC{HL)A+m{+K?E!!kIl*7sXEHY)RkYR8FTqjNvkIJI! zPeFupEHcuZ?cgFXVU@UJ-}Nk!4r%u!Nh{@bFYU>8#L`Rf7Yi>^ch8K1yf3*c;zMQx zEC{-r&Qiw-58lOn*fVr4DefzQ>oDBadzo=pD3mhsj8f~f8d!e+H`pr&=w$Z>n z0Hcgny!i0ZDH^7s_(D#EsCH{^bvmd3H}TenHz0q5c>gtM98UA{hm zdlLmv1IuOfwSLY~2Iyv>h=&gC^+e56$t%|zWa+7810YYFXf<`p*2Z-28Os!w?~R5a z;t~rE9@Y}iANpn56}L)C6*3Ku1WsIOv(foMHVY+a05MV5(cC zPQl#5+!%Ju~5b*w`*qvN?PZk9=QAT15)Dg$iXrB#OBf=MK}DN>K9t+3iLy>v^+ zgbq8RA41NOaYr@kzVbB4m2hGXHUG+cv0<3@(c90o}E20^b<4Y z`w$7|O5}tD-$0auz^haZ1eZVc*}mzC^2PFy8BdWqSWE2ZS65-x0=1{RscaepAe;+$ zK2o2{P|xiP=5q|M*9~U5sYO=i+yjZoiZ10BajrB+`F_Km9?Ngw!iT>vXpE-oS)|p|!kn&^=V3 z*gb!cy+;!H@h~KZ?E&Byh8QygW5;g_&Sn1qcaLShA~O#}U||KzzL68^M-_)S<4`tz z%KSR?fK0#?hp2;RR@oSM=W#zsD7CS(1h0+#%$j`F=sUG~sR8BUPZ^jd zS^l1b%QWDPcj8a#9xH6MwSZ|>Yh4S&Ei&`7CkIOdWUY)nLbw6nOznLb1zi9+>M)aL zToYSWNKErKI%e$%K9O>&`3kw{wjMIqlSoV|TZtBgl`h+Z8_bx{}_)9EBASZ6f%ihv5kSv#Q9ue64p@+5{=sp`t zP2?tGLEO4obg-Vo))o%or<4zud1lZP17n@Lxz+S~bKrwOL$^jKbwWIYsE1{QsLxb& zSg6lpW~I_16C-Ac_TVTigej;cjd`HfI_kcjFsW#4o*A@t(p_rVVQW$8Wf7H_L7umM zSuJF}!#D{v=b~t;(<@@gW}7Ns!9#y1PI?n6m3i)(=A5GA3$!@L_64psV(J*n_x!~M zw7lidT@xGNl-QoE0Su>{(Ny*jhzQcyg8yYdzMZWY*GaFAv1?__JRxT~Sopp<3N_<8 zd@VN;{3ZMO{K3!&&d)_}n*=6y|H3LrhS<+QUgP zB8njD#PYf0;7%D{k7R^OcFN-iZ@%CTb-ZV{^yxiKT<1@_#5vVdhGo(q-$%g6;hI<@ z>Y=u_W2+(4+m4=7gB@swA+tne8h7F?*ZaX0r%(o_j^R(&qpeRcs!X+%n8E7e8n`D` z#_7yk2D>@YKgG#;&JhMZ159yA=sti|Y~`jxjx(d%-s8Rm^{zlTV)>l?hOt?TA7xTq zHeP;QKmf==d=)2?d~!LUD;B8V+%Pv+tPhR$9puvuVOJ?CQ61jsUQZcduNFPc2{R+n z7(X&7Q^k{5*VYXja@osi@N%tAM#wqei5(L=77d6`%xrb#F+-FkWDo)EL47ur+QZOb(R5tIi4=X zZE!l1j7*;i>Z48Sv@NuQl9InS>XcpF9TRcaJ4%0+g_F#DUoLoF^s*`S5*?}Z>Qp{P zHWx^FKEK~F8lcY`eoT?j*FC+Fz7~mexyR$+AyF=w- zYRfYX0-W%awvRm6$O71!{AT&2=XMc6kKc&GECcoF1B7>&0^DmrhW*_J=2O-9T=jAKNFm6p z&xv)cCH-Pu;xfY#?+^zsd2o2?X(Y%V7r0%n%ZI7nVmxiIPlcJ~w=9qDw?fTGqfPdw zJkqm!f4F<3iSSm;%(yniC?G$!2~aO2`9&#*QMOKow@IKOhcdbYPO3SgGj1jHYukwG zCo{As>q#mpP9ceIr?!*e3U4)D@*3mGH5J@yK1Xz zC=7rDgN_U$*=yH&{DS(?cBw71N`M$!C5hM9v>3*2T6BTd7^vT> z2pl`7EG#jc3x^IhxsJ{~tzbYhZW}6NMnNW`@);%Q?e7PL2Q>pSJQ<8BVYBI%V9inl zpBLlDg-VX73uxGz)3Pl*Ay@A9qs#WCDR6$rv)8DGHq5~d@eS0+r=?zSiOIJo-29Qg zCi6L(ZRN?lhlde-LvJB+}qGig-m-)?AME>`i>;r-^uAtdLMv*dg`Cb?fwi3c;zI{oXHmm361@rKn6+s4Qz6 z%Jm_5jP*`D{=iS>_7j!VT<(~*krd|*GNRZl?Ip0)ZFY-qv6D;xcZyJ#dK z>$hBnFmz*%G}LCLkXXzTr?a>r``$J!xj#KeU*YcPvBq&|Mg*Tho>6RT>>K>p#T`^6 zqw&C&5@*SYFHd7NrDP+5f1f}Eh4&PQPhV9pCd2b*+jNy5#L{cj6|L0AN$G1P?0V*T zE6QW6j$bJxY%naWNb8Tt$F#5^a5Jld+9n~a)jPKhBR^RrssllE-d5CW?3Uz`4tz#g zG+K%++V__0*89r^rPsQq9t@cUY;ssUJuo35ZL2%NP$Y6i?u5qqUVHsx)O2yuEI)Uy z-rTWVZ&=XhWC)r5V^OBvGTOCq6NO^!q=!3e;%}^pJM}kz zMv{f;&)mp~H(On=1%vlu61?%P+AA%PpcxiUmMdhi{>V}wxwOR5Bs~k$8ZdjnXX2_J zRLbFyD~Q`W2?b4(hmvrf(e@aPeWf29b3G01j2Q_826$w@A!x`EH81I^+6SBS!=zBa z3Xh^n>kD`dy-#ctup&blfK%fO5j*D+o`e9aPQ>f2I>|+- zl2>Y{1wgl`s9~oLmafO~XpZ}>KqzKhVYKhxrqhgHm-TUYnjQUBf;rhk^zeGMs>zj# zQ8o>SD5o_fn85lN`xlWavImp>4P9GARyP`#$E@koN^FT z^BH+486)*C(&981)3EeDTfS6)P^A7%q;Pw(8jlO*+{bk#Vq+x$$)YbuPXkM*#R*&`j>9gxF> z(@6O)V(l3T?mFzrEKDAVmGgC+YT618Bes3F^!DawCx}{1iCbpL-?V7(gD4aFRsGo& zW9NF_%)O7WH*2vVAZxC^jrQN(v(HZ~j8!eI=_Fk(_mvIb4HsL z)%CJ$H#$X!En@i2mQXib2eKHVM)NueuRv+#3qYp&Hs#dOL!BDLF(O&Ir%J_|(G06sg+{KPGi zI^gc-1Ch71!goyepovr%?!&;!+5OjT{a7x;gn9KLGrLoJM(9elH>`M{>$pFInUE)T zK(hYmAYwFN9=&!1g`=z@Xq>9TF`q-7;(h@*1^|~bkkX&yQo|r63XU*KtZjqqp*67R#)aJ4lbx7yT?E^U)) z?>**1|6p?6uQMD^p&wFWT?Zhr-2|Ia$vo{0=a(>!Fpv$dcY)Y?%wkNFRH7 zPuDND7F{gayFC_SHE2|^QZxbG3z+WUFe|7DET=kdQe+rJTc;x@Za2lw{i0T-57QD^&&BcwHQ!4t^es88H;yxNWx?$oB#5{WX4dbx zW~;;J=-OVXJ>!f!u>~NnrS7}7s3Pf`4rUxZ9_yn1O*&FtjTjg4JaRd<=rU8!lX+d4 z`T;S1yPDJMQhFps06LSFRR%1O+=n8-8Wn}{0kYWsJZKKP0)*swKNLkJJy&m$N-w@U z2o6jL51>Ds|M|ShMc}J}i!b-u^W9GHn}dc=SwjWU^*0!C$Cu9CuZG^0;jN{bu7)A% zdpoIN&!A=zr}laJmEJ=QE}i1Voh-a+hpVpJ`pdfaOv`7;>JyG`xitFRWvp76q|%s- zX=~AQtW~`{WY!=K%>9E}shRhoJSVWZpKVds%DN={s%C4)kU;#bQ-ZsdzCd)GUI9&l ztDs6f1H|IzHGh$hT)>hLHL?TFqm(??BVrFs!$6g9D7^EYenvQrOy4Zj-B;G)ETDpb z$E8-eMVpmE(d;;^pkcEsG=WzDJu)n%5FYK+emp18kjMm4vLLndn6Px~oiy|FPlwAh zRxRK*n`dEqo<(y9mNy#ec?2|dPpR`LF?iKN{2WpT!P_b^?2ti6=rGpvK{EBS28+hZ zC=b-8chS|vC45Is$9MfW@e)zAtq#RK_QlcVstM!_Pcv0GcdfseE}oX^d5r1_#HgO) zj=;J+Z6;5|Kdz8rFuGHisV80?ZKS?EK#8!ydxpJ*Y zR&$-`LdyzXn7PNpB&R4+wdF_IQ9f%-(V;Z6v!Z-^%D9-?CV;U}NHi~0r?5Fa+Rb-P z)p!uj5IvHU&*bMxXS)!Yl}UPSD8t*Tsf-%xEtiti+R935K; zx}E`FTrLgkVoJ=PSkyRP*l-U2)K^qjDzDF3i~Upp@DTNdCMDr?=fM*eU`5VJPrbr* zc;21&MCaD|-3@Y`PjZd`&-C;Wk+k>vr7c)u{G$5s4w+w=*(tSiv4hf->xd9d7zS~3 z;%WM4N{=K5EOLdSC7W^Jg!yoY?TiEiI#X}@jC})ozJMu{Yx36dvr(k5O(i_rN*-)Q1!h48`LTwlcopAX)6~U-3C{@q>jNs-^ zhmX`FNO+vSxrtPwrN6kZ>w4AV;t*j1vUDcZ&!|N61Lhha+EhvTzl^R7pa(KHq=2yq zTHyb|q^cX}cNDCxV_ltt7BPOZ(ypu7R2uQBN5i+(D^NGSzD5kYCV2;_xY5`J8=I zY(lQ!cES5;blV2$Ij8uhw+2pan&m=!I51TH;{gzM#2w7mt-hQnDj z(rkwu-!jX$?e8=#+AW>F(3d5Eq(lAWo63*d)S3;A^KPO~j<@~th1C}(9w*SMnSs<# zg;di7g^W;RBV*;MMP}mwvvSU$(o3V*{jg*O&4+l~o4#|+;)JX6^Bmv_+|Tp}h=GK5 zdC2M>pl#8g=AuxzErT@J{78&d^{t03Sq6Nh`8) zyt&OH5VmOXxF>07o4$}T@Foz%Ea}=cy-S(BH|#lkK#NKdP3^$Bl!IOZ7QH)v<8e|3 zX%v%)EPvloWw`r8Ru!HN=+OmmQK!3_hC5sI*Ke&qO7u^iLsi+0O5GKtVxKO26puzV zZc&6|2Ln=HnV?v~BP2;D-<;b9oPZ^8&-XeUakDY@pAS4|$@%qjD%$@>yWNigVPyHC z!vU;;#pPyyDRx#6IiR7*$XV)0nZU_DESb#A?2R0=mg+OF-6pE8v4CktFeY|C??@<0 z%Sm?>qH9uZ*|^xys+a1JQ9WzVq!{8QqBc1}WJUibMB{8VZ*wLb+@8{= zS2z?$1d}~d=B#YA7(w}@^ggAC&a=MJij4UbhB7{NKXO~w6%%afEfdo#d1xnZqr!ML za*tna4A}b%&F|mXpU_d6zV<5s0WutW@b8A5dr7*WInwaTj6fb~`b*(T6oI)5?|eOv zzSesT%lc5)1`WYoXIlMc@Dt+Aj2UX347}FoxpjGrW$k9>9{A)bDzLvzC-0P+S}R3y zg#2RI_;KBK{XDXn!dqcVArgG~DFQ5mh=bR}JnF!c3dhpZFUrU=HY8|b;9}O%u~DDR z)0$6X8Uk}&@U8-(_|Ws`jbLU{PtjVp(in$ zQy=BK9CEAHa1xT8H)9lK7v7w~^A-RcO2_8;%lF>~)<#|!3+T!R!iz0rK?1XLk(bPH zAMy{cw~D@RS1ZBTA>PD_d$|;ko?}u*#60L)0>|YRvbXY`pxS(0sc?{Pdo(OF z(E6yZ6tZhfja~iO`zPSUS+B2BBtbX1IoIP<)Z?4!H`q zy}y0fbJ$Qt2tG-21+PIYR>!$wq(7Go6Gb!;^3jmCeWj33yt44_06b1M4MRv2R78fN z?^+eTwe)=3Xwmp?Is^&|*zXfJTzpqN@m?yFZ5BVc2{!jW-11GYWpA$*ENTnZi+JN6 zYI!QIuuX%V6Ij1im+iYMDD4Q6cwlGV*t#4QZ*$7i*}d_Akb&QY9ZWRjD=uTofJY2XtZ ze;((MigXFPr(3W$!38=;_TNe#_tKZOkILTi0`{O9lUYo4hSe{=!94P(0hCbkZ3IMB zH3|~@HmV?{mTr+&X(LVv5wpXlQbf(p&ByJ(gdqzZVhpIZ)tIOhsmx?ke^RYeYYcwh zU2ZdEE8>zQQ}n&}34!+h((NzdtU*5WrHr)4pT>iz6LS( z*YB`yfyN@nyC%QbOjmDP-t3)2EmzUr=pR4TTnU4;P*AO#Sge*4-)@!OIrX6TcB5(W zgw}q}ZGP(`rEvmA7@0^|RC^}EM9!Mo6wPQKK~GJC(;u^knH0Og#Pe*11X1JXXoCr} zK+9xW|0b(1@lx1bNjasX(w>dfS4|1#h2&4!BK6DGY-(a#XgwoTvN~^KUMVq_C38_V zep=-i6G44o#bjv#2)g zy@hgHlNiXN1tjkvK*wJlh@26r;gPj~nZyeU1;p*z7$=awETox%)$p0lD%F)R*Xn*=vp=_|G8fz*CrH)ZmNnXH3d^kY)<1XEVAFHi&@{x#hfU^VRd$XtM&9pEs4{ku|-AjvUWY;3mdT6aY}~8 zuhK!*TXz0pr=Q;AoVo99XPh&>bb!OU>zI9>=FN6_194Qpxj+Gn=S@YYxA^0wV)one zIlNC~Wuu;NP1C5ll&Q%E!nCo3#Le+|F^9Ccqtr6`02+Xs;&+|;;mR15@&=btd%A_> z=3&b(KPdXOaZ=GmU4FmsFTS&BOpWgGsCq)F8lzJFf-YCCfm4JivU!XDy)?qaukR5@ zz`7bwGM0Z!5`qxqDVj(w_=Aj$h z*6K_xUlxDQr25C~j@H!Zu^p?jsb5a>QVCR=+N>5cqNU)8RqL|9U!VF}lNu_fHn#eU zON|3^72^6d&#lyri(TWV9^NZa9LjNbo%G!tJWKN*008dpGJa*cyTidjBw4D*+U~7y zf6+Qv%3$=7IDk|-%Ev^G)P!A{ufQD*Z0{L1-7)NV_6R|jqT{Y*ayT30&Cv<(s-KuK zRbJo`KNy!^!DpMNRd$-_O}93K#!jLk-iNv1d)) zs58u3wzL~SFa)@c4DcF#jFw`AJ1oJqmYKX-lzRfC~)FN$56%&WGJ1M zi76jWr|bk?QLBE!VR#3UDql%_I>XJgZf&0^DGW+2sv~a&R^ri0s5T5%rQ8G4m=NGC zw(Zgi(=YFW^l7L9Vx#*b@8P-F+AJ~4;oV68$ zMMwQD!f+ZUS8$Se;DcZkFXD%CNVNc6;k)3AL+Cq^bRls5+Oi*PuVX3L3c7B&;jV{3 z={;vYw$`UU;M|+gc{s=S3lROo$lhfYlmWd?cnwW91BelMSk+zYty@>FmFuqKx+c%= zp3D{+BjXPAj}yGvKt?eGj}xNXK4T3&DK@AzN{HYBn(EGBxMP+2B{p}D6dqni%%dg2 z#Wir0cbF2Yh=Euo%qz*F!rS<`5XjSd10LT8DEdr)sz)R@uP+$e)(hHvsd}~OxZZF> z=pfHi&RQJf0<2LeCe`0KE_VMZLtKxIY zAiL8rzZCQN2r$-Zf6$yYK!8!hSOI{kC-HLSu{~@Ysh(KUb9fe-Gibo>VO(siyXc~v zbH1TRX66Syn92U3CQ*w`N*?RF;oD@z1s9MuUt&BSbNW$~Wehva$GuOH_HymAf`t7L zlFr*zUeGr1{b~hlV)4-}VCv+u*>8OH*!bk%I>$BLbk&SNW8!em19T;3*Yigc4T&i+ z`^1C&Dpq@oL`T(q2}14Az$4wq32rAR!CejChd}mPpxA+%6%v+X-H>^T)IhCC8JYX^cCmx?o)BWL^Z zs$8{m8Q(f{8wYKMFx~$ZcFy7l(w@mzNfo)hKl$zeayWi>!i1X>g(OC8Vb4N{p+?jQTQpH)IgGKkCJ_Sz>ei!Y+p_{l8w~V3ON!V3wCOd{e2wE&kgNTkVi=NvARXR8 zA=xn|EaiX!<&4$C%SkOok^fFl*&T(Jr|EgUFr^t5*F#0+ND-Q;;%Se3PpVDsk zyxUygbjiMd{44iK22Cgg%{*+l7~tEC_sO`n|@5tgM+U@LX@;d&u^aYRZbsk zPNKRbRMMC}$=CX2yDyEGYoAnVgWvS|ETnR@kGK{YEW(kjAv^6uInN=eZyLkGm>4B7 z#Xt#R-$3$kEW$ql6h?2=q3_G zd@c4aJHzxsv}cj{ui}DM3bHb5ASZu`MUrv{x7!kyYAlz_;*zB z_YC~jwBP>iFYEpr?fuq<-`ep1)P|prrY7{!Bo>NLb6fu&tD_JfIHcnS0&OXDDN5(F6Sm~qhlF0ei6&>D^t$7=H zq?AA%V}{St*7I$u#n5D%R$$*Aiv%6#NH&qE)G)x<> z>n=S!Dv6mXoy>qJFICQzvPnt#^nMcDOusO_XJbyJfj)koByHzb=le3;m(}YZ(#}={ zsHy*ndWyJ&KNig~eM*BSb^)DQJ1qw--r~;99r%f%zppS~V%PFvrtbn%7>H>X{(z&i z?zB}1WmI+?J_vEd3n^~-Qc>3jc7**7j= z4TaM{INHzvS!ojQ`QXh_3s|V@WMrP$&-1QTkKfMCmFDHUsZ+bTq&=OFFrlShn&3(E z?KsRbg?p7VGxyf*ur}CFqz|DQGLvbSGOyf31wn%`wI_jK#D|Zh8qQ+)RPkY- z*@DAUT7<>Mop*|luOAOBtE!D0jqQ^8F?!0Sm!?Fr=6WyY3?cLB3#k%J>_)nM(EK4E z-!~vg5o1=PjcG5#>4eUJ6tF*8P+LD>j>SKV-fudIz>>6mt$bkMAJTOGoNp-222@r$ zunkI-&7W(_Km%2|Oa)RsxLtcX<1h^<1VN_%rY5bJwMi0e@g!?MCL)Y&)`Ym_My5!| zU2TR>w}WMgIWQ1auz8m(v93wpo#fQp)ecXG-@%AbX@RqB;QGspF!xT&S(NwH?l6~T z#n>6LqiA#>=8@acRUatJ@{S3h9P0kZ2zSSNNg^)@*^LPP0%aWva!g53ddf zBYlmXwfZclCsRtbVjTx{Zh-*$ToARkw^2c^(@$`i_|F87(Et-HgaePi60`>%PDUYj zLJo-Yy!tOwl~aCQP*cID3ceah=PZud7F;@wrt>gx3KnfB3R|a<^jtPE<{+fR`Hp82 z@jPXf(x_Q0?1oQ1E1zE$yEMr_-YLHJ3b{cwXe4?oa1_(0i`<_Kq;am>#Y~4NW)|t| zm1RQ^3bWz#S3^RMv3Vo9i<1jP+%a8Pbb-r&1jIsYVNG1WYAIuthmk!u_wlETe;bOR zd%#P_I7Q-Kh6{^J@Y!#CxMOI&)7sZboUIti??2O&Xk7Yy2wAul6#_%hQJeX%Eeqbh zV%k!G*;WZ@I6HxYqpBCV9XZbSCXaCx&IhaWA?pmJ!z_*^V_xM}%VPVJ{`v=t1C^9s z7%1{OI8tq}K-=n}BW9&ffVc4VdrDS_F>6rsc)AqT#kXRaP&Sg&lQyIf!{Rb+l*I8| zw?l~n(OA#R2zupB4m+eR9JSWv`~9*eSlg#6461WL*hLz}VN@q?sz zOB+A#b?%IW1tasW;wp-vk!nNNj+vmA>5^TtyAP|dg(^hH_r^R^i)SzR4W^=QbEOIU zC|51CN6e%%c2TY{24I<1E?)qKL`lba1oJC`i;nx9GJwl)LlYFpn*uUU*_ ziNXtT`cE`P7OF%g<^)* zLO+5l(F_~4GtJ1NV0BskP&$WxYQ*k=$d>c#9pW)5hHv`Aj)_k8ZT4tsHx#152?{SN z_W79^NUs+Kaqh2;fpe)#&FxR`M9XrmN$y7#Af-*AM%S`Gt8XD%X1UM(5?KF+{hG&= zSyNM1&dcx!b#a;6!;=DVWdrsaJ!Z2_(rGYm-FHbA9LrEysIAu#`r+fB$zFdf%C~EP z^-gxB)QS7iVyEeTnMwn+X;8J1hM;|}hncT+Itm2re|5c$P9pKQk(-Wsi)dzkR;1405DoLFRB&oK ztK)JONH*B{)Ye&~ox}Dr+)_7A{@$5xR(f`)Bo{AyG`!r2I+4MrnJ`3G$)32tpCvc< zhO+2CJ5o--JMc8E$uCn`J$EzeH@V*g;;&|x_8qzuqEU?-ObunM^G!Hy%zot0z*v7e z86ug(7{D3$b}m{!P1{Bx3NWqFZApx#;$Fc{$6+#2(jU}~1sVyZV3O-Ek@fRK1`@p0 zy>6bZee|)j478#U2&6&tc|FJ!Kz~h{pBL08co}v#kGqIf{F4D(tv9j~w4lruchyo}j0_{6J@O*mf3ys&h z|0X)?tkZai8WgxMKfOQ<<91~7w63KG@7Y0ESf$R~7Xw1rlpM%x=Taj!>SWsuzuiy* ztnM4#X9=p3zS9#!1B8$4TVoET_^UCWy8{PnV*T`XT=A&}IP-oz=KM=&KR5yJOKg3c z{ik)|$rWErify^myU6#6fidO@3fyZ--IDhY^q;ml!fc=H@(`TK-yfAE$Ta2 z?W(7}6o1_Ctc~}2#iYxAj8#B_Nv$BEt=hCniG~c#vTm6n*8IMLA!EotdNm59ihpc> z{*PV}YaFO}uO1E&Wp2Mx=^}{WAAr<=woLUWC>g8f%|mw5+y>0$VNKM8O|f3i^WiyUJqSX2$2vnb%~)JI`opuvMEM2`#O0)wVY%~jqMKSGjSDe% zxahAut3MX8y8_rlwQ2@5{tCwz1;9SAQrNLm*t5eLG>!udz+ZL098*9K2K@l^dGpfiU^w(kd-kxLY2*!(869FQm27V zmQ!|AIw#*rzl@O%kExA8aYP~Jc1u-qsJRmkVawOJd%rMl4HR!4n=@z)r~8LqKIYXi z&Z#O~;Ex$aKB{$9RA4FA`3Hx0x1Nvq%9FoGOgVWfXoIRo+6|e~F1}kb!D<6ZbI+1I zD-7EPeWntiq41)b>L-ic+EAL{@XQ3#39m`h20gzGo$cY0Yy=r^+R)I z0ngYb6dISg11SpUuQpM>Lf65dLn+X4RC(2fu*@^*>u36`sVYSUl=#X9vHgOG!@@Ar$T3Xj3j445KStKv1_%9HO38fLz9}E z8XL{xGXfm_$;@R3-}AJ;G#^!l5V~IMTE|X&H52b1zuz=_<|{bv-!pLAP;&2ep9bfK zaxRy#bvYHX$L4f*SS6iE*O`Dj|CLtcKlq6rcztQy&4>3DZldh%0Gd8A9iu~2L7AaaMYXqUkGE4p0#Io?sN!AjwxI+XgwlgoW&fwWw+w5t z5C4a615r^?Qlvyh0SRfzfl`W;bSvFR=Rj0YN2(wl4v=PaGgMN#8>XA1!x0-S*mI$G zpugwE^Wr)F$M5(bzVVpj+V!n7KIi#8BTAZkU#70EDZX8xRllcqD6!V__-h@a_cw7M z1Xe~gaQE|NiSg4B&R5;tOz^F{dV0br%;gj38c*~PxT+FmCNv=+7}_| zKj{|o6mrJH^Ek6hwc?0Os_iU)>E4{z5~GGyBHfjF6L6;2tueNl+Z(y7HAG{2Q?q9ANr6LjUZO#{xAGC!V~u33nw40OPvXtWqoW3XGb5-a zj>g;WK8==KXHaxQJkiW*xsAn1+If)JLIzwz8 zcvyLQteDSn1+Z`|TZex}LF|i{e*Yg_t^Sk7TYyN2?G#@7( zCU6XF1}n5trg^Z!z<%1WoQ&t356#VsCrUYW#D9GzLk*jWOM6^amC=$c0Ai+Dt3l!? zv$a)qxK}2T`ct8NL6zVHaIeIYu6?f*59G+REvv*<>)-}tO35RH>^A=XY829gv)yDj zeTq5oRL-PF{*Q>lpYl&m7MS8L3uB`LR1OgEcl2NHvdso9M(*6~sDIdz(Rb44tmpc~ zWl!@AWdn=d?B@H|1sLZR#au@k;X7HvR6Z74#%_s^rp-0D11Od7SwQ03i6gUt0)gM# zq`nRvIzk1$bND5jTW|QRDwa>$d$1f=5hp&_E^e!d`MB)bPJc(8Tg2^73a|%V&Yk{XMg*?5%_*o%G+Q4U-J9$VKM~}ojs@XsDDJ%{WpdY z4ETOKDmCptv9T|2L&UBD)AYE#bmV~e-T(g2^!Gv4pWXjKRDX!)59|Jm&g}kwkUZbX zD>Jqa=oFbhV4h!Ud`_cKx7DAeqIHOh>+qBF4##1`FYe#E_Ab8vqvk0^x~%Z6OFW8N zF|)>5jP~!Yzu@>%FYMc83e?a4Sl>mK{pM|J<6|2{ZNB!<``DqQXCFx&qM>(TynpQ3 zUx$xheEi=(kC#uzQR}NWhqc@puM4d+m)>HMu|Xq(41<^opS+{ISsi$~r6eg$bZK z->`A%lZR~2?gaXl5b>m|07ODjs=gB9OnGO#b?6t`>IW!p=lK`C!%eH8OP8f^BbFQA zyRT->X}A?&BrI;6NX<16vP>&XD>uj=E8ylMPEC1Ayq8Q4Yx`VFn}hCHJK~Oflxwm} zdOckiq+N#Y=Jz{EA9Jhi-dPyLnp3T=;*|jE7h*Os0cby*GG=WGm}kj$iO<{qmk`03 zV@pSGQ<1%u%Ajx676$DHmOHG-@J&HHlXh^&qq-Mw&v zO7egL@8$4Q{q_bKcUPsYkg2Hn zOaBDGA1!RJp54=#CT&J}7A_Y^o!hOXS*~M49lJYF#+m7f?K7_CwCXpIsGH9))Gr%U zeLa?-`0A4N$y$F*nG>SMaBZg1cGTzO$(X^ouEcqkU%20qDkgVFJjlmo=2fM6@vDAT zWoV>b+5GFSdgo<`{zxvU1lsrlV#^~3z2vRfT-5VqSbdE&=`?yFv`A zXL`84rk1TaacfS3viCADH>|-GE2zbCothBXphP+yRDCK<(CqbV}YlZ$vvs&fx_GWos`>}GCnpk`J?PP%djzeD*JvglfW3!Usn<>f0J;IBf^V!tzJ zb!S^5I7Rufg5pZ4N{2$Ib!qn)bHn8xsmjvDi0oo~KxLLZucPxjTeeg!_Xj7l{fF7zRXc|F)Ly z!>L@H0@Ot1;I=8O%&6MAmozNq=C${YiK)M?psiQ;V)Us5Nu}4E8Vr0vEhNHVQ(TjT z>P0*36)h?yrM=urouDZngELMDzVsf_F=6 zbSShg6d&2b)4*qlSw^YV-M0BhR8t!j#dJv#=V-0Ed_Z}(7sYHI(+TL`Wmm@8l1EKx zrmv~!>*wj38sXN?n`(C+R0SVGkJ5mlmsSE3?yb{9Z)247`Td@}B9`q2fbknVMr_IHg%1>2?m=!YM_30N=JrDqNsp4?#M zvvZj4SVA`uD8-}ouFczbEGRjk9e2e!%v0#$E-!fE{m62}(SBC23Ear~^O8Ne zlDbP6>oUPXdqjC*C~4L!%k4QepKjpg1A6u`6~LG`Xy~WLWQ}6`3i9K>@x2w8e8e^r zr118rz~Htl7|f}0$~m*~1pNt~FAEB-uVyH%Ci~so32n|Z>$kEYi-uI(5lmDLlo03T zU@@NzE|a<%PnJQ|!7L5iC`^tns6*c}XJIpJH89J2=$MV^x2Gc>j9st$<`P47-ui?KwlPqMD19E9? z)pQgV?RY6hVL=rq7My%bl@xicbPlZQ3(Y>so=fL)Hp7GyD;_HbpF?MRBo{WNLpPY~wIeEOX9vH3eM%`b4tt&=6{N(dI4g*fS9o@hRj4;mousGs zttiYZA}G6R`jbimk<)QbAa2BiVY$pgATE~w@?p+hkG@3b;gC!k`gZ};cYJ+o{MP#$ zDbZ8AU00?yC9?eHt88i|UlgnJRW0hii%^@YNqI(Q<-aYp^%|j(CfXKnqSQ_Gs@t%< z1$}?=7eV_5IL{ZBkJp|f;_YQ_f72UR#Ut*?&RsZ>kT@(yI8KkXr2YyM*oJn$X z>JHO1{JD#E?VRJ_dkx!UTW7O+E%c%4LqWM}ih|V(F*?Z3;vx{9b zufZ7^FCC;*j}!YVlddY9<^}N^z>KSz)~-!#wh;FMSzJ|xDXDJqXt^y;Q=HfWSKQ3h zZxtH!^L-H8DpXXzxBA3-qi1-cuESN%=W?FbMByy_E2E`Yi!XR>b^f}mcu-$qIg3G4 zTmM5%YHr)^>5{-wk9M6FS#UaZSnG7?1rXlAHmx9+9W>>*{)q@B?$|amV zYt;}`rkWHqcz4!mr?^L$&r3~qPjeQZ5v67ts1e&-5*?u0LOQNxoQgfeX4A0ungd?_ zPUav6y_xsdOUTWmb6fA;2npClx$G`cj-W@5HBhlrR*|z_0u%y*843t12fuIchdN5- znN{mWpa8L&9BVrY0y{P~nrp5aC|Ozj(v3Kz{Xv8}Edi)y;fz}3R z+h>ADnuY3bn~H1`D8!a^fVCiT+P2%H`AdGUs&y-inXw}Z%^Q9rytC=`!9@E)n4o;$ zq$Xnkp;E*qXE+=Ot~m$|j;0s`YV;JQ)@%E1_vs`)aRKxA?ld+e?f9)hTR$RbM$qK$ zNbr>}xeBc<@XJ=~bF3O7kTRG~tVYBPs1QV`UVHsTR=zHGK$$OFFS8v~BF<}k-Q#J_ zavlHWh>7C@ptQ)0lfgSSakH;=#C@NDX!W{ZSLjK-+CKtAZsE!WyYFR*VlU6BrY7+T z*^jVX9KkPjTbx@Od99=by=1u2PL`~z;bw~8NTWS`t@x??`WXfsjmLAdg;Gn46^a9E z`Emw=3PdI6n57DwOt7gg+S{uakVDz2St^N_CLMEsvBSpb0kC$>I~YMShVO1UN_Z^9 zW~rp!O`_aU={>9=W;)Zm%6(VvkTNIFlOtiD_so5k(~jL^)F{juFD$p zypxJrprB6Pw&(YQpu>kD+P3rn`QPHp%3~PTNsqc6pqiLZpXT2ISQ@;5r7?snT?u;F zXlL7pd77<~NTZczIWuRP9@Z8SsvNGTWPiT>u>KvL+=;7>jQrwbQ<}oMli0;8_QF}w zK+n&x|LknQpydJ#S{?^#cIjBxCIdb~&~&D1W4(CXEo&;nN&x6n0FroTZJB<uHxA33qwn_-5X-GkM*2)^&uVGJ_+%sR|F3) z(}J&3wASe6yPR)M2R2Lr?ls=pHCS&*X@z5yImL5-=^ZJuz>&Dj#;g$q?3K&d-2ZetEI{Pk36BD{2fR8;HlTRwX-WcZx=3K zg{9G2lTMdE%zC=YEZ#Nz5#^a@G=$0wk!iWCT%}TUQ}Lj{@BwTIjH`|~Y)3K3s75}$ zap-+iY!T+QRNK^Q`?p+$Q2aX(eC%vvNA|6PJu^Og?44yhpTwQzUeiXe_micWMyW}F z`9M=YY8#ar`w_SamlO?0ZtRBRYg{{ye>NAvPe^sy^2gAZGb~m)h$-bfJS0YCWdyoc zv|JK6cdOQx_sc|v?hx1KL(129#CS=1bLu-L!=rhrPYxH>UwSJEn4K-b-!jL{oGy$@ zNYq%uBGx4o#=dnYca6(u<7i#&9p|1{nxUO({ zVedXP(7t>YFUNUK$$Ra3J9Su6>n?;YMy`@dr3`5P(BQXP7qKd6z@H+S1G}#EuEMt( z7dK6@nTXS(6fZUtXGk;Qb?DOGwjb|Rb`W>Yh~^7sNzF|V6;lu^GP<@6a^m#@GaIsH zHt~6Rfg2<7SH--r>gp^fc^QR&zcG~@j2_`9X`e&5pipuQ#~?-Du_ z;q!tSFaG)xI=qb_$**$r(6WMJzDVA;?PHZFVo5ifVFY%4yrSBy)ygj>J$<7bb*JOQfIF#E zv|O=v%uLLi`m=z;UfYPOeguUad(X-Hr-x5H_Xd+_J(WU@z6p@mG-)1GvL3 z8vtIk1#>4}(@J%nmO+ubUaeyVcL_nJnX&7LDr0z}m~jxuPwZ}LwjAe;qzkYxojl!{ zwYsx!y_bwh7pd(A26!P2e`Om!od5DEakI>BiPvLUM@r38Yt`m-mUlUh(`!;hE9s`Y zQfuXP{cKwl7SHsGu?xTtfExeCXL9kbc_9_nb%ygJ_(@?n(yMTkCb5J#a5xuJ7t{8O zp{WC$M+y&%=bSwSU_`ycXN?BjECItXk{uip!5a~2@-Z^;Iaa~5+K^a&j@GWY*WDA+ z$Z66`u<}CUdBraOJGjy#mMJ0UcHaZCFQy;-9KA66)Ln9`W-a`#ithzSvu^@=22I|t zuai-!;+M?V0Yh;>hBAWn&aoxsdqNCd_foG`?%rIkdwJdFPSTcO(^W<2r!3R~ZVyr5 z1AG8l&(l911U^4pl_vXhzs|O`?*l!kzyAE>f9;Na4+ff-lF9XF!v5`8x;o>N!J<1s z`9)kN<{8h~<9u?D`@=83peTK8AO{)LdUf?uYV>=ZS7vnCFX`lyaxZ2Wlw7>8AbFqW z@Uz)-$L(>mfx;f^F4(K$CpZF{Ps~sBS^3!7*djI?2&7l+w!K?555KLx`Ltg=`oFtD z;Bq78u^hF$;$c(G|6&AxKA{O*R}#8Yd-=6}LEkd57F%pjW5sfyaKl zL1n*J=e_H6|FaD#@qe@|{qtJj=Jn4e{Mm#b?DmHe0Gac@X%ik`k4t-wfd%J!s`CYm zz2oRDKZb%t0^sA-2gTzTQy`FVmg4p8ek16{ZS%dAf;M zJMPvrBlS|l)f^S_=BgS*i#qznbFzo|HW69gr|hWe7-;wXQ|a(VS4)ZR^Y*(yKqZ*4 z?MO@*J0PqB{{jT~X*H+B@e7%2>`a%}n9lV@`Cgs%UEDr@WBu{@hAn96aHncJWcgHd z$mVIMooDfRfFiJ&eg#ZMUE)iw@6H+}B*vopQsH=wwtOX6YNgsSaH%WVb5cKGb5a%7 z0u!hylwHoO0(Z`%^$aY|bDK6eSACj<9_PPyBnd+@mSTmQe zO;6~g5@?lBPN&h3-tYw@{L^=RPno%^Y%L62?mUYsZbIl4mSVgsgFi?gK|OvGU1(!C z4EjQGKnr^8cNVZiOu06&Hr>P`eMzDE1vdQEqbEy=lU?l@yOgctf+*y!R$psVaBx5+ zOt~+ubm*0NG)EVotg`stQ=^6qi?-C&-VEetW%g)G+|3#uWNbli_%5SSiJ2w}{sty3 z&X8bnuCJ=9>L$5n2-VxPSAg$+4yrYCs+@`{?YDTkJkMp`Kxz_4i8Gp=3$Dk$cOY~w z7qSspf_=A^W(tPfW)INW4O<{!2m&XeH=0^l#}GzdkA_T}=o|yxBf0iAopYk1_-%|# z{HHlbsvbJR&Ks|jN7M<8cW%pR3Zi5^Z8hBp>Ev_s>bYw` ziGRR{T}tJqTEdvOpSr^S?394nX&Li+WWoYvtH^8BlJweB)n9Fx+oK3;qxR;zbFNMG z+(B-Wej`{u?-^Nm$qa)w>rl-*Z@BwZ^%;UoA$dYWYz>=q0Io>rTqI;ze5yI&HnqK~ z-NR_;@XFz1xBd3Us3VyvxM^w50hgAu&blceO|CdoNdnU>6lYivYcQA(tUm3xeP)ac z({Egw^&_MjSam=JJ$FjZn-x}S&LYcg-3&ERs6;J|)>ri_=FS(&x?j6}tIfHG+j#c& zB`u18m=-V#oZDRzZYLuP4XiMV%o>J`{Od0;<6v?mGznAf>sN! zOOY1}S{#;(SV?#dg3I|CCY_W9@+(Y-40W42<;uBqBGOiB#B6G8gmHX=X9iHHa^#UtMJHIrF}2@%nP(VFg_<$-_k(Utq;mNMW-(FePQX$ zd2}0-Y1)mAcgm>e2#G>G@d9%pZ2^k6>Zy}i=495G*w zc?`z^oH_`UnQrI`YQStTV>U1MM!UI2M^=KWU7Q*`#;WxK<8wR=#7~Gw<#M@}`^~!L zv?jxv40WZQD!+~thQeDTLiN*v1=n`E_ypHd-A3SOeRFQCES7AsCjZ9uApy5cri)MU zSFa52n(=<2R!!;@Q4VUh9&3RGW4j!J_2Y#aOac*oQ6OO@*&REtdlFO7QzFND#9iqh zO#4ikVm>X*=Yu!9K^iN;gRe?k+*S40naTKzN9kbzLTKDC#7 zC8_6d&nX_W;N6j(uRhc;e&q%8Lgli}5JVJputnp-gyY5xXJ_yY^W8V;?ZJC)%A$h; zYc;xo=;WzUWz#UK=T5lQCDQBWur?e-k)0W2E>%)gDH=6_%JB97rakhWdp%)ba*zhd zoiHK=h>_>SFcW-D=SlNv1>TTLH<*~k&GwROz79I(J2#IRiDG5GeqWf$(I6#kD3(8g zD6fOLuHH+~1mQAqvIaem4D3o3EeK%mB3A+PdyeLQT?4wKhM7a9!v34XmYK+W5B_3) zLGI`oQUIZ~jv4Hv#9p3$kaYo>Frb(j6x7m(481lgi-i5Dh%4}zsopuKJl?ijpt}U2WPG$iR&f?t3tteUnkkp*9fYf7G(9(F8t4@mIHb`&M(sdt z>(G90wpy#y6*f7?B#Xf21h*^;G|{|)TyBqMWz>+B6k@~Uz$5dW-|e1*eFPW=h%Kl3 zP=6gH4Hh8(gt2jnCwBpq5gfQtz}(8iTzG*rmxR3)YMRpfeuAsNFasHylOEpeGg+S> z80R(i0vzPKqZ4i|c4ir;PZSICS`)}u3t;hkaL%F7908v1A@kbYPBCjl_(!K&yn#9E zA@l<c@rPb0(ie_JvM*c8<)q6WNnko()G8$i&AN zq_}_38krIr9{0zkI@IUSubt!x@*KywA)LuCotrj$cDmo1FKne&f~QutBX?Hx%vUO0 z{ayK`7Yldh*U6G29ICw4Ix85`5zFs1;cAtA#}2OAX@AwE0Q|tffKVxCr*V9gpT|9E z%!gdxg;C1<%Z%m^^Tyo~MUZ7Ar6=Z2@~mqJa01oSJMlFO-_rG(C)~(07R>_A(lhU5 z0LL8 zMZtl6H}KMbjqhb@NYK;N3M#B1e!?2J8nKf*PW4)dAH*9#wMnF@w_}UUWu$(NDbt(D zNsH|0;tR>^qN|GM5NK}J(bI=}PV(@BmY?iwii+#eyX>I*=*j4y4$lHU0gal)e1vYh zr`O_bl=T$^2=`6h=bNw1@B&ioJwZ2}G(5-Leul6zx>)Zbz_21st`W|6E`T+8pE7r> zR43#F4&CqmklVAyg-a#0UzaS>9$=MkE!T)Bb}2FnLc~_Gs^tR%?rrlt~%hO`JI=drmzXMC*ftDt7(pb%Qb+u0V_;!no<-1nK zq?Z~}p5DhruIKJx&RuJ11bT+b#5K&dk4CQ3`H<}br-KQ>$nM+GFfp)KU#cYv7E}u- z%pvwT_@y?9OCXKLv8h!qGTzv4>3KRNXh&HvfWTzKEy^y`{gX!LNZf{(0_$zyH10cU$+6`sB$6d#EhU3NaR{b^l z$}i|N5T~i!IdQ6u&cVcY$_4dBv4k$;Qa0Zuts%)_?}J=_F=XW_ zWJ4?qZ7SQ@-i8<#8QtrCo-+Z@fiTg>dv)iI2d?v3W^e1I&6RpLfcE*LGgPFDLbR)W zKljtosic>edZCm+X1=zz*|;QKS#K`FKk4^VrIgO+ zja*9XDy|I-TzzbT_l;&V_1<`kAYOLa9YN%SM{^fmFMtu_0KL2~C=M^^bxCjSk9d^v zjGN36G+a#CvZ*1%+*K&TdxnI;VBV~!8x)4R>GPKDK-~b+^r;PMzKoMTkIv>oXEp>P z`^%%!*NW~J9Ld=n187A%4Ue8TkGNe$@UE<7X$I)n5R~O+?#yrpJWnUkD~pe==p$F)4$WA3JC>eUFuoraUN#;Br`b#feYM0yP|KK%XjIaS*vk zpe-rg$T7cHR%#>B0Sp;MR%NTg%AA}6I=qF60&wlrmM|AaJ3Y;Tn}mn^HdRe{FYjnf zf@|G&yifMR6l~oyx)u}P6a^4ap`;DW@(lkI2-f(y%U+K&QdP=j25sBku&cMyG*X>! zJolE8#dA`t6q!`u?dRld3D~e(3lo`La+wqIil`#PU_8NGscDboV6A|Hr%yjx)LC{N zrsg#>0k3glo?kC65^GF0{xrKgW{jG)R4<4kZ!x4tuVVM~P>T&fBa45~#Dg>RKpTk2 zfXxwc6l1#?9XX&DTm<>r%E{Ul>>GOiCSdo1yl+VhBNJ;j+om!BNQ9>&AD`OoaBcad z$}j!Aiulyj8$dW4?D!lqqIBd^eD-))vNOvR*fxG)q+UP%v1NM$Er{?nI$z2=a3efD z+2+Oe@Cz-sZWl`3c`jS6hMn%sk!8SM;s`6gS=i+f&kSo^fYhuZ3kpbRr-=2vFD2?! zR$@UVMKz&o0Fp4AhI=^eqc(N=GXSiu*%fb!?h4u}=WjdWJrc^iCSHzw?)#%0 z?cc^43(v*e1-og-z9xnyDcq#5cgxU_6FM-Q_iQpaVDo(0G;&C~EefZfVJNRC0ckU& zM-w!h;ckI$&x1WtDf3)&@=ZamkAt-A(lg&n`P=AjS~ z_;_{)+K0>d)cZZOLvkocg*PDz%p54$b=xft8K2 zM0NJ9|LP|E6(Vs9fS&#D-y+MR+Si$xF0ZpPX@DdpX9Ll}02B`?T`0S4F){Ksl75Vp z4NTAob_i}>YzSmOdf_Q#&jS}72`^i$FSgjDVC0G-2j-xd8OwNmV&{n+IUqLn3k{F9 z&9}R}Xx19H5!-#SK4n~FdD+I$i)8;*cI2RNFD&?dRf!F_S;Q>D-&Y|8Jp360xK&1@ z4G6UC+-qz?BAvRrW`19@Ee`c3FB3YM&eXG(npgJ%whzpIM?FAa_%`r2=Ivz! zqQ(`szRI}lvQ>(Q+c)~I<=G;YpR=;>BV$s`HVF69!1Hr!xT>LlTS4pjbvPQkBnCqt zqT+3MuwvXjoDesaGTPKZbwEzP22%E}3>;GwQOyv{O_=Z~t{*s7O2A>$mn?AzHy`3s zgLzANrjkY_tm@sV8&!P#r*{|Hn7wQH6;^9Dc3W-J!kfLP>*4mD6kN+vb-r4AxA&Gj z1d0)omEpJZ)skIsapRu#d=|xrJT$yigl%;i@PpUgzK?ms;Fg`OLd-ZYdHRiI9y&fT z|822YY9V%jV%_gM@{c@=c@GpG?t$k*{*iA#|6s*^F}I^^_1FRS z-hW__4rtLd!KnLNn%90yYs0FUjDKnz|C9%ENkDR$2m#7-;K=tciL!wayQ-K)4k!=c z2P)dY4Udhvj^aNv`#HrjU_`44@23YO@csk#fZJ+tB|QJYxd3aDdkc)nJLS@U0E_{? zi;HT26_5nhqW^Woj{Crf)>Ees_;~go$O4wGQZA4W^s7F&Cx*a?Wlr_-2lftlAVdUM zx;<7=_qP#Mff3(2i`)IS^go;ZXS4rtrv0JpKVsw`@$g5C{E^xJs+&Iw@(&vMM@jra zBY&XZzo<3j56=FBv;VP4{uniXEXaSg#2<70kGcM@2jY)!KK`sc#;&xP;5TH?>``v2EZ zhKofR7K2$LalcCv*^a|9{#S(SaN@aKPfiRd2sKfJ{_Di~@gXGlQaDbqCV?d18v9it zPN$-s{uULPUH+F?grhc1AHMC8?d|gWh*$gBbcPQ@-0v&W z-|>_lI~+dgfywLrth6ek7O)1ChtH3JGAP9Mt-_|BLOxG*jffWTX4>EOy!88fu7_X^ zY0zm#np(2eO)k{Dl2!3jo%Giy$zw$i6>${wreSn%nqOiwpqESR9K)-skX{(x_X|ro zmIvDz0ho7zKjhMrg$ZGQ?1~m~(J=Jv>O)1Q`?0~DY9r?5oP`Tj8PFtdt)}VB%Q3k& zTEm}S-q}w&Dk|a=bTM&^I6onr7W_^*f@!GSat5;I@ObmT4mCgZX0}`+=+yashVV0K zbY0Yr;Xx#SMVMJ*rY$T@(N~L#=PD?kor?^^o9}*g@%7Zu91u)~$`mfJ+}9Dl1|b#E z8bhI7c4sD%gxsC?2Y*R& z{H=EM19f@>&(hJILB_Ur;-&_Z9$h(a=VK^dJE9onRo*^vT3%7`DKxjtO-zx%3jwyg zD4VklF3b_+XHE9q<>XK-XI={Y*Sz@g;ej3ngHerW)s&4%x2Qg1VWPfJ z^8pdrtd0ISo{bkqnu2~diav$91JfDM@JjBba&AbdurXwUu1{82ke`5le05ObH#fk= ze%8ZNuAr-7rxvvf4F^g;*vJ%e*=Tv1;0IO=>1P;pbR4zms#%<`yGTgp8N@>yn%i4W z(4yv=6sJk)doy3>Q+{3QV>w!iQKJA8r;3MkU?yEEhj?bR0Rcw982d5M_fgfjK7G#^v;;nGuM3xadIG6G&%$x}z(hz5$?UqwV! zV9KILEx?cysP=Y=`94$L_Y=Zs+1&qX;Q!=ZuA_5Fl^!pZ|N4vW{(i^OdOqy&r%jIPQniY7ygL_2?^s<~lnkA#1K)?R-iM%C>1FADhi zA>{L6Frl(Ftv>o?5DAEUOKXHkJ?RCAW}Zq`I~e115n%3 zS!pxP&yOv7f(cs@)IDR@!uTb9VqsnFI~HNBd$vUJwVL@#_4fDQl{8=7VjTYAXsQL; z7r2ut&VzpJd;&#CTL!X^9K?A>VztRMZS`_1nnQWDDv(#i9N|E2V)K=O2M~{#vJrw@ z=yV#=@$lpyWLyEfg-G-7^uN0R0sU0o2%E)muX4_Ub^oNd81Dc|Xd1Ha;*}&k9X;J0%Gh(e1lL-E%l@B{@@$nIH z@l5A8sh4O;cr4^4Z8(JlBIPV~MBw!x|B*MCl}*cfqLVYK^Ln>-isj4m@U09aOJk?pC$5+yw8*#LbLV8whz%dSVi6<<|4C zBVr93ZO?9QG_=33ZEJm-%*znqT)E}hhZ$cG!~}!9xdQzz{U<`*gGmy1i~SenKl zf`|{;$u-}F$noVGf)sd``6tys7zLsh%Uu>u{iHABki-)_{8Da31`j`n#Er18`*NPS z&M@p0=v0caaQlMo8fKgcTna7KI(E{vX^7@2;|il=(G6F@dMH@F*B$YepvLOyRQL7E zO=NP{NFRn+fI7NYyJq?)RdSWl-&zRB>U|*Swt2GP7oHPUdQ>j~HLheYS+ z!~$b`8v{XI1_hn2?b1_iO*7`#WyST=y0-Q{pV4mQCj(i0HQ#nbEwkS}&9^k;=a-Tw zNjS05pXoXZLj9eM-fsd#pnAxp{?rauoHvB!TU*}Val>Vj!>M4*tUfd3wg7iY-*_~# zAl_bSs`mp zx6!W!ZT|bU=Dh2nny0PE?b|chj08#JYs@{7)5RB~i!;$i>nVE>FR~kNM zDP^{OY$K-PVSIu&7*eV=(3r_&T2zMzd-&8^(6%Yzlvxd_?3J@PE6tRvbQXSkl^V{5 z*!_59+rz{IFIhSa5Tq=Yhkv&wvu4ZEh8=kGb~XIGv2%r;7X(8)iOfRYf8$8rB6g<@ zVty)x5BGrJT^pM2uYdp7>OYxOv{^^?Woax{JoAI|+00!nE#3$%m72L>g%N2k8N#k&b_LK$>o=egJ$ z11f{v{64pfM>UMq(Fs3YH2A@G-`Vy_`dn}O-%{-bz;$qyx6WbUubS>HW{wPa)+MGGy0Kh ztdYxBFLu2T=*D?-J^$LWXu#j*iHJFH>Vev}KV|R4@opzgw>FM~mUcb!j1Bt+ip4rd z-m@TCJM@BXq5ZxrwuI5LFKqN)9HQd6;Hp+Pg~7GYPrKj zt0QvkZ1pt3XvGKl)HKK%<)&?hAMhQE?s5UhyUA|ShjbJ3IL<=OZ7kY-uI-$ytO>ao zfRrwQ#(^u#Zv@zDH)1O-CpeDeqm-m&u2#wHfVTU5|5>p$Rr@14Mv>Tq_tuoA1vJTp#SbxHD>_s)qoTTHhyr`E)Lo;Rs(e z=5N7ZV+!cL<*?qLny`%C?i3GOunmxsOB`2cKwpa8PuY8Hv4*@KzM;kM?PpfXh3*U9 z)&UH<+hH3CT77WsB7H%-H8Vla(pt;npw)C3c;V|cL=-D^sx&in8a`pm7sn|b@A9`rD@N0)zXP;$Mgy2Bt*-&Z}ilAN$>Wa_!p+(iPV)3tn!aQ zPU9kdh0n;MnzTbt37_O);I*+Z30yJSW@2(NoQx}W{z2*wMu9>r<#Y2xKmK>oabFu2 zIlr+$w%oxiCDTGpo^3!ZUUk*4rDJDq>X|)E+ZmlxZM%D$a^wh5N5TGOJ7nsOneWVk zuU(5VW;1iluF2GnqY1%H-CC~QjpSl3Lzc*o_=O3`aLus~OZn3aOU*KkF`!R{C$IZ+ z@;BIc#)Ff!fIMWoHyZpj2m$`vi&Hr{#&5mz>@NQVd7?nwfx_M0-%>gNYYiYrTEW!c zY=N^0|JObrLT#rxz~Efu43s{&fNGBn_vmFekj6P(O4j~0XXeo18IFEfu<=Um^3*_e zFnK@qZ)-)DxHyryGbHT4wV*}f-g5|cxqnE;<-8vu>uT!tt7<&zx`c)z2I9wYk0ZDs#0CkgXRE1uH3HOuF+EZrkcqP}0BY zOr%#d5PWz`RT^ucY7*R>VUsBFyRFr)cGw(`G!}F+SYMc`_MyMO1sK3feJu1kvHHQW z@j(@8aAKxGCNxD$t5{phY|m}mbq+G0wmPI1q5fY#w4XkZ?)(oHx39L1nsf6L77%U| z%A%Q2nOwVcwE?)g;?|4dF~Fe)*&stIxjRdsCYjJAEv=q>yYQE^*V@YaDq3JcGF(Q+ z;R6RtnfzGlofBJ2qTE%J8%5`ZvV67{hjJ3s2F_^?+iKHsD7K^7t-o478YooOW*p*u z{qhpjE?rBju^7O{HN;H7kwHV-r7EX%4+5GNDLF2bB%WaN?&fd1(4m`gid$@N+PIWh zk~WZ2^DR?<9a$EADFdiI6n!bx&O8VD?5P9qoGi1~*ah#@4263T! zT2fz{Y=ST$xK97ndVgy>xrENPyXKs>48ItkYhrCoFi|;BUN50&s!MV`{y*b@(x4H8XY(kqn8Gwg;H{7 zRx<@N?B=Z5twYtQdGb|dJB9T*6ayX&+$@JynJF^aRp^F0RWXD+y>&FCtG>baG{S-* z>|h%4{vvM#9L@g=YV;JUe@-*@p~5*$y7jKVEH<1Vlcuth)nm5Wv7CCYN&1ePPa)8% zVjEqZj|!sYP_SDM7PlH7Rw2+Z;pV4u?!o^!>vH7`HkH_TH&5OeLkhYPg3$xOGY644 zkH$tlf?}t;@78nXCP)`RkMng>Nl5Y^TBOs9or1KAb~&Tdv6h|hPVgj6JedD2FKmdB z>*;gki>SY#r`S6~g$w49UaRiWJh5CjUEF29GXfe$4X)VCfG3c$PNByM8?~2Xb3g4e47Y?5km`v`Ga!v|$=H~;hnp!Ey3OoZ^=$-UXv9`eSs-na^ zwELPvyPoikI?LSN-<*WUJ!$OH8MM+_wbWyBZ-u+hD$whBHn<+YHVL{5owxuJTEl8$w~Qw>dqG+m`+ zMo+EzdXgg`Mk9bTD$xAfxyTU3W{%4Ev|m#Q{|cG7($5{d;H%w2&$`&MLdD(rwHMfn zFe$|c17{6~qrU$%Fn%KHeF@e;eRy?~b2j}kRBU>JU1u0xD_D~2Tp&|_IP2=y#NQT| z{z0VpTdtT-lFa~^^Pb-vP9WE=FbiA?Y2!PXu>V6)lpB8mpS*VAd7_f$fWfPSWzhBw zLAffxt>k3v`sFt!l>ro>zl_$oUxjOj9*}wHynH(4*ZE`tUG!97*LZ%Tu!;T5L+8ej z-!c!k08FsBt)TeZh{nK(RYl^Der4Yn0Ki;oOv`=o>xfoBd%=#X?PI^S{~H9Fy=RTl j(*LTmLYye}*n1r!j^fB~8-bFef89}3S17*q;K~03G}Aft literal 0 HcmV?d00001 diff --git a/web/samples_index/web/images/loading_screen.png b/web/samples_index/web/images/loading_screen.png new file mode 100644 index 0000000000000000000000000000000000000000..17b68d181783364ec51a6ae066449ddc7ece6d24 GIT binary patch literal 94729 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

^iZ0KcUY3x9zgR~&f6w5tGCs^R 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�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