Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Experimental: switch from provider to riverpod #491

Merged
merged 1 commit into from
Feb 7, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import 'dart:io';
import 'package:connectivity_plus/connectivity_plus.dart';
import 'package:desktop_notifications/desktop_notifications.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:github/github.dart';
import 'package:gtk/gtk.dart';
import 'package:media_kit/media_kit.dart';
Expand Down Expand Up @@ -90,8 +91,10 @@ Future<void> main(List<String> args) async {
registerService(GitHub.new);

if (Platform.isLinux) {
runApp(const GtkApplication(child: YaruMusicPodApp()));
runApp(
const ProviderScope(child: GtkApplication(child: YaruMusicPodApp())),
);
} else {
runApp(const MaterialMusicPodApp());
runApp(const ProviderScope(child: MaterialMusicPodApp()));
}
}
70 changes: 11 additions & 59 deletions lib/src/app/app.dart
Original file line number Diff line number Diff line change
@@ -1,78 +1,29 @@
import 'dart:io';

import 'package:connectivity_plus/connectivity_plus.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:provider/provider.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:ubuntu_service/ubuntu_service.dart';
import 'package:yaru_widgets/yaru_widgets.dart';

import '../../app.dart';
import '../../build_context_x.dart';
import '../../constants.dart';
import '../../library.dart';
import '../../local_audio.dart';
import '../../patch_notes.dart';
import '../../player.dart';
import '../../podcasts.dart';
import '../../radio.dart';
import '../external_path/external_path_service.dart';
import '../settings/settings_model.dart';
import 'connectivity_notifier.dart';
import 'master_detail_page.dart';

class App extends StatefulWidget {
class App extends ConsumerStatefulWidget {
const App({super.key});

static Widget create() {
return MultiProvider(
providers: [
ChangeNotifierProvider(
create: (_) => AppModel(),
),
ChangeNotifierProvider(
create: (_) => RadioModel(getService<RadioService>()),
),
ChangeNotifierProvider(
create: (_) => PlayerModel(
service: getService<PlayerService>(),
),
),
ChangeNotifierProvider(
create: (_) => LocalAudioModel(
localAudioService: getService<LocalAudioService>(),
libraryService: getService<LibraryService>(),
),
),
ChangeNotifierProvider(
create: (_) => LibraryModel(getService<LibraryService>()),
),
ChangeNotifierProvider(
create: (_) => SettingsModel(
libraryService: getService<LibraryService>(),
)..init(),
),
ChangeNotifierProvider(
create: (_) => PodcastModel(
getService<PodcastService>(),
getService<LibraryService>(),
),
),
ChangeNotifierProvider(
create: (_) => ConnectivityNotifier(
getService<Connectivity>(),
),
),
],
child: const App(),
);
}

@override
State<App> createState() => _AppState();
ConsumerState<App> createState() => _AppState();
}

class _AppState extends State<App> with WidgetsBindingObserver {
class _AppState extends ConsumerState<App> with WidgetsBindingObserver {
String? _countryCode;

@override
Expand All @@ -84,10 +35,10 @@ class _AppState extends State<App> with WidgetsBindingObserver {
_countryCode = WidgetsBinding.instance.platformDispatcher.locale.countryCode
?.toLowerCase();

final libraryModel = context.read<LibraryModel>();
final playerModel = context.read<PlayerModel>();
final libraryModel = ref.read(libraryModelProvider);
final playerModel = ref.read(playerModelProvider);

final connectivityNotifier = context.read<ConnectivityNotifier>();
final connectivityNotifier = ref.read(connectivityNotifierProvider);

final extPathService = getService<ExternalPathService>();

Expand Down Expand Up @@ -128,7 +79,7 @@ class _AppState extends State<App> with WidgetsBindingObserver {
@override
Future<void> didChangeAppLifecycleState(AppLifecycleState state) async {
if (state == AppLifecycleState.paused) {
await context.read<LibraryModel>().safeStates();
await ref.read(libraryModelProvider).safeStates();
}
}

Expand All @@ -137,9 +88,10 @@ class _AppState extends State<App> with WidgetsBindingObserver {
final playerToTheRight = context.m.size.width > kSideBarThreshHold;

// AppModel
final isFullScreen = context.select((AppModel m) => m.fullScreen);
final isFullScreen =
ref.watch(appModelProvider.select((value) => value.fullScreen));

final playerModel = context.read<PlayerModel>();
final playerModel = ref.read(playerModelProvider);

return KeyboardListener(
focusNode: FocusNode(),
Expand Down
3 changes: 3 additions & 0 deletions lib/src/app/app_model.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:safe_change_notifier/safe_change_notifier.dart';

class AppModel extends SafeChangeNotifier {
Expand All @@ -16,3 +17,5 @@ class AppModel extends SafeChangeNotifier {
notifyListeners();
}
}

final appModelProvider = ChangeNotifierProvider((ref) => AppModel());
7 changes: 7 additions & 0 deletions lib/src/app/connectivity_notifier.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
import 'dart:async';

import 'package:connectivity_plus/connectivity_plus.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:safe_change_notifier/safe_change_notifier.dart';
import 'package:ubuntu_service/ubuntu_service.dart';

class ConnectivityNotifier extends SafeChangeNotifier {
ConnectivityNotifier(this._connectivity);
Expand Down Expand Up @@ -30,3 +32,8 @@ class ConnectivityNotifier extends SafeChangeNotifier {
notifyListeners();
}
}

final connectivityNotifierProvider =
ChangeNotifierProvider<ConnectivityNotifier>((ref) {
return ConnectivityNotifier(getService<Connectivity>());
});
107 changes: 55 additions & 52 deletions lib/src/app/master_detail_page.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:yaru_widgets/yaru_widgets.dart';

import '../../build_context_x.dart';
Expand All @@ -22,62 +22,65 @@ class MasterDetailPage extends StatelessWidget {

@override
Widget build(BuildContext context) {
// Connectivity
final isOnline = context.watch<ConnectivityNotifier>().isOnline;
return Consumer(
builder: (context, ref, child) {
// Connectivity
final isOnline = ref.watch(connectivityNotifierProvider).isOnline;

// Library
final libraryModel = context.watch<LibraryModel>();
// Library
final libraryModel = ref.watch(libraryModelProvider);

final masterItems = createMasterItems(
libraryModel: libraryModel,
isOnline: isOnline,
countryCode: countryCode,
);

return YaruMasterDetailTheme(
data: YaruMasterDetailTheme.of(context).copyWith(
sideBarColor: getSideBarColor(context.t),
),
child: YaruMasterDetailPage(
navigatorKey: navigatorKey,
onSelected: (value) => libraryModel.setIndex(value ?? 0),
appBar: const HeaderBar(
style: YaruTitleBarStyle.undecorated,
title: Text('MusicPod'),
actions: [
Padding(
padding: EdgeInsets.only(right: 10),
child: SettingsButton(),
final masterItems = createMasterItems(
libraryModel: libraryModel,
isOnline: isOnline,
countryCode: countryCode,
);
return YaruMasterDetailTheme(
data: YaruMasterDetailTheme.of(context).copyWith(
sideBarColor: getSideBarColor(context.t),
),
child: YaruMasterDetailPage(
navigatorKey: navigatorKey,
onSelected: (value) => libraryModel.setIndex(value ?? 0),
appBar: const HeaderBar(
style: YaruTitleBarStyle.undecorated,
title: Text('MusicPod'),
actions: [
Padding(
padding: EdgeInsets.only(right: 10),
child: SettingsButton(),
),
],
),
layoutDelegate: const YaruMasterFixedPaneDelegate(
paneWidth: 250,
),
breakpoint: kMasterDetailBreakPoint,
controller: YaruPageController(
length: libraryModel.totalListAmount,
initialIndex: libraryModel.index ?? 0,
),
],
),
layoutDelegate: const YaruMasterFixedPaneDelegate(
paneWidth: 250,
),
breakpoint: kMasterDetailBreakPoint,
controller: YaruPageController(
length: libraryModel.totalListAmount,
initialIndex: libraryModel.index ?? 0,
),
tileBuilder: (context, index, selected, availableWidth) {
final item = masterItems[index];
tileBuilder: (context, index, selected, availableWidth) {
final item = masterItems[index];

return MasterTile(
pageId: item.pageId,
libraryModel: libraryModel,
selected: selected,
title: item.titleBuilder(context),
subtitle: item.subtitleBuilder?.call(context),
leading: item.iconBuilder?.call(
context,
selected,
return MasterTile(
pageId: item.pageId,
libraryModel: libraryModel,
selected: selected,
title: item.titleBuilder(context),
subtitle: item.subtitleBuilder?.call(context),
leading: item.iconBuilder?.call(
context,
selected,
),
);
},
pageBuilder: (context, index) => YaruDetailPage(
body: masterItems[index].pageBuilder(context),
),
);
},
pageBuilder: (context, index) => YaruDetailPage(
body: masterItems[index].pageBuilder(context),
),
),
),
);
},
);
}
}
2 changes: 1 addition & 1 deletion lib/src/app/musicpod.dart
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ class _MusicPodAppState extends State<MusicPodApp> {
localizationsDelegates: AppLocalizations.localizationsDelegates,
supportedLocales: supportedLocales,
onGenerateTitle: (context) => 'MusicPod',
home: initialized ? App.create() : const SplashScreen(),
home: initialized ? const App() : const SplashScreen(),
scrollBehavior: const MaterialScrollBehavior().copyWith(
dragDevices: {
PointerDeviceKind.mouse,
Expand Down
35 changes: 19 additions & 16 deletions lib/src/common/audio_page.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:yaru_widgets/yaru_widgets.dart';

import '../../app.dart';
Expand Down Expand Up @@ -67,9 +67,6 @@ class AudioPage extends StatelessWidget {

@override
Widget build(BuildContext context) {
final showWindowControls =
context.select((AppModel a) => a.showWindowControls);

final body = AudioPageBody(
key: ValueKey(audios?.length),
pageId: pageId,
Expand Down Expand Up @@ -100,18 +97,24 @@ class AudioPage extends StatelessWidget {
showControlPanel: showControlPanel,
);

return YaruDetailPage(
key: ValueKey(pageId),
appBar: HeaderBar(
style: showWindowControls
? YaruTitleBarStyle.normal
: YaruTitleBarStyle.undecorated,
title: isMobile ? null : (title ?? Text(headerTitle ?? pageId)),
leading: Navigator.canPop(context)
? const NavBackButton()
: const SizedBox.shrink(),
),
body: body,
return Consumer(
builder: (context, ref, _) {
final showWindowControls =
ref.watch(appModelProvider.select((m) => m.showWindowControls));
return YaruDetailPage(
key: ValueKey(pageId),
appBar: HeaderBar(
style: showWindowControls
? YaruTitleBarStyle.normal
: YaruTitleBarStyle.undecorated,
title: isMobile ? null : (title ?? Text(headerTitle ?? pageId)),
leading: Navigator.canPop(context)
? const NavBackButton()
: const SizedBox.shrink(),
),
body: body,
);
},
);
}
}
Expand Down
Loading