import 'dart:async'; import 'package:flutter/material.dart'; import 'package:photos/core/event_bus.dart'; import 'package:photos/events/opened_settings_event.dart'; import 'package:photos/models/user_details.dart'; import 'package:photos/services/user_service.dart'; class UserDetailsStateWidget extends StatefulWidget { final Widget child; const UserDetailsStateWidget({ required this.child, Key? key, }) : super(key: key); @override State createState() => UserDetailsStateWidgetState(); } class UserDetailsStateWidgetState extends State { late UserDetails? _userDetails; late StreamSubscription _openedSettingsEventSubscription; bool _isCached = true; @override void initState() { _userDetails = UserService.instance.getCachedUserDetails(); _openedSettingsEventSubscription = Bus.instance.on().listen((event) { _fetchUserDetails(); }); super.initState(); } @override void dispose() { _openedSettingsEventSubscription.cancel(); super.dispose(); } @override Widget build(BuildContext context) => InheritedUserDetails( userDetailsState: this, userDetails: _userDetails, isCached: _isCached, child: widget.child, ); void _fetchUserDetails() async { _userDetails = await UserService.instance.getUserDetailsV2( memoryCount: true, shouldCache: true, ); _isCached = false; if (mounted) { setState(() {}); } } } class InheritedUserDetails extends InheritedWidget { final UserDetailsStateWidgetState userDetailsState; final UserDetails? userDetails; final bool isCached; const InheritedUserDetails({ Key? key, required Widget child, required this.userDetails, required this.isCached, required this.userDetailsState, }) : super(key: key, child: child); static InheritedUserDetails? of(BuildContext context) => context.dependOnInheritedWidgetOfExactType(); @override bool updateShouldNotify(covariant InheritedUserDetails oldWidget) { return (userDetails?.usage != oldWidget.userDetails?.usage) || (userDetails?.fileCount != oldWidget.userDetails?.fileCount) || (isCached != oldWidget.isCached); } }