import 'package:flutter/material.dart'; import '../api/token.dart'; import '../log/log.dart'; class LoginContainer extends StatefulWidget { const LoginContainer({Key? key, required this.child}) : super(key: key); final Widget child; @override _LoginContainerState createState() => _LoginContainerState(); } class _LoginContainerState extends State { bool loggedIn = false; bool loading = true; @override void initState() { // TODO: implement initState super.initState(); final token = Token.getInstance(); token.getToken().then((value) { // todo this context call might occur before app rendered correctly! Log.i("The token value is $value"); if (value != "") { setState(() { loggedIn = true; loading = false; }); } else { setState(() { loggedIn = false; loading = false; }); } }); } @override Widget build(BuildContext context) { return LoginContext( LoggedIn: loggedIn, child: loading ? MaterialApp( home: Container( color: Colors.white, child: const Center(child: CircularProgressIndicator()), ), ) : widget.child, onLoggin: (bool login) { if (loggedIn != login) { setState(() { loggedIn = login; }); } }, ); } } class LoginContext extends InheritedWidget { const LoginContext( {Key? key, required Widget child, required this.LoggedIn, required this.onLoggin}) : super(key: key, child: child); final bool LoggedIn; final void Function(bool) onLoggin; static LoginContext of(BuildContext context) { final LoginContext? result = context.dependOnInheritedWidgetOfExactType(); assert(result != null, 'No LoginContext found in context'); return result!; } @override bool updateShouldNotify(LoginContext old) { return LoggedIn != old.LoggedIn; } }