--- id: mig_guide_2_0 sidebar_position: 5 title: Migrating to 2.0 (Null-safety) --- A Migration Guide For Switching To v2.0 Of The Flutter SDK ### Overview v2.0 of the Stream Chat Flutter SDK brings along several changes - primarily making the SDK null-safe. Null safety allows your apps to run faster, with fewer errors, and with less code. Check [this link](https://flutter.dev/docs/null-safety) for more about Null Safety in Flutter. This guide is intended to enumerate and better explain the changes in the SDK. The changes will be listed by package and a concise changelog will be followed by more info. ### Changelog of `stream_chat_flutter` #### 🛑️ Breaking Changes from 1.5.4 * Migrate this package to null safety * Renamed ChannelImage to ChannelAvatar * Updated StreamChatThemeData.reactionIcons to accept custom builder * Renamed ColorTheme properties to reflect the purpose of the colors * ColorTheme.black -> ColorTheme.textHighEmphasis * ColorTheme.grey -> ColorTheme.textLowEmphasis * ColorTheme.greyGainsboro -> ColorTheme.disabled * ColorTheme.greyWhisper -> ColorTheme.borders * ColorTheme.whiteSmoke -> ColorTheme.inputBg * ColorTheme.whiteSnow -> ColorTheme.appBg * ColorTheme.white -> ColorTheme.barsBg * ColorTheme.blueAlice -> ColorTheme.linkBg * ColorTheme.accentBlue -> ColorTheme.accentPrimary * ColorTheme.accentRed -> ColorTheme.accentError * ColorTheme.accentGreen -> ColorTheme.accentInfo * ChannelListCore options property is removed in favor of individual properties *options.state -> bool state *options.watch -> bool watch *options.presence -> bool presence * UserListView options property is removed in favor of individual properties *options.presence -> bool presence * Renamed ImageHeader to GalleryHeader * Renamed ImageFooter to GalleryFooter * MessageBuilder and ParentMessageBuilder signature is now ``` typedef MessageBuilder = Widget Function( BuildContext, MessageDetails, List, MessageWidget defaultMessageWidget, ); ``` The last parameter is the default MessageWidget You can call .copyWith to customize just a subset of properties #### ✅ Added Added video compress options (frame and quality) to MessageInput TypingIndicator now has a property called parentId to show typing indicator specific to threads #493: add support for messageListView header/footer MessageWidget accepts a userAvatarBuilder Added pinMessage ui support Added MessageListView.threadSeparatorBuilder property Added MessageInput.onError property to allow error handling Added GalleryHeader/GalleryFooter theme classes #### 🐞 Fixed #483: Keyboard covers input text box when editing message Modals are shown using the nearest Navigator to make using the SDK easier in a nested navigator use case #484: messages don't update without a reload MessageListView not rendering if the user is not a member of the channel Fix MessageInput overflow when there are no actions Minor fixes and improvements ### Migrating to 2.0 for `stream_chat_flutter` :::note If you are migrating your full Flutter project to null-safety, first make sure you follow the instructions from the [official Null Safety migration guide](https://dart.dev/null-safety/migration-guide). ::: To migrate to v2.0 for `stream_chat_flutter`, first change the version of the package to the latest null-safe version. ```yaml dependencies: stream_chat_flutter: ^2.0.0 ``` Upon doing this, all breaking changes from the package will take immediate effect. Here are steps to remedy the issue: 1) Replace the offending class names with the revised class names * ChannelImage -> ChannelAvatar * ImageHeader -> GalleryHeader * ImageFooter -> GalleryFooter 2) The new version comes with revised color names since the previous names do not suit light/dark mode nomenclature. Make sure any old colors used from theme are changed over to the new theme color names: * ColorTheme.black -> ColorTheme.textHighEmphasis * ColorTheme.grey -> ColorTheme.textLowEmphasis * ColorTheme.greyGainsboro -> ColorTheme.disabled * ColorTheme.greyWhisper -> ColorTheme.borders * ColorTheme.whiteSmoke -> ColorTheme.inputBg * ColorTheme.whiteSnow -> ColorTheme.appBg * ColorTheme.white -> ColorTheme.barsBg * ColorTheme.blueAlice -> ColorTheme.linkBg * ColorTheme.accentBlue -> ColorTheme.accentPrimary * ColorTheme.accentRed -> ColorTheme.accentError * ColorTheme.accentGreen -> ColorTheme.accentInfo 3) We decided to make messages easier to customize and now supply the default implementation of the messages in the builder - so you can now customize a single parameter without having to redo the entire implementation. Please reform your builders to take into account the new format: ``` typedef MessageBuilder = Widget Function( BuildContext, MessageDetails, List, MessageWidget defaultMessageWidget, ); ``` Use `defaultMessageWidget.copyWith()` to edit any properties to make it much simpler to tweak the default implementation. ### Changelog of `stream_chat_flutter_core` #### 🛑️ Breaking Changes from 1.5.3 * Migrate this package to null safety * channelsBloc.queryChannels(), ChannelListCore options param/property is removed in favor of individual params/properties * options.state -> bool state * options.watch -> bool watch * options.presence -> bool presence * usersBloc.queryUsers(), UserListCore options param/property is removed in favor of individual params/properties * options.presence -> bool presence #### ✅ Added * Monitor connection using connectivity_plus package #### 🐞 Fixed * Minor fixes * Performance improvements ### Migrating to 2.0 for `stream_chat_flutter_core` If you are migrating your full Flutter project to null-safety, first make sure you follow the instructions from the [official Null Safety migration guide](https://dart.dev/null-safety/migration-guide). ::: To migrate to v2.0 for `stream_chat_flutter_core`, first change the version of the package to the latest null-safe version. ```yaml dependencies: stream_chat_flutter_core: ^2.0.0 ``` Upon doing this, all breaking changes from the package will take immediate effect. Here are steps to remedy the issue: :::note The major changes in `stream_chat_flutter_core` consist of changing over from a map full of options to a more type safe and sound approach by changing over to explicit parameters. ::: 1) Change over Core widget implementations by using the explicit parameters instead of the options map. Use these explicit parameters in the widget constructor instead of the option keys: * options.state -> bool state * options.watch -> bool watch * options.presence -> bool presence 2) Change over query calls in the BLoCs in the same way (change from options map to explicit parameters in the constructor) ### Changelog of `stream_chat` #### 🛑️ Breaking Changes from 1.5.3 * Migrate this package to null safety * ConnectUserWithProvider now requires tokenProvider as a required param. (Removed from the constructor) * client.disconnect() is now divided into two different functions * client.closeConnection() -> for closing user websocket connection. * client.disconnectUser() -> for disconnecting user and resetting client state. * client.devToken() now returns a Token model instead of String. * ApiError is removed in favor of StreamChatError * StreamChatError -> parent type for all the stream errors. * StreamWebSocketError -> for user websocket related errors. * StreamChatNetworkError -> for network related errors. * client.queryChannels(), channel.query() options param is removed in favor of individual params * option.state -> bool state * option.watch -> bool watch * option.presence -> bool presence * client.queryUsers() options param is removed in favor of individual params * option.presence -> bool presence * Migrate this package to null safety * Added typed filters #### 🐞 Fixed * #369: Client does not return without internet connection * several minor fixes * performance improvements #### ✅ Added * New Location enum is introduced for easily changing the client location/baseUrl. * New client.openConnection() and client.closeConnection() is introduced to connect/disconnect user ws connection. * New client.partialUpdateMessage and channel.partialUpdateMessage methods * connectWebSocket parameter in connect user calls to use the client in "connection-less" mode. #### 🔄 Changed * baseURL is now deprecated in favor of using Location to change data location.