import 'package:audio_service/audio_service.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'downloads/downloads_screen.dart'; import 'library/category_service.dart'; import 'library/database.dart'; import 'library/favorites_screen.dart'; import 'library/library_service.dart'; import 'library/my_music_screen.dart'; import 'library/playlist_service.dart'; import 'library/search_screen.dart'; import 'player/audio_handler.dart'; import 'player/mini_player.dart'; import 'services/logger_service.dart'; import 'services/offline_mode.dart'; import 'settings/app_settings.dart'; import 'shared/theme.dart'; late final MeloAudioHandler _handler; late final MeloDb _db; late final LibraryService _library; late final PlaylistService _playlists; late final OfflineMode _offlineMode; late final CategoryService _categories; late final AppSettings _settings; Future main() async { WidgetsFlutterBinding.ensureInitialized(); await logger.init(); _db = MeloDb(); _library = LibraryService(_db); _playlists = PlaylistService(_db); _offlineMode = OfflineMode(); await _offlineMode.init(); _categories = CategoryService(_db); _settings = AppSettings(); await _settings.init(); _handler = await AudioService.init( builder: () => MeloAudioHandler(db: _db), config: const AudioServiceConfig( androidNotificationChannelId: 'de.baka.melo.audio', androidNotificationChannelName: 'Melo', androidNotificationOngoing: true, androidShowNotificationBadge: true, ), ); runApp(const MeloApp()); } class MeloApp extends StatelessWidget { const MeloApp({super.key}); @override Widget build(BuildContext context) { return MultiProvider( providers: [ Provider.value(value: _handler), Provider.value(value: _db), ChangeNotifierProvider.value(value: _library), ChangeNotifierProvider.value(value: _playlists), ChangeNotifierProvider.value(value: _offlineMode), ChangeNotifierProvider.value(value: _categories), ChangeNotifierProvider.value(value: _settings), ], child: MaterialApp( title: 'Melo', debugShowCheckedModeBanner: false, theme: MeloTheme.dark, home: const HomeShell(), ), ); } } class HomeShell extends StatefulWidget { const HomeShell({super.key}); @override State createState() => _HomeShellState(); } class _HomeShellState extends State { int _index = 0; void _goTo(int index) => setState(() => _index = index); @override Widget build(BuildContext context) { final tabs = [ MyMusicScreen( onSearchTap: () => _goTo(1), onFavoritesTap: () => _goTo(2), ), const SearchScreen(), const FavoritesScreen(), const DownloadsScreen(), ]; return Scaffold( body: Column( children: [ Expanded(child: IndexedStack(index: _index, children: tabs)), const MiniPlayer(), ], ), bottomNavigationBar: BottomNavigationBar( currentIndex: _index, onTap: _goTo, items: const [ BottomNavigationBarItem( icon: Icon(Icons.headphones), label: 'Meine Musik'), BottomNavigationBarItem(icon: Icon(Icons.search), label: 'Suche'), BottomNavigationBarItem( icon: Icon(Icons.favorite_border), label: 'Favoriten'), BottomNavigationBarItem( icon: Icon(Icons.download_outlined), label: 'Download'), ], ), ); } }