import 'dart:async'; import 'dart:convert'; import 'dart:developer'; import 'package:flutter/material.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:home_widget/home_widget.dart'; import 'package:screenshot/screenshot.dart'; import 'package:syncfusion_flutter_calendar/calendar.dart'; import '../../model/accountData.dart'; import '../../model/timetable/timetableProps.dart'; import '../../storage/base/settingsProvider.dart'; import '../../theming/darkAppTheme.dart'; import '../../theming/lightAppTheme.dart'; import '../../view/pages/timetable/calendar.dart'; class TimetableHomeWidget { static Future<void> update(BuildContext context) async { await AccountData().waitForPopulation(); var data = TimetableProps(); var settings = SettingsProvider(); settings.waitForPopulation(); var completer = Completer(); data.addListener(() async { if(completer.isCompleted) return; if(data.primaryLoading()) return; await _generate(data, settings); completer.complete(); }); data.run(); await completer.future; } static Future<void> _generate(TimetableProps data, SettingsProvider settings) async { log('Generating widget screen...'); var screenshotController = ScreenshotController(); var calendarController = CalendarController(); calendarController.displayDate = DateTime.now().copyWith(hour: 07, minute: 00); var imageData = await screenshotController.captureFromWidget( SizedBox( height: 700, width: 300, child: Directionality( textDirection: TextDirection.ltr, child: MediaQuery( data: MediaQueryData(), child: MaterialApp( localizationsDelegates: const [ ...GlobalMaterialLocalizations.delegates, GlobalWidgetsLocalizations.delegate, ], supportedLocales: const [ Locale('de'), Locale('en'), ], locale: const Locale('de'), darkTheme: DarkAppTheme.theme, theme: LightAppTheme.theme, themeMode: settings.val().appTheme, home: ClipRRect( borderRadius: BorderRadius.circular(20), child: Scaffold( body: Calendar( controller: calendarController, timetableProps: data, settings: settings, isHomeWidget: true, ), ), ), ), ), ), ), ); HomeWidget.saveWidgetData<String>('screen', base64.encode(imageData)); HomeWidget.updateWidget(name: 'TimetableWidget'); log('Widget screen successfully updated! (${imageData.length})'); } }