import 'package:flutter/foundation.dart'; enum MallBridgeTab { home, market, orders, profile } class MallBridgeState { const MallBridgeState({ this.ready = false, this.activeTab = MallBridgeTab.home, this.canGoBack = false, }); final bool ready; final MallBridgeTab activeTab; final bool canGoBack; } class MallBridgeController { MallBridgeController._(); static final instance = MallBridgeController._(); final state = ValueNotifier(const MallBridgeState()); Future Function(MallBridgeTab tab, bool reselect)? _activateTab; Future Function()? _goBack; void attach({ required Future Function(MallBridgeTab tab, bool reselect) activateTab, required Future Function() goBack, }) { _activateTab = activateTab; _goBack = goBack; } void detach() { _activateTab = null; _goBack = null; state.value = const MallBridgeState(); } void update(Map? raw) { final tab = MallBridgeTab.values.firstWhere( (item) => item.name == raw?['activeTab'], orElse: () => MallBridgeTab.home, ); state.value = MallBridgeState( ready: _asBool(raw?['ready']), activeTab: tab, canGoBack: _asBool(raw?['canGoBack']), ); } Future activate(MallBridgeTab tab, {bool reselect = false}) async { final current = state.value; state.value = MallBridgeState( ready: current.ready, activeTab: tab, canGoBack: current.canGoBack, ); await _activateTab?.call(tab, reselect); } Future goBack() async => await _goBack?.call(); } bool _asBool(Object? value) => value == true || value == 1 || value == '1' || value == 'true';