♻️ Use unified root container
This commit is contained in:
		| @@ -17,6 +17,7 @@ import 'package:solian/providers/relation.dart'; | ||||
| import 'package:solian/providers/theme_switcher.dart'; | ||||
| import 'package:solian/providers/websocket.dart'; | ||||
| import 'package:solian/services.dart'; | ||||
| import 'package:solian/widgets/root_container.dart'; | ||||
| import 'package:solian/widgets/sized_container.dart'; | ||||
| import 'package:flutter_app_update/flutter_app_update.dart'; | ||||
| import 'package:version/version.dart'; | ||||
| @@ -255,8 +256,7 @@ class _BootstrapperShellState extends State<BootstrapperShell> { | ||||
|   Widget build(BuildContext context) { | ||||
|     if (_isBusy || _isErrored) { | ||||
|       return GestureDetector( | ||||
|         child: Material( | ||||
|           color: Theme.of(context).colorScheme.surface, | ||||
|         child: RootContainer( | ||||
|           child: Column( | ||||
|             mainAxisSize: MainAxisSize.max, | ||||
|             mainAxisAlignment: MainAxisAlignment.spaceAround, | ||||
|   | ||||
| @@ -4,6 +4,7 @@ import 'package:get/get.dart'; | ||||
| import 'package:intl/intl.dart'; | ||||
| import 'package:package_info_plus/package_info_plus.dart'; | ||||
| import 'package:shared_preferences/shared_preferences.dart'; | ||||
| import 'package:solian/widgets/root_container.dart'; | ||||
| import 'package:solian/widgets/sized_container.dart'; | ||||
| import 'package:url_launcher/url_launcher_string.dart'; | ||||
|  | ||||
| @@ -15,8 +16,7 @@ class AboutScreen extends StatelessWidget { | ||||
|     const denseButtonStyle = | ||||
|         ButtonStyle(visualDensity: VisualDensity(vertical: -4)); | ||||
|  | ||||
|     return Material( | ||||
|       color: Theme.of(context).colorScheme.surface, | ||||
|     return RootContainer( | ||||
|       child: SizedBox( | ||||
|         width: double.infinity, | ||||
|         child: Column( | ||||
|   | ||||
| @@ -7,6 +7,7 @@ import 'package:solian/providers/account_status.dart'; | ||||
| import 'package:solian/providers/relation.dart'; | ||||
| import 'package:solian/router.dart'; | ||||
| import 'package:solian/widgets/account/account_heading.dart'; | ||||
| import 'package:solian/widgets/root_container.dart'; | ||||
| import 'package:solian/widgets/sized_container.dart'; | ||||
| import 'package:badges/badges.dart' as badges; | ||||
|  | ||||
| @@ -49,8 +50,7 @@ class _AccountScreenState extends State<AccountScreen> { | ||||
|  | ||||
|     final AuthProvider auth = Get.find(); | ||||
|  | ||||
|     return Material( | ||||
|       color: Theme.of(context).colorScheme.surface, | ||||
|     return RootContainer( | ||||
|       child: SafeArea( | ||||
|         child: Obx(() { | ||||
|           if (auth.isAuthorized.isFalse) { | ||||
|   | ||||
| @@ -6,6 +6,7 @@ import 'package:solian/models/relations.dart'; | ||||
| import 'package:solian/providers/relation.dart'; | ||||
| import 'package:solian/theme.dart'; | ||||
| import 'package:solian/widgets/account/relative_list.dart'; | ||||
| import 'package:solian/widgets/root_container.dart'; | ||||
|  | ||||
| class FriendScreen extends StatefulWidget { | ||||
|   const FriendScreen({super.key}); | ||||
| @@ -117,8 +118,7 @@ class _FriendScreenState extends State<FriendScreen> | ||||
|  | ||||
|   @override | ||||
|   Widget build(BuildContext context) { | ||||
|     return Material( | ||||
|       color: Theme.of(context).colorScheme.surface, | ||||
|     return RootContainer( | ||||
|       child: Scaffold( | ||||
|         appBar: AppBar( | ||||
|           centerTitle: false, | ||||
|   | ||||
| @@ -6,6 +6,7 @@ import 'package:google_fonts/google_fonts.dart'; | ||||
| import 'package:solian/exceptions/request.dart'; | ||||
| import 'package:solian/exts.dart'; | ||||
| import 'package:solian/providers/auth.dart'; | ||||
| import 'package:solian/widgets/root_container.dart'; | ||||
|  | ||||
| class NotificationPreferencesScreen extends StatefulWidget { | ||||
|   const NotificationPreferencesScreen({super.key}); | ||||
| @@ -74,8 +75,7 @@ class _NotificationPreferencesScreenState | ||||
|  | ||||
|   @override | ||||
|   Widget build(BuildContext context) { | ||||
|     return Material( | ||||
|       color: Theme.of(context).colorScheme.surface, | ||||
|     return RootContainer( | ||||
|       child: Column( | ||||
|         children: [ | ||||
|           if (_isBusy) const LinearProgressIndicator().animate().scaleX(), | ||||
|   | ||||
| @@ -12,6 +12,7 @@ import 'package:solian/providers/auth.dart'; | ||||
| import 'package:solian/providers/content/attachment.dart'; | ||||
| import 'package:solian/services.dart'; | ||||
| import 'package:solian/widgets/account/account_avatar.dart'; | ||||
| import 'package:solian/widgets/root_container.dart'; | ||||
|  | ||||
| class PersonalizeScreen extends StatefulWidget { | ||||
|   const PersonalizeScreen({super.key}); | ||||
| @@ -186,8 +187,7 @@ class _PersonalizeScreenState extends State<PersonalizeScreen> { | ||||
|   Widget build(BuildContext context) { | ||||
|     const double padding = 32; | ||||
|  | ||||
|     return Material( | ||||
|       color: Theme.of(context).colorScheme.surface, | ||||
|     return RootContainer( | ||||
|       child: ListView( | ||||
|         children: [ | ||||
|           if (_isBusy) const LinearProgressIndicator().animate().scaleX(), | ||||
|   | ||||
| @@ -28,6 +28,7 @@ import 'package:solian/widgets/daily_sign/history_chart.dart'; | ||||
| import 'package:solian/widgets/posts/post_list.dart'; | ||||
| import 'package:solian/widgets/posts/post_warped_list.dart'; | ||||
| import 'package:solian/widgets/reports/abuse_report.dart'; | ||||
| import 'package:solian/widgets/root_container.dart'; | ||||
| import 'package:solian/widgets/sized_container.dart'; | ||||
|  | ||||
| class AccountProfilePage extends StatefulWidget { | ||||
| @@ -233,8 +234,7 @@ class _AccountProfilePageState extends State<AccountProfilePage> { | ||||
|       return const Center(child: CircularProgressIndicator()); | ||||
|     } | ||||
|  | ||||
|     return Material( | ||||
|       color: Theme.of(context).colorScheme.surface, | ||||
|     return RootContainer( | ||||
|       child: DefaultTabController( | ||||
|         length: 3, | ||||
|         child: NestedScrollView( | ||||
|   | ||||
| @@ -11,6 +11,7 @@ import 'package:solian/providers/content/realm.dart'; | ||||
| import 'package:solian/providers/relation.dart'; | ||||
| import 'package:solian/providers/websocket.dart'; | ||||
| import 'package:solian/services.dart'; | ||||
| import 'package:solian/widgets/root_container.dart'; | ||||
| import 'package:solian/widgets/sized_container.dart'; | ||||
| import 'package:url_launcher/url_launcher_string.dart'; | ||||
|  | ||||
| @@ -216,8 +217,7 @@ class _SignInScreenState extends State<SignInScreen> { | ||||
|  | ||||
|   @override | ||||
|   Widget build(BuildContext context) { | ||||
|     return Material( | ||||
|       color: Theme.of(context).colorScheme.surface, | ||||
|     return RootContainer( | ||||
|       child: CenteredContainer( | ||||
|         maxWidth: 360, | ||||
|         child: PageTransitionSwitcher( | ||||
|   | ||||
| @@ -3,6 +3,7 @@ import 'package:gap/gap.dart'; | ||||
| import 'package:get/get.dart'; | ||||
| import 'package:solian/exts.dart'; | ||||
| import 'package:solian/services.dart'; | ||||
| import 'package:solian/widgets/root_container.dart'; | ||||
| import 'package:solian/widgets/sized_container.dart'; | ||||
| import 'package:url_launcher/url_launcher_string.dart'; | ||||
|  | ||||
| @@ -65,8 +66,7 @@ class _SignUpScreenState extends State<SignUpScreen> { | ||||
|  | ||||
|   @override | ||||
|   Widget build(BuildContext context) { | ||||
|     return Material( | ||||
|       color: Theme.of(context).colorScheme.surface, | ||||
|     return RootContainer( | ||||
|       child: CenteredContainer( | ||||
|         maxWidth: 360, | ||||
|         child: ListView( | ||||
|   | ||||
| @@ -11,6 +11,7 @@ import 'package:solian/widgets/app_bar_leading.dart'; | ||||
| import 'package:solian/widgets/chat/call/call_controls.dart'; | ||||
| import 'package:solian/widgets/chat/call/call_participant.dart'; | ||||
| import 'package:livekit_client/livekit_client.dart' as livekit; | ||||
| import 'package:solian/widgets/root_container.dart'; | ||||
|  | ||||
| class CallScreen extends StatefulWidget { | ||||
|   final bool hideAppBar; | ||||
| @@ -197,8 +198,7 @@ class _CallScreenState extends State<CallScreen> with TickerProviderStateMixin { | ||||
|   Widget build(BuildContext context) { | ||||
|     final ChatCallProvider ctrl = Get.find(); | ||||
|  | ||||
|     return Material( | ||||
|       color: Theme.of(context).colorScheme.surface, | ||||
|     return RootContainer( | ||||
|       child: Scaffold( | ||||
|         appBar: widget.hideAppBar | ||||
|             ? null | ||||
|   | ||||
| @@ -9,6 +9,7 @@ import 'package:solian/providers/content/channel.dart'; | ||||
| import 'package:solian/router.dart'; | ||||
| import 'package:solian/theme.dart'; | ||||
| import 'package:solian/widgets/app_bar_title.dart'; | ||||
| import 'package:solian/widgets/root_container.dart'; | ||||
| import 'package:uuid/uuid.dart'; | ||||
|  | ||||
| class ChannelOrganizeArguments { | ||||
| @@ -114,8 +115,7 @@ class _ChannelOrganizeScreenState extends State<ChannelOrganizeScreen> { | ||||
|       ), | ||||
|     ]; | ||||
|  | ||||
|     return Material( | ||||
|       color: Theme.of(context).colorScheme.surface, | ||||
|     return RootContainer( | ||||
|       child: Scaffold( | ||||
|         appBar: AppBar( | ||||
|           title: AppBarTitle('channelOrganizing'.tr), | ||||
|   | ||||
| @@ -19,6 +19,7 @@ import 'package:solian/widgets/app_bar_title.dart'; | ||||
| import 'package:solian/widgets/channel/channel_list.dart'; | ||||
| import 'package:solian/widgets/chat/call/chat_call_indicator.dart'; | ||||
| import 'package:solian/widgets/current_state_action.dart'; | ||||
| import 'package:solian/widgets/root_container.dart'; | ||||
| import 'package:solian/widgets/sidebar/empty_placeholder.dart'; | ||||
|  | ||||
| class ChatScreen extends StatelessWidget { | ||||
| @@ -26,9 +27,8 @@ class ChatScreen extends StatelessWidget { | ||||
|  | ||||
|   @override | ||||
|   Widget build(BuildContext context) { | ||||
|     return Material( | ||||
|       color: Theme.of(context).colorScheme.surface, | ||||
|       child: const ChatList(), | ||||
|     return const RootContainer( | ||||
|       child: ChatList(), | ||||
|     ); | ||||
|   } | ||||
| } | ||||
| @@ -40,8 +40,7 @@ class ChatListShell extends StatelessWidget { | ||||
|  | ||||
|   @override | ||||
|   Widget build(BuildContext context) { | ||||
|     return Material( | ||||
|       color: Theme.of(context).colorScheme.surface, | ||||
|     return RootContainer( | ||||
|       child: Row( | ||||
|         children: [ | ||||
|           const SizedBox( | ||||
|   | ||||
| @@ -15,6 +15,7 @@ import 'package:solian/widgets/app_bar_leading.dart'; | ||||
| import 'package:solian/widgets/navigation/realm_switcher.dart'; | ||||
| import 'package:solian/widgets/posts/post_shuffle_swiper.dart'; | ||||
| import 'package:solian/widgets/posts/post_warped_list.dart'; | ||||
| import 'package:solian/widgets/root_container.dart'; | ||||
|  | ||||
| class ExploreScreen extends StatefulWidget { | ||||
|   const ExploreScreen({super.key}); | ||||
| @@ -56,8 +57,7 @@ class _ExploreScreenState extends State<ExploreScreen> | ||||
|   Widget build(BuildContext context) { | ||||
|     final AuthProvider auth = Get.find(); | ||||
|  | ||||
|     return Material( | ||||
|       color: Theme.of(context).colorScheme.surface, | ||||
|     return RootContainer( | ||||
|       child: Scaffold( | ||||
|         floatingActionButton: FloatingActionButton( | ||||
|           child: const Icon(Icons.add), | ||||
|   | ||||
| @@ -9,6 +9,7 @@ import 'package:solian/widgets/app_bar_leading.dart'; | ||||
| import 'package:solian/widgets/app_bar_title.dart'; | ||||
| import 'package:solian/widgets/posts/post_action.dart'; | ||||
| import 'package:solian/widgets/posts/post_owned_list.dart'; | ||||
| import 'package:solian/widgets/root_container.dart'; | ||||
|  | ||||
| class DraftBoxScreen extends StatefulWidget { | ||||
|   const DraftBoxScreen({super.key}); | ||||
| @@ -54,8 +55,7 @@ class _DraftBoxScreenState extends State<DraftBoxScreen> { | ||||
|  | ||||
|   @override | ||||
|   Widget build(BuildContext context) { | ||||
|     return Material( | ||||
|       color: Theme.of(context).colorScheme.surface, | ||||
|     return RootContainer( | ||||
|       child: Scaffold( | ||||
|         appBar: AppBar( | ||||
|           leading: AppBarLeadingButton.adaptive(context), | ||||
|   | ||||
| @@ -6,6 +6,7 @@ import 'package:solian/providers/content/posts.dart'; | ||||
| import 'package:solian/providers/last_read.dart'; | ||||
| import 'package:solian/widgets/posts/post_item.dart'; | ||||
| import 'package:solian/widgets/posts/post_replies.dart'; | ||||
| import 'package:solian/widgets/root_container.dart'; | ||||
|  | ||||
| class PostDetailScreen extends StatefulWidget { | ||||
|   final String id; | ||||
| @@ -47,8 +48,7 @@ class _PostDetailScreenState extends State<PostDetailScreen> { | ||||
|  | ||||
|   @override | ||||
|   Widget build(BuildContext context) { | ||||
|     return Material( | ||||
|       color: Theme.of(context).colorScheme.surface, | ||||
|     return RootContainer( | ||||
|       child: FutureBuilder( | ||||
|         future: getDetail(), | ||||
|         builder: (context, snapshot) { | ||||
|   | ||||
| @@ -19,6 +19,7 @@ import 'package:solian/widgets/app_bar_title.dart'; | ||||
| import 'package:solian/widgets/markdown_text_content.dart'; | ||||
| import 'package:solian/widgets/posts/post_item.dart'; | ||||
| import 'package:badges/badges.dart' as badges; | ||||
| import 'package:solian/widgets/root_container.dart'; | ||||
|  | ||||
| class PostPublishArguments { | ||||
|   final Post? edit; | ||||
| @@ -151,8 +152,7 @@ class _PostPublishScreenState extends State<PostPublishScreen> { | ||||
|       ) | ||||
|     ]; | ||||
|  | ||||
|     return Material( | ||||
|       color: Theme.of(context).colorScheme.surface, | ||||
|     return RootContainer( | ||||
|       child: Scaffold( | ||||
|         appBar: AppBar( | ||||
|           leading: AppBarLeadingButton.adaptive(context), | ||||
|   | ||||
| @@ -15,6 +15,7 @@ import 'package:solian/widgets/app_bar_leading.dart'; | ||||
| import 'package:solian/widgets/app_bar_title.dart'; | ||||
| import 'package:solian/widgets/auto_cache_image.dart'; | ||||
| import 'package:solian/widgets/current_state_action.dart'; | ||||
| import 'package:solian/widgets/root_container.dart'; | ||||
| import 'package:solian/widgets/sized_container.dart'; | ||||
|  | ||||
| class RealmListScreen extends StatefulWidget { | ||||
| @@ -58,8 +59,7 @@ class _RealmListScreenState extends State<RealmListScreen> { | ||||
|   Widget build(BuildContext context) { | ||||
|     final AuthProvider auth = Get.find(); | ||||
|  | ||||
|     return Material( | ||||
|       color: Theme.of(context).colorScheme.surface, | ||||
|     return RootContainer( | ||||
|       child: Scaffold( | ||||
|         appBar: AppBar( | ||||
|           leading: AppBarLeadingButton.adaptive(context), | ||||
|   | ||||
| @@ -13,6 +13,7 @@ import 'package:solian/router.dart'; | ||||
| import 'package:solian/theme.dart'; | ||||
| import 'package:solian/widgets/app_bar_leading.dart'; | ||||
| import 'package:solian/widgets/app_bar_title.dart'; | ||||
| import 'package:solian/widgets/root_container.dart'; | ||||
| import 'package:uuid/uuid.dart'; | ||||
|  | ||||
| class RealmOrganizeArguments { | ||||
| @@ -189,8 +190,7 @@ class _RealmOrganizeScreenState extends State<RealmOrganizeScreen> { | ||||
|  | ||||
|   @override | ||||
|   Widget build(BuildContext context) { | ||||
|     return Material( | ||||
|       color: Theme.of(context).colorScheme.surface, | ||||
|     return RootContainer( | ||||
|       child: Scaffold( | ||||
|         appBar: AppBar( | ||||
|           leading: AppBarLeadingButton.adaptive(context), | ||||
|   | ||||
| @@ -16,6 +16,7 @@ import 'package:solian/theme.dart'; | ||||
| import 'package:solian/widgets/app_bar_leading.dart'; | ||||
| import 'package:solian/widgets/channel/channel_list.dart'; | ||||
| import 'package:solian/widgets/posts/post_list.dart'; | ||||
| import 'package:solian/widgets/root_container.dart'; | ||||
|  | ||||
| class RealmViewScreen extends StatefulWidget { | ||||
|   final String alias; | ||||
| @@ -86,8 +87,7 @@ class _RealmViewScreenState extends State<RealmViewScreen> { | ||||
|  | ||||
|   @override | ||||
|   Widget build(BuildContext context) { | ||||
|     return Material( | ||||
|       color: Theme.of(context).colorScheme.surface, | ||||
|     return RootContainer( | ||||
|       child: DefaultTabController( | ||||
|         length: 2, | ||||
|         child: NestedScrollView( | ||||
|   | ||||
| @@ -12,6 +12,7 @@ import 'package:solian/providers/theme_switcher.dart'; | ||||
| import 'package:solian/router.dart'; | ||||
| import 'package:solian/theme.dart'; | ||||
| import 'package:solian/widgets/reports/abuse_report.dart'; | ||||
| import 'package:solian/widgets/root_container.dart'; | ||||
|  | ||||
| class SettingScreen extends StatefulWidget { | ||||
|   const SettingScreen({super.key}); | ||||
| @@ -75,8 +76,7 @@ class _SettingScreenState extends State<SettingScreen> { | ||||
|  | ||||
|   @override | ||||
|   Widget build(BuildContext context) { | ||||
|     return Material( | ||||
|       color: Theme.of(context).colorScheme.surface, | ||||
|     return RootContainer( | ||||
|       child: ListView( | ||||
|         children: [ | ||||
|           _buildCaptionHeader('themeColor'.tr), | ||||
|   | ||||
							
								
								
									
										15
									
								
								lib/widgets/root_container.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								lib/widgets/root_container.dart
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,15 @@ | ||||
| import 'package:flutter/material.dart'; | ||||
|  | ||||
| class RootContainer extends StatelessWidget { | ||||
|   final Widget? child; | ||||
|  | ||||
|   const RootContainer({super.key, this.child}); | ||||
|  | ||||
|   @override | ||||
|   Widget build(BuildContext context) { | ||||
|     return Material( | ||||
|       color: Theme.of(context).colorScheme.surface, | ||||
|       child: child, | ||||
|     ); | ||||
|   } | ||||
| } | ||||
| @@ -1,12 +1,12 @@ | ||||
| import 'package:flutter/material.dart'; | ||||
| import 'package:solian/widgets/root_container.dart'; | ||||
|  | ||||
| class EmptyPagePlaceholder extends StatelessWidget { | ||||
|   const EmptyPagePlaceholder({super.key}); | ||||
|  | ||||
|   @override | ||||
|   Widget build(BuildContext context) { | ||||
|     return Material( | ||||
|       color: Theme.of(context).colorScheme.surface, | ||||
|     return RootContainer( | ||||
|       child: Center( | ||||
|         child: ClipRRect( | ||||
|           borderRadius: const BorderRadius.all(Radius.circular(12)), | ||||
|   | ||||
		Reference in New Issue
	
	Block a user