Skip to content

Commit

Permalink
fix unnecessary rebuilds when using ModalRoute.of() with flutter 3.19.x.
Browse files Browse the repository at this point in the history
  • Loading branch information
j-fbriere committed Apr 8, 2024
1 parent b264a9d commit ac41a05
Show file tree
Hide file tree
Showing 14 changed files with 137 additions and 96 deletions.
4 changes: 2 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ jobs:
- name: Install and set up Flutter
uses: subosito/flutter-action@v2
with:
flutter-version: '3.16.9'
flutter-version: '3.19.5'
channel: 'stable'
cache: true

Expand Down Expand Up @@ -107,7 +107,7 @@ jobs:
# - name: Install and set up Flutter
# uses: subosito/flutter-action@v2
# with:
# flutter-version: '3.16.9'
# flutter-version: '3.19.5'
# channel: 'stable'
#
# - name: Build
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ jobs:
- name: Install and set up Flutter
uses: subosito/flutter-action@v2
with:
flutter-version: '3.16.9'
flutter-version: '3.19.5'
channel: 'stable'

- name: Set up signing key
Expand Down
3 changes: 2 additions & 1 deletion lib/group/group_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import 'package:squawker/group/_settings.dart';
import 'package:squawker/ui/errors.dart';
import 'package:squawker/utils/data_service.dart';
import 'package:squawker/utils/iterables.dart';
import 'package:squawker/utils/route_util.dart';

class GroupScreenArguments {
final String id;
Expand All @@ -31,7 +32,7 @@ class GroupScreen extends StatelessWidget {

@override
Widget build(BuildContext context) {
final args = ModalRoute.of(context)!.settings.arguments as GroupScreenArguments;
final args = getNamedRouteArguments(routeGroup) as GroupScreenArguments;

return SubscriptionGroupScreen(
scrollController: ScrollController(), id: args.id, name: args.name, actions: const []);
Expand Down
14 changes: 5 additions & 9 deletions lib/home/home_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import 'package:squawker/ui/errors.dart';
import 'package:squawker/ui/physics.dart';
import 'package:squawker/utils/data_service.dart';
import 'package:squawker/utils/debounce.dart';
import 'package:squawker/utils/route_util.dart';
import 'package:pref/pref.dart';
import 'package:provider/provider.dart';
import 'package:receive_sharing_intent/receive_sharing_intent.dart';
Expand All @@ -42,7 +43,7 @@ List<Widget> createCommonAppBarActions(BuildContext context) {
return [
IconButton(
icon: const Icon(Symbols.search),
onPressed: () => Navigator.pushNamed(context, routeSearch, arguments: SearchArguments(0, focusInputOnOpen: true)),
onPressed: () => pushNamedRoute(context, routeSearch, SearchArguments(0, focusInputOnOpen: true)),
),
IconButton(
icon: const Icon(Symbols.settings),
Expand Down Expand Up @@ -105,8 +106,7 @@ class _HomeScreenState extends State<_HomeScreen> {

// Assume it's a username if there's only one segment (or two segments with the second empty, meaning the URI ends with /)
if (link.pathSegments.length == 1 || (link.pathSegments.length == 2 && link.pathSegments.last.isEmpty)) {
Navigator.pushNamed(context, routeProfile,
arguments: ProfileScreenArguments.fromScreenName(link.pathSegments.first));
pushNamedRoute(context, routeProfile, ProfileScreenArguments.fromScreenName(link.pathSegments.first));
return;
}

Expand All @@ -132,11 +132,7 @@ class _HomeScreenState extends State<_HomeScreen> {
var username = link.pathSegments[0];
var statusId = link.pathSegments[2];

Navigator.pushNamed(context, routeStatus,
arguments: StatusScreenArguments(
id: statusId,
username: username,
));
pushNamedRoute(context, routeStatus, StatusScreenArguments(id: statusId, username: username,));
return;
}

Expand All @@ -147,7 +143,7 @@ class _HomeScreenState extends State<_HomeScreen> {

// https://twitter.com/i/topics/tweet/1447290060123033601
if (segment2 == 'topics' && segment3 == 'tweet') {
Navigator.pushNamed(context, routeStatus, arguments: StatusScreenArguments(id: segment4, username: null));
pushNamedRoute(context, routeStatus, StatusScreenArguments(id: segment4, username: null));
return;
}
}
Expand Down
9 changes: 4 additions & 5 deletions lib/profile/profile.dart
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import 'package:squawker/ui/errors.dart';
import 'package:squawker/ui/physics.dart';
import 'package:squawker/user.dart';
import 'package:squawker/utils/urls.dart';
import 'package:squawker/utils/route_util.dart';
import 'package:intl/intl.dart';
import 'package:measure_size/measure_size.dart';
import 'package:pref/pref.dart';
Expand Down Expand Up @@ -59,7 +60,7 @@ class ProfileScreen extends StatelessWidget {

@override
Widget build(BuildContext context) {
final args = ModalRoute.of(context)!.settings.arguments as ProfileScreenArguments;
final args = getNamedRouteArguments(routeProfile) as ProfileScreenArguments;

return Provider(
create: (context) {
Expand Down Expand Up @@ -209,15 +210,13 @@ class _ProfileScreenBodyState extends State<ProfileScreenBody> with TickerProvid
var onTap = () async {};
if (type == '#') {
onTap = () async {
Navigator.pushNamed(context, routeSearch,
arguments: SearchArguments(1, focusInputOnOpen: false, query: full));
pushNamedRoute(context, routeSearch, SearchArguments(1, focusInputOnOpen: false, query: full));
};
}

if (type == '@') {
onTap = () async {
Navigator.pushNamed(context, routeProfile,
arguments: ProfileScreenArguments.fromScreenName(full.substring(1)));
pushNamedRoute(context, routeProfile, ProfileScreenArguments.fromScreenName(full.substring(1)));
};
}

Expand Down
3 changes: 2 additions & 1 deletion lib/search/search.dart
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import 'package:squawker/tweet/tweet.dart';
import 'package:squawker/ui/errors.dart';
import 'package:squawker/user.dart';
import 'package:squawker/utils/notifiers.dart';
import 'package:squawker/utils/route_util.dart';
import 'package:pref/pref.dart';
import 'package:provider/provider.dart';

Expand All @@ -33,7 +34,7 @@ class SearchScreen extends StatelessWidget {

@override
Widget build(BuildContext context) {
final arguments = ModalRoute.of(context)!.settings.arguments as SearchArguments;
final arguments = getNamedRouteArguments(routeSearch) as SearchArguments;

return _SearchScreen(
initialTab: arguments.initialTab, query: arguments.query, focusInputOnOpen: arguments.focusInputOnOpen);
Expand Down
3 changes: 2 additions & 1 deletion lib/status.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import 'package:squawker/generated/l10n.dart';
import 'package:squawker/profile/profile.dart';
import 'package:squawker/tweet/conversation.dart';
import 'package:squawker/ui/errors.dart';
import 'package:squawker/utils/route_util.dart';
import 'package:infinite_scroll_pagination/infinite_scroll_pagination.dart';
import 'package:pref/pref.dart';
import 'package:provider/provider.dart';
Expand All @@ -28,7 +29,7 @@ class StatusScreen extends StatelessWidget {

@override
Widget build(BuildContext context) {
final args = ModalRoute.of(context)!.settings.arguments as StatusScreenArguments;
final args = getNamedRouteArguments(routeStatus) as StatusScreenArguments;

return _StatusScreen(username: args.username, id: args.id);
}
Expand Down
3 changes: 2 additions & 1 deletion lib/subscriptions/_groups.dart
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import 'package:squawker/group/group_screen.dart';
import 'package:squawker/subscriptions/users_model.dart';
import 'package:squawker/user.dart';
import 'package:squawker/utils/ui_util.dart';
import 'package:squawker/utils/route_util.dart';
import 'package:provider/provider.dart';

Future openSubscriptionGroupDialog(BuildContext context, String? id, String name, String icon) {
Expand Down Expand Up @@ -43,7 +44,7 @@ class _SubscriptionGroupsState extends State<SubscriptionGroups> {
child: InkWell(
onTap: () {
// Open page with the group's feed
Navigator.pushNamed(context, routeGroup, arguments: GroupScreenArguments(id: id, name: name));
pushNamedRoute(context, routeGroup, GroupScreenArguments(id: id, name: name));
},
onLongPress: onLongPress,
child: Column(
Expand Down
4 changes: 2 additions & 2 deletions lib/subscriptions/_list.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import 'package:squawker/database/entities.dart';
import 'package:squawker/search/search.dart';
import 'package:squawker/subscriptions/users_model.dart';
import 'package:squawker/ui/errors.dart';
import 'package:squawker/utils/route_util.dart';
import 'package:squawker/user.dart';
import 'package:provider/provider.dart';
import 'package:squawker/generated/l10n.dart';
Expand Down Expand Up @@ -109,8 +110,7 @@ class SubscriptionUsersListState extends State<SubscriptionUsersList> {
child: FollowButton(user: user),
),
onTap: () {
Navigator.pushNamed(context, routeSearch,
arguments: SearchArguments(1, focusInputOnOpen: false, query: user.id));
pushNamedRoute(context, routeSearch, SearchArguments(1, focusInputOnOpen: false, query: user.id));
},
);
},
Expand Down
6 changes: 3 additions & 3 deletions lib/trends/_list.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import 'package:squawker/search/search.dart';
import 'package:squawker/trends/trends_model.dart';
import 'package:squawker/ui/errors.dart';
import 'package:squawker/ui/physics.dart';
import 'package:squawker/utils/route_util.dart';
import 'package:intl/intl.dart';
import 'package:provider/provider.dart';

Expand Down Expand Up @@ -76,9 +77,8 @@ class _TrendsListState extends State<TrendsList> {
numberFormat.format(trend.tweetVolume),
),
),
onTap: () => Navigator.pushNamed(context, routeSearch,
arguments:
SearchArguments(1, focusInputOnOpen: false, query: Uri.decodeQueryComponent(trend.query!))));
onTap: () => pushNamedRoute(context, routeSearch, SearchArguments(1, focusInputOnOpen: false, query: Uri.decodeQueryComponent(trend.query!)))
);
},
);
},
Expand Down
20 changes: 7 additions & 13 deletions lib/tweet/tweet.dart
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import 'package:squawker/user.dart';
import 'package:squawker/utils/data_service.dart';
import 'package:squawker/utils/iterables.dart';
import 'package:squawker/utils/misc.dart';
import 'package:squawker/utils/route_util.dart';
import 'package:squawker/utils/translation.dart';
import 'package:squawker/utils/urls.dart';
import 'package:html_unescape/html_unescape.dart';
Expand Down Expand Up @@ -108,17 +109,15 @@ class TweetTileState extends State<TweetTile> with SingleTickerProviderStateMixi
getNewEntity: (Hashtag hashtag) {
return TweetHashtag(
hashtag,
() => Navigator.pushNamed(context, routeSearch,
arguments: SearchArguments(1, focusInputOnOpen: false, query: '#${hashtag.text}')));
() => pushNamedRoute(context, routeSearch, SearchArguments(1, focusInputOnOpen: false, query: '#${hashtag.text}')));
});

entities = _populateEntities(
entities: entities,
source: tweet.entities?.userMentions,
getNewEntity: (UserMention mention) {
return TweetUserMention(mention, () {
Navigator.pushNamed(context, routeProfile,
arguments: ProfileScreenArguments(mention.idStr, mention.screenName));
pushNamedRoute(context, routeProfile, ProfileScreenArguments(mention.idStr, mention.screenName));
});
});

Expand Down Expand Up @@ -203,8 +202,7 @@ class TweetTileState extends State<TweetTile> with SingleTickerProviderStateMixi
}

void onClickOpenTweet(TweetWithCard tweet) {
Navigator.pushNamed(context, routeStatus,
arguments: StatusScreenArguments(id: tweet.idStr!, username: tweet.user!.screenName!));
pushNamedRoute(context, routeStatus, StatusScreenArguments(id: tweet.idStr!, username: tweet.user!.screenName!));
}

List<TweetTextPart> convertTextPartsToTweetEntities(List<String> parts) {
Expand Down Expand Up @@ -417,8 +415,7 @@ class TweetTileState extends State<TweetTile> with SingleTickerProviderStateMixi
if (this.tweet.retweetedStatusWithCard != null) {
retweetBanner = _TweetTileLeading(
icon: Symbols.repeat,
onTap: () => Navigator.pushNamed(context, routeProfile,
arguments: ProfileScreenArguments.fromScreenName(this.tweet.user!.screenName!)),
onTap: () => pushNamedRoute(context, routeProfile, ProfileScreenArguments.fromScreenName(this.tweet.user!.screenName!)),
children: [
TextSpan(
text: L10n.of(context)
Expand All @@ -444,8 +441,7 @@ class TweetTileState extends State<TweetTile> with SingleTickerProviderStateMixi
),
));
} else {
Navigator.pushNamed(context, routeStatus,
arguments: StatusScreenArguments(id: replyToId, username: replyTo));
pushNamedRoute(context, routeStatus, StatusScreenArguments(id: replyToId, username: replyTo));
}
},
icon: Symbols.reply_rounded,
Expand Down Expand Up @@ -586,9 +582,7 @@ class TweetTileState extends State<TweetTile> with SingleTickerProviderStateMixi
if (currentUsername != null && tweet.user!.screenName!.endsWith(currentUsername!)) {
return;
}

Navigator.pushNamed(context, routeProfile,
arguments: ProfileScreenArguments(tweet.user!.idStr, tweet.user!.screenName));
pushNamedRoute(context, routeProfile, ProfileScreenArguments(tweet.user!.idStr, tweet.user!.screenName));
},
title: Row(
children: [
Expand Down
3 changes: 2 additions & 1 deletion lib/user.dart
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import 'package:squawker/subscriptions/users_model.dart';
import 'package:multi_select_flutter/multi_select_flutter.dart';
import 'package:provider/provider.dart';
import 'package:squawker/utils/data_service.dart';
import 'package:squawker/utils/route_util.dart';

import 'group/_feed.dart';

Expand Down Expand Up @@ -96,7 +97,7 @@ class UserTile extends StatelessWidget {
child: FollowButton(user: user),
),
onTap: () {
Navigator.pushNamed(context, routeProfile, arguments: ProfileScreenArguments(user.id, user.screenName));
pushNamedRoute(context, routeProfile, ProfileScreenArguments(user.id, user.screenName));
},
);
}
Expand Down
15 changes: 15 additions & 0 deletions lib/utils/route_util.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import 'package:flutter/material.dart';
import 'package:squawker/utils/data_service.dart';

Future<dynamic> pushNamedRoute(BuildContext context, String routeName, Object? arguments) async {
DataService().map[routeName] = arguments;
return Navigator.pushNamed<dynamic>(context, routeName);
}

Object? getNamedRouteArguments(String routeName, {bool removeArgumentsFromSession = true}) {
Object? args = DataService().map[routeName];
if (removeArgumentsFromSession) {
DataService().map.remove(routeName);
}
return args;
}
Loading

0 comments on commit ac41a05

Please sign in to comment.