Flutter 1.5.4 release notes

In addition to continuing to focus on quality and stability since the 1.2 release, the Flutter 1.5.4 stable release adds a set of new features as we approach the Google I/O conference. Further, Apple has a deadline for building against the 12.1 version of their iOS SDK, which we now do in this update. You can meet Apple’s requirements simply by pulling down the 1.5.4 stable release, building and updating your Flutter app in the Apple Store.

Also, this build sees fixes for the two regressions we saw in Flutter 1.2:

  • #28640 NoSuchMethodError: **android.view.MotionEvent.isFromSource was closed and fixed in all versions after 1.3.7
  • #28484 Widget rendering strange since Flutter update:** a change was made fixes this regression in 1.4.0

Finally, for details about other fixes and new features, read on.

Breaking Changes

Our recent survey showed that Flutter developers prefer a breaking change if it means that it improves the API and behavior of Flutter. Of course, we still make breaking changes sparingly. The following are the list of breaking changes in this release along with links to a full description of each change and how to handle it in your Flutter code.

Severe Performance and Crash Changes

In this release, we fixed several severe performance and crash issues.

  • flutter#30990: Allow profile widget builds in profile mode
  • flutter#30985: Add rrect contains microbenchmark
  • flutter#28651: Cannot execute operation because FlutterJNI is not attached to native.

iOS Changes

Supporting iOS is just as important to the Flutter team as support Android, which you can see in the huge volume of changes we’ve made in this release to make the iOS experience even better.

  • flutter#29200: Cupertino localization step 1: add an English arb file
  • flutter#29821: Cupertino localization step 1.5: fix a resource mismatch in cupertino_en.arb
  • flutter#30160: Cupertino localization 1.9: add needed singular resource for cupertino_en.arb
  • flutter#29644: Cupertino localization step 3: in-place move some material tools around to make room for cupertino
  • flutter#29650: Cupertino localization step 4: let generated date localization combine material and cupertino locales
  • flutter#29708 Cupertino localization step 5: add french arb as translated example
  • flutter#29767: Cupertino localization step 6: add a GlobalCupertinoLocalizations base class with date time formatting
  • flutter#30527: Cupertino localization step 11: add more translation clarifications in the instructions
  • flutter#28629: Make sure everything in the Cupertino page transition can be linear when back swiping
  • flutter#28001: CupertinoTextField: added ability to change placeholder color
  • flutter#29304: Include platformViewId in semantics tree for iOS
  • flutter#29946: Let CupertinoPageScaffold have tap status bar to scroll to top
  • flutter#29474: Let CupertinoTextField’s clear button also call onChanged
  • flutter#29008: Update CupertinoTextField
  • flutter#29630: Add heart shapes to CupertinoIcons
  • flutter#28597: Adjust remaining Cupertino route animations to match native
  • flutter#29407: [cupertino_icons] Add circle and circle_filled, for radio buttons.
  • flutter#29024: Fix CupertinoTabView tree re-shape on view inset change
  • flutter#28478: Support iOS devices reporting pressure data of 0
  • flutter#29987: update CupertinoSwitch documentation
  • flutter#29943: Remove unwanted gap between navigation bar and safe area’s child
  • flutter#28855: Move material iOS back swipe test to material
  • flutter#28756: Handle Cupertino back gesture interrupted by Navigator push
  • flutter#31088: Text field scroll physics
  • flutter#30946: Add some more cupertino icons
  • flutter#30521: Provide a default IconTheme in CupertinoTheme
  • flutter#30475: Trackpad mode crash fix

Material Changes

Of course, Material continues to be a priority for the Flutter team as well.

  • flutter#28290: [Material] Create a FloatingActionButton ThemeData and honor it within the FloatingActionButton (#28735)
  • flutter#29980: Fix issue with account drawer header arrow rotating when setState is called
  • flutter#29563: Avoid flickering while dragging to select text
  • flutter#29138: Update DropdownButton underline to be customizable
  • flutter#29572: DropdownButton Icon customizability
  • flutter#29183: Implement labelPadding configuration in TabBarTheme
  • flutter#21834: Add shapeBorder option on App Bar
  • flutter#28163: [Material] Add ability to set shadow color and selected shadow color for chips and for chip themes
  • flutter#27711: Make extended FAB’s icon optional
  • flutter#28159: [Material] Expand BottomNavigationBar API (reprise)
  • flutter#27973: Add extendBody parameter to Scaffold, body MediaQuery reflects BAB height
  • flutter#30390: [Material] Update slider and slider theme with new sizes, shapes, and color mappings
  • flutter#29390: Make expansion panel optionally toggle its state by tapping its header.
  • flutter#30754: [Material] Fix showDialog crasher caused by old contexts
  • flutter#30525: Fix cursor outside of input width
  • flutter#30805: Update ExpansionPanelList Samples with Scaffold Template
  • flutter#30537: Embedded images and added variations to ListTile sample code
  • flutter#30455: Prevent vertical scroll in shrine by ensuring card size fits the screen
  • flutter#29413: Fix MaterialApp’s _navigatorObserver when only builder used

Desktop Changes

Flutter has been making progress on expanding support for desktop-class input mechanisms with keyboard mappings, text selection, mouse wheels and hover along with the beginnings of desktop support in our tooling.

Framework Changes

In addition to platform specifics, we continue to push on the core of the Flutter framework.

Plugin Changes

In this release, we also have a number of changes in the Flutter plugins, including camera, Google Maps, the Web View, the image picker, the Firebase plugins and, now for use in your apps, the In-App Purchase plugin beta.

  • plugins#1477: [camera] Remove activity lifecycle
  • plugins#1022: [camera] Add serial dispatch_queue for camera plugin to avoid blocking the UI
  • plugins#1331: [connectivity] Enable fetching current Wi-Fi network’s BSSID
  • plugins#1455: [connectivity]Added integration test.
  • plugins#1377: [firebase_admob] Update documentation to add iOS Admob ID & add iOS Admob ID in example project
  • plugins#1492: [firebase_analytics] Initial integration test
  • plugins#896: [firebase-analytics] Enable setAnalyticsCollectionEnabled support for iOS
  • plugins#1159: [firebase_auth] Enable passwordless sign in
  • plugins#1487: [firebase_auth] Migrate FlutterAuthPlugin from deprecated APIs
  • plugins#1443: [firebase_core] Use Gradle BoM with firebase_core
  • plugins#1427: [firebase_crashlytics] Do not break debug log formatting.
  • plugins#1437: [firebase_crashlytics] Fix to Initialize Fabric
  • plugins#1096 :[firebase_database]Return error message from DatabaseError#toString()
  • plugins#1532: [firebase_messaging] remove obsolete docs instruction
  • plugins#1405: [firebase_messaging] Additional step for iOS
  • plugins#1353: [firebase_messaging] Update example
  • plugins#1223: [firebase_ml_vision] Fix crash when scanning URL QR-code on iOS
  • plugins#1514: [firebase_remote_config] Initial integration tests
  • plugins#815: [google_maps_flutter] adds support for custom icon from a byte array (PNG)
  • plugins#1229: [google_maps_flutter] Marker APIs are now widget based (Android)
  • plugins#1421: [in_app_purchase]make payment unified APIs
  • plugins#1380: [in_app_purchase]load purchase
  • flutter#26329: IAP: Purchase an auto-renewing subscription
  • flutter#26331: IAP: Purchase a non-renewing subscription
  • flutter#26326: IAP: Load previous purchases
  • plugins#1249: [in_app_purchase] payment queue dart ios
  • flutter#26327: IAP: Purchase an unlock
  • flutter#26328: IAP: Purchase a consumable
  • flutter#29837: Image_picker flickers when barcode_scan and image_picker are used together
  • flutter#17950: Image_picker plugin fails, if Flutter activity is killed while native one is shown
  • flutter#18700: [image_picker] Crash on Galaxy S5 and Note 4 when attempting to use the camera
  • plugins#1372: [image_picker] fix “Cancel button not visible in gallery, if camera was accessed first”
  • plugins#1471: [image_picker] Fix invalid path being returned from Google Photos
  • flutter#29422: image_picker error:Permission Denial
  • plugins#1237: [share] Changed compileSdkVersion of share plugin to 28
  • plugins#1373: [shared_preferences] Add contains method
  • plugins#1470: [video_player] Android: Added missing event.put(“event”, “completed”);
  • flutter#25329: [WebView] Allow the webview to take control when a URL is about to be loaded

Tool Changes

Last but certainly not least, we made a number of tooling changes in the core Flutter repos to improve the developer experience, particularly when it comes to improving hot reload performance (and you thought it was fast before!).

  • flutter#29693: Use source list from the compiler to track invalidated files for hot reload.
  • flutter#28152: Improve hot reload performance
  • flutter#29494: initial work on coverage generating script for tool
  • flutter#31171: Allow disabling all fingerprint caches via environment variable
  • flutter#31073: Fuchsia step 1: add SDK version file and artifact download
  • flutter#31064: Add sorting to flutter version command
  • flutter#31063: Download and handle product version of flutter patched sdk
  • flutter#31074: make flutterProject option of CoverageCollector optional
  • flutter#30818: New flag to flutter drive to skip installing fresh app on device
  • flutter#30867: Add toggle for debugProfileWidgetBuilds
  • flutter#27034: Updated package template .gitignore file
  • flutter#30115: Forward missing pub commands
  • flutter#30254: Reland: Ensure that flutter run/drive/test/update_packages only downloads required artifacts
  • flutter#30153: Allow disabling experimental commands, devices on stable branch
  • flutter#30428: Update repair command for Arch Linux

Further, the IDE plugins for Flutter have had a number of updates since the last stable release of Flutter.

Dynamic Update (aka Code Push)

As a final note, we’re nearly at the midpoint of the year, when it’s time to reassess the areas where we can have the most important, we’ve decided to drop plans for dynamic updates (aka code push) from our 2019 roadmap. If you’re interested in the reasons why, you can read the detailed explanation. Dropping this work allows us to increase our focus on quality as well as our experiments in Flutter for web and Flutter for desktop.

Full Issue List

You can see the full list of PRs committed in this release.