diff --git a/lib/Screens/FormulaYou/home.dart b/lib/Screens/FormulaYou/home.dart index 34177098..9c23fb72 100644 --- a/lib/Screens/FormulaYou/home.dart +++ b/lib/Screens/FormulaYou/home.dart @@ -79,7 +79,7 @@ class _PersonalizedHomeScreenState extends State { backgroundColor: useDarkMode ? Theme.of(context).scaffoldBackgroundColor : Colors.white, - body: NewsFeedWidget( + body: NewsFeed( tagId: selectedTagsIds.join(','), ), ); diff --git a/lib/Screens/article.dart b/lib/Screens/article.dart index 9caee1fc..21759ed0 100644 --- a/lib/Screens/article.dart +++ b/lib/Screens/article.dart @@ -18,7 +18,7 @@ */ import 'package:boxbox/api/article_parts.dart'; -import 'package:boxbox/api/news.dart'; +import 'package:boxbox/api/formula1.dart'; import 'package:boxbox/helpers/loading_indicator_util.dart'; import 'package:boxbox/helpers/request_error.dart'; import 'package:flutter/material.dart'; @@ -117,7 +117,7 @@ class _ArticleScreenState extends State { class ArticleProvider extends StatelessWidget { Future
getArticleData( String articleId, Function updateArticleTitle) async { - Article article = await F1NewsFetcher().getArticleData(articleId); + Article article = await Formula1().getArticleData(articleId); updateArticleTitle(article.articleName); return article; } diff --git a/lib/Screens/circuit.dart b/lib/Screens/circuit.dart index 7e84d6e4..68a0600d 100644 --- a/lib/Screens/circuit.dart +++ b/lib/Screens/circuit.dart @@ -23,10 +23,11 @@ import 'package:boxbox/Screens/article.dart'; import 'package:boxbox/Screens/race_details.dart'; import 'package:boxbox/api/ergast.dart'; import 'package:boxbox/api/event_tracker.dart'; -import 'package:boxbox/api/news.dart'; +import 'package:boxbox/api/formula1.dart'; import 'package:boxbox/api/race_components.dart'; import 'package:boxbox/helpers/convert_ergast_and_formula_one.dart'; import 'package:boxbox/helpers/loading_indicator_util.dart'; +import 'package:boxbox/helpers/news.dart'; import 'package:boxbox/helpers/racetracks_url.dart'; import 'package:boxbox/helpers/request_error.dart'; import 'package:boxbox/Screens/circuit_map_screen.dart'; @@ -38,7 +39,7 @@ import 'package:flutter_markdown/flutter_markdown.dart'; import 'package:hive_flutter/hive_flutter.dart'; import 'package:url_launcher/url_launcher.dart'; -class CircuitScreen extends StatefulWidget { +class CircuitScreen extends StatelessWidget { final Race race; final bool? isFetched; @@ -48,14 +49,8 @@ class CircuitScreen extends StatefulWidget { this.isFetched, }) : super(key: key); - @override - State createState() => _CircuitScreenState(); -} - -class _CircuitScreenState extends State { @override Widget build(BuildContext context) { - final Race race = widget.race; bool useDarkMode = Hive.box('settings').get('darkMode', defaultValue: true) as bool; bool useDataSaverMode = Hive.box('settings') @@ -64,7 +59,7 @@ class _CircuitScreenState extends State { backgroundColor: useDarkMode ? Theme.of(context).scaffoldBackgroundColor : Colors.white, - body: widget.isFetched ?? true + body: isFetched ?? true ? NestedScrollView( headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) { diff --git a/lib/Screens/driver_details.dart b/lib/Screens/driver_details.dart index 19d9f337..d04ad7ba 100644 --- a/lib/Screens/driver_details.dart +++ b/lib/Screens/driver_details.dart @@ -20,10 +20,11 @@ import 'package:boxbox/Screens/race_details.dart'; import 'package:boxbox/api/driver_components.dart'; import 'package:boxbox/api/ergast.dart'; -import 'package:boxbox/api/news.dart'; +import 'package:boxbox/api/formula1.dart'; import 'package:boxbox/helpers/convert_ergast_and_formula_one.dart'; import 'package:boxbox/helpers/custom_physics.dart'; import 'package:boxbox/helpers/driver_result_item.dart'; +import 'package:boxbox/helpers/news.dart'; import 'package:boxbox/scraping/formula_one.dart'; import 'package:carousel_slider/carousel_slider.dart'; import 'package:flutter/foundation.dart'; @@ -34,7 +35,7 @@ import 'package:boxbox/helpers/driver_image.dart'; import 'package:boxbox/helpers/loading_indicator_util.dart'; import 'package:boxbox/helpers/request_error.dart'; -class DriverDetailsScreen extends StatefulWidget { +class DriverDetailsScreen extends StatelessWidget { final String driverId; final String givenName; final String familyName; @@ -45,11 +46,6 @@ class DriverDetailsScreen extends StatefulWidget { super.key, }); - @override - State createState() => _DriverDetailsScreenState(); -} - -class _DriverDetailsScreenState extends State { @override Widget build(BuildContext context) { bool useDarkMode = @@ -59,7 +55,7 @@ class _DriverDetailsScreenState extends State { child: Scaffold( appBar: AppBar( title: Text( - '${widget.givenName} ${widget.familyName.toUpperCase()}', + '${givenName} ${familyName.toUpperCase()}', style: const TextStyle( fontWeight: FontWeight.w600, ), @@ -91,8 +87,8 @@ class _DriverDetailsScreenState extends State { : Colors.white, body: TabBarView( children: [ - DriverInfo(widget.driverId), - DriverResults(widget.driverId), + DriverInfo(driverId), + DriverResults(driverId), ], ), ), @@ -404,7 +400,7 @@ class DriverDetailsFragment extends StatelessWidget { ), itemCount: driverDetails[1].length, itemBuilder: (context, index) => FutureBuilder
( - future: F1NewsFetcher().getArticleData( + future: Formula1().getArticleData( driverDetails[1][index][0], ), builder: (context, snapshot) { diff --git a/lib/Screens/grand_prix_running_details.dart b/lib/Screens/grand_prix_running_details.dart index 00b80b78..5df86434 100644 --- a/lib/Screens/grand_prix_running_details.dart +++ b/lib/Screens/grand_prix_running_details.dart @@ -38,25 +38,21 @@ import 'package:sliding_up_panel/sliding_up_panel.dart'; import 'package:syncfusion_flutter_pdfviewer/pdfviewer.dart'; import 'package:url_launcher/url_launcher.dart'; -class GrandPrixRunningScreen extends StatefulWidget { +class GrandPrixRunningScreen extends StatelessWidget { final Event event; const GrandPrixRunningScreen( this.event, { Key? key, }) : super(key: key); - @override - State createState() => _GrandPrixRunningScreenState(); -} -class _GrandPrixRunningScreenState extends State { @override Widget build(BuildContext context) { bool useDarkMode = Hive.box('settings').get('darkMode', defaultValue: true) as bool; late String meetingName; - widget.event.meetingName == 'United States' + event.meetingName == 'United States' ? meetingName = 'USA' - : meetingName = widget.event.meetingName; + : meetingName = event.meetingName; if (meetingName != 'Great Britain') { meetingName = meetingName.replaceAll(' ', '_'); } @@ -69,10 +65,10 @@ class _GrandPrixRunningScreenState extends State { child: MediaQuery.of(context).size.width > 1000 ? Padding( padding: const EdgeInsets.only(top: 15), - child: Text(widget.event.meetingOfficialName), + child: Text(event.meetingOfficialName), ) : Marquee( - text: widget.event.meetingOfficialName, + text: event.meetingOfficialName, pauseAfterRound: const Duration(seconds: 1), startAfter: const Duration(seconds: 1), velocity: 85, @@ -222,7 +218,7 @@ class _GrandPrixRunningScreenState extends State { alignment: Alignment.bottomCenter, ), Text( - widget.event.meetingName.toUpperCase(), + event.meetingName.toUpperCase(), style: const TextStyle( color: Colors.white, fontSize: 70, @@ -249,29 +245,29 @@ class _GrandPrixRunningScreenState extends State { mainAxisSize: MainAxisSize.min, children: [ SessionItem( - widget.event.session5, - widget.event.raceId, - widget.event.meetingCountryName, + event.session5, + event.raceId, + event.meetingCountryName, ), SessionItem( - widget.event.session4, - widget.event.raceId, - widget.event.meetingCountryName, + event.session4, + event.raceId, + event.meetingCountryName, ), SessionItem( - widget.event.session3, - widget.event.raceId, - widget.event.meetingCountryName, + event.session3, + event.raceId, + event.meetingCountryName, ), SessionItem( - widget.event.session2, - widget.event.raceId, - widget.event.meetingCountryName, + event.session2, + event.raceId, + event.meetingCountryName, ), SessionItem( - widget.event.session1, - widget.event.raceId, - widget.event.meetingCountryName, + event.session1, + event.raceId, + event.meetingCountryName, ), ], ), @@ -333,7 +329,7 @@ class _GrandPrixRunningScreenState extends State { '', '', '', - widget.event.circuitImage + event.circuitImage .split('/') .last .split('.')[0], @@ -430,29 +426,29 @@ class _GrandPrixRunningScreenState extends State { fit: BoxFit.scaleDown, ), SessionItem( - widget.event.session5, - widget.event.raceId, - widget.event.meetingCountryName, + event.session5, + event.raceId, + event.meetingCountryName, ), SessionItem( - widget.event.session4, - widget.event.raceId, - widget.event.meetingCountryName, + event.session4, + event.raceId, + event.meetingCountryName, ), SessionItem( - widget.event.session3, - widget.event.raceId, - widget.event.meetingCountryName, + event.session3, + event.raceId, + event.meetingCountryName, ), SessionItem( - widget.event.session2, - widget.event.raceId, - widget.event.meetingCountryName, + event.session2, + event.raceId, + event.meetingCountryName, ), SessionItem( - widget.event.session1, - widget.event.raceId, - widget.event.meetingCountryName, + event.session1, + event.raceId, + event.meetingCountryName, ), Padding( padding: const EdgeInsets.symmetric( @@ -510,7 +506,7 @@ class _GrandPrixRunningScreenState extends State { '', '', '', - widget.event.circuitImage + event.circuitImage .split('/') .last .split('.')[0], @@ -581,23 +577,13 @@ class _GrandPrixRunningScreenState extends State { } } -class PdfViewer extends StatefulWidget { +class PdfViewer extends StatelessWidget { final String documentTitle; final String src; - const PdfViewer(this.src, this.documentTitle, {Key? key}) : super(key: key); - - @override - State createState() => _PdfViewerState(); -} + PdfViewer(this.src, this.documentTitle, {Key? key}) : super(key: key); -class _PdfViewerState extends State { final GlobalKey _pdfViewerKey = GlobalKey(); - @override - void initState() { - super.initState(); - } - @override Widget build(BuildContext context) { const String defaultServer = "https://api.formula1.com"; @@ -606,14 +592,14 @@ class _PdfViewerState extends State { return Scaffold( appBar: AppBar( title: Text( - widget.documentTitle, + documentTitle, overflow: TextOverflow.ellipsis, ), ), body: SfPdfViewer.network( server != defaultServer - ? "$server/documents/${widget.src.split('/').last}" - : widget.src, + ? "$server/documents/${src.split('/').last}" + : src, key: _pdfViewerKey, enableTextSelection: true, onDocumentLoadFailed: (PdfDocumentLoadFailedDetails details) { @@ -646,7 +632,7 @@ class _PdfViewerState extends State { } } -class SessionItem extends StatefulWidget { +class SessionItem extends StatelessWidget { final Session session; final String raceId; final String meetingCountryName; @@ -657,11 +643,7 @@ class SessionItem extends StatefulWidget { this.meetingCountryName, { Key? key, }) : super(key: key); - @override - State createState() => _SessionItemState(); -} -class _SessionItemState extends State { @override Widget build(BuildContext context) { Map sessionsAbbreviations = { @@ -689,21 +671,21 @@ class _SessionItemState extends State { ]; bool useDarkMode = Hive.box('settings').get('darkMode', defaultValue: true) as bool; - String startTimeHour = widget.session.startTime.hour.toString(); - String startTimeMinute = widget.session.startTime.minute.toString(); - String endTimeHour = widget.session.endTime.hour.toString(); - String endTimeMinute = widget.session.endTime.minute.toString(); - if (widget.session.startTime.hour < 10) { - startTimeHour = '0${widget.session.startTime.hour}'; + String startTimeHour = session.startTime.hour.toString(); + String startTimeMinute = session.startTime.minute.toString(); + String endTimeHour = session.endTime.hour.toString(); + String endTimeMinute = session.endTime.minute.toString(); + if (session.startTime.hour < 10) { + startTimeHour = '0${session.startTime.hour}'; } - if (widget.session.startTime.minute < 10) { - startTimeMinute = '0${widget.session.startTime.minute}'; + if (session.startTime.minute < 10) { + startTimeMinute = '0${session.startTime.minute}'; } - if (widget.session.endTime.hour < 10) { - endTimeHour = '0${widget.session.endTime.hour}'; + if (session.endTime.hour < 10) { + endTimeHour = '0${session.endTime.hour}'; } - if (widget.session.endTime.minute < 10) { - endTimeMinute = '0${widget.session.endTime.minute}'; + if (session.endTime.minute < 10) { + endTimeMinute = '0${session.endTime.minute}'; } String startTime = '$startTimeHour:$startTimeMinute'; String endTime = '$endTimeHour:$endTimeMinute'; @@ -741,7 +723,7 @@ class _SessionItemState extends State { mainAxisAlignment: MainAxisAlignment.center, children: [ Text( - widget.session.startTime.day.toString(), + session.startTime.day.toString(), style: TextStyle( color: useDarkMode ? Colors.white @@ -750,7 +732,7 @@ class _SessionItemState extends State { ), ), Text( - months[widget.session.startTime.month - 1], + months[session.startTime.month - 1], style: TextStyle( color: useDarkMode ? Colors.white @@ -782,7 +764,7 @@ class _SessionItemState extends State { children: [ Text( sessionsAbbreviations[ - widget.session.sessionsAbbreviation], + session.sessionsAbbreviation], style: TextStyle( color: useDarkMode ? Colors.white @@ -790,7 +772,7 @@ class _SessionItemState extends State { fontSize: 20, ), ), - widget.session.endTime.isBefore(DateTime.now()) + session.endTime.isBefore(DateTime.now()) ? Row( mainAxisAlignment: MainAxisAlignment.center, @@ -822,8 +804,7 @@ class _SessionItemState extends State { ), ], ) - : widget.session.startTime - .isBefore(DateTime.now()) + : session.startTime.isBefore(DateTime.now()) ? Row( mainAxisAlignment: MainAxisAlignment.center, @@ -881,8 +862,8 @@ class _SessionItemState extends State { context, MaterialPageRoute( builder: (context) => SessionScreen( - sessionsAbbreviations[widget.session.sessionsAbbreviation], - widget.session, + sessionsAbbreviations[session.sessionsAbbreviation], + session, ), ), ), @@ -901,7 +882,7 @@ class _SessionItemState extends State { mainAxisAlignment: MainAxisAlignment.center, children: [ Text( - widget.session.startTime.day.toString(), + session.startTime.day.toString(), style: TextStyle( color: useDarkMode ? Colors.white @@ -910,7 +891,7 @@ class _SessionItemState extends State { ), ), Text( - months[widget.session.startTime.month - 1], + months[session.startTime.month - 1], style: TextStyle( color: useDarkMode ? Colors.white @@ -940,8 +921,7 @@ class _SessionItemState extends State { mainAxisAlignment: MainAxisAlignment.center, children: [ Text( - sessionsAbbreviations[ - widget.session.sessionsAbbreviation], + sessionsAbbreviations[session.sessionsAbbreviation], style: TextStyle( color: useDarkMode ? Colors.white @@ -949,7 +929,7 @@ class _SessionItemState extends State { fontSize: 20, ), ), - widget.session.endTime.isBefore(DateTime.now()) + session.endTime.isBefore(DateTime.now()) ? Row( mainAxisAlignment: MainAxisAlignment.center, children: [ @@ -980,7 +960,7 @@ class _SessionItemState extends State { ), ], ) - : widget.session.startTime.isBefore(DateTime.now()) + : session.startTime.isBefore(DateTime.now()) ? Row( mainAxisAlignment: MainAxisAlignment.center, children: [ @@ -1033,8 +1013,8 @@ class _SessionItemState extends State { context, MaterialPageRoute( builder: (context) => SessionScreen( - sessionsAbbreviations[widget.session.sessionsAbbreviation], - widget.session, + sessionsAbbreviations[session.sessionsAbbreviation], + session, ), ), ), diff --git a/lib/Screens/home.dart b/lib/Screens/home.dart index 480efb10..739741c7 100644 --- a/lib/Screens/home.dart +++ b/lib/Screens/home.dart @@ -21,18 +21,9 @@ import 'package:boxbox/helpers/live_session_status_indicator.dart'; import 'package:boxbox/helpers/news_feed_widget.dart'; import 'package:flutter/material.dart'; -class HomeScreen extends StatefulWidget { +class HomeScreen extends StatelessWidget { final ScrollController _scrollController; const HomeScreen(this._scrollController, {Key? key}) : super(key: key); - @override - State createState() => _HomeScreenState(); -} - -class _HomeScreenState extends State { - @override - void initState() { - super.initState(); - } @override Widget build(BuildContext context) { @@ -53,7 +44,7 @@ class _HomeScreenState extends State { : width > 576 ? 576 : width, - child: NewsFeedWidget(scrollController: widget._scrollController), + child: NewsFeed(scrollController: _scrollController), ), ], ), diff --git a/lib/Screens/race_details.dart b/lib/Screens/race_details.dart index 9dec2f43..d9208cd8 100644 --- a/lib/Screens/race_details.dart +++ b/lib/Screens/race_details.dart @@ -42,7 +42,7 @@ import 'package:hive_flutter/hive_flutter.dart'; import 'package:url_launcher/url_launcher.dart'; import 'package:youtube_explode_dart/youtube_explode_dart.dart'; -class RaceDetailsScreen extends StatefulWidget { +class RaceDetailsScreen extends StatelessWidget { final Race race; final bool hasSprint; final int? tab; @@ -50,14 +50,8 @@ class RaceDetailsScreen extends StatefulWidget { const RaceDetailsScreen(this.race, this.hasSprint, {Key? key, this.tab}) : super(key: key); - @override - State createState() => _RaceDetailsScreenState(); -} - -class _RaceDetailsScreenState extends State { @override Widget build(BuildContext context) { - final Race race = widget.race; bool useDarkMode = Hive.box('settings').get('darkMode', defaultValue: true) as bool; @@ -67,10 +61,10 @@ class _RaceDetailsScreenState extends State { : Colors.white, body: DefaultTabController( length: 3, - initialIndex: widget.tab != null - ? widget.tab == 10 + initialIndex: tab != null + ? tab == 10 ? 2 - : widget.tab! + : tab! : 0, child: Builder( builder: (BuildContext context) { @@ -93,7 +87,7 @@ class _RaceDetailsScreenState extends State { SliverPersistentHeader( delegate: _SliverAppBarDelegate( TabBar( - tabs: widget.hasSprint + tabs: hasSprint ? [ Tab( text: AppLocalizations.of(context)! @@ -134,13 +128,13 @@ class _RaceDetailsScreenState extends State { ), ]; }, - body: widget.hasSprint + body: hasSprint ? TabBarView( children: [ - FreePracticesResultsProvider(race, widget.hasSprint), + FreePracticesResultsProvider(race, hasSprint), DefaultTabController( length: 2, - initialIndex: widget.tab == 10 ? 1 : 0, + initialIndex: tab == 10 ? 1 : 0, child: Column( crossAxisAlignment: CrossAxisAlignment.center, children: [ @@ -167,8 +161,8 @@ class _RaceDetailsScreenState extends State { child: SingleChildScrollView( child: QualificationResultsProvider( raceUrl: - 'https://www.formula1.com/en/results.html/2023/races/${Convert().circuitIdFromErgastToFormulaOne(widget.race.circuitId)}/${Convert().circuitNameFromErgastToFormulaOne(widget.race.circuitId)}/sprint-shootout.html', - hasSprint: widget.hasSprint, + 'https://www.formula1.com/en/results.html/2023/races/${Convert().circuitIdFromErgastToFormulaOne(race.circuitId)}/${Convert().circuitNameFromErgastToFormulaOne(race.circuitId)}/sprint-shootout.html', + hasSprint: hasSprint, ), ), ), @@ -185,7 +179,7 @@ class _RaceDetailsScreenState extends State { ), DefaultTabController( length: 2, - initialIndex: widget.tab == 10 ? 1 : 0, + initialIndex: tab == 10 ? 1 : 0, child: Column( crossAxisAlignment: CrossAxisAlignment.center, children: [ @@ -214,7 +208,7 @@ class _RaceDetailsScreenState extends State { child: SingleChildScrollView( child: QualificationResultsProvider( race: race, - hasSprint: widget.hasSprint, + hasSprint: hasSprint, ), ), ), @@ -229,12 +223,12 @@ class _RaceDetailsScreenState extends State { ) : TabBarView( children: [ - FreePracticesResultsProvider(race, widget.hasSprint), + FreePracticesResultsProvider(race, hasSprint), SafeArea( child: SingleChildScrollView( child: QualificationResultsProvider( race: race, - hasSprint: widget.hasSprint, + hasSprint: hasSprint, ), ), ), @@ -438,6 +432,7 @@ class _RaceResultsProviderState extends State { race, 4, AppLocalizations.of(context)!.race, + update: setState, ); } else { return raceUrl != '' @@ -619,7 +614,20 @@ class _RaceResultsProviderState extends State { } } -class SprintResultsProvider extends StatelessWidget { +class SprintResultsProvider extends StatefulWidget { + final Race? race; + final String? raceUrl; + const SprintResultsProvider({ + Key? key, + this.race, + this.raceUrl, + }) : super(key: key); + + @override + State createState() => _SprintResultsProviderState(); +} + +class _SprintResultsProviderState extends State { Future> getSprintStandings( String round, ) async { @@ -628,29 +636,22 @@ class SprintResultsProvider extends StatelessWidget { ); } - final Race? race; - final String? raceUrl; - const SprintResultsProvider({ - Key? key, - this.race, - this.raceUrl, - }) : super(key: key); @override Widget build(BuildContext context) { bool useDarkMode = Hive.box('settings').get('darkMode', defaultValue: true) as bool; return SingleChildScrollView( child: FutureBuilder>( - future: raceUrl != null + future: widget.raceUrl != null ? FormulaOneScraper().scrapeRaceResult( '', 0, '', false, - raceUrl: raceUrl!, + raceUrl: widget.raceUrl!, ) : getSprintStandings( - race!.round, + widget.race!.round, ), builder: (context, snapshot) => snapshot.hasError ? Padding( @@ -669,9 +670,10 @@ class SprintResultsProvider extends StatelessWidget { : snapshot.hasData ? snapshot.data!.isEmpty ? SessionCountdownTimer( - race, + widget.race, 2, AppLocalizations.of(context)!.sprint, + update: setState, ) : Column( children: [ @@ -690,10 +692,11 @@ class SprintResultsProvider extends StatelessWidget { ), onTap: () async { var yt = YoutubeExplode(); - final raceYear = race!.date.split('-')[0]; + final raceYear = + widget.race!.date.split('-')[0]; final List