我还是比较陌生,甚至对Provider还是比较新,因此我可能对此完全不满意,但从我阅读的内容来看,它似乎是正确的。
通常的想法是,有一个带有按钮的标题小部件,根据应用程序的状态,该按钮可以打开内生程序或将用户带到登录页面。
登录正常,并且所有状态均正常运行,但只能在登录窗口小部件上。当用户被路由回到主屏幕时-即使成功登录后仍会设置为默认状态。
小部件树如下:
主要
| _ 主屏幕
| | _ AppHeader
| _ 登录
main.dart
class HomeScreen extends StatefulWidget {
static const String id = 'home_screen';
HomeScreen({Key key, this.title}) : super(key: key);
final String title;
@override
_HomeScreenState createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>();
AccountDrawerOpen() {
_scaffoldKey.currentState.openEndDrawer();
FirebaseAnalytics().logEvent(
name: 'account_drawer_open',
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
...display code here
body: AppHeader()
);}
}
home_screen.dart
import 'package:provider/provider.dart';
class AppHeader extends StatelessWidget {
@override
Widget build(BuildContext context) {
LoginState testLoginState = Provider.of<LoginState>(context);
return Column(
children: <Widget>[
FlatButton(
child: Text('Check state'),
onPressed: () {
print("APP HEADER | STATE IS NOW ${testLoginState.status}");
},
)
],
);
}
}
这是我需要访问状态以确定玩家是否登录的地方
app_header.dart
enum Status {
Authenticated,
Authenticating,
Unauthenticated,
InvalidLogin
}
class LoginState with ChangeNotifier {
Status _status = Status.Unauthenticated;
Status get status => _status;
Future signIn(String email, String password) async {
try {
_status = Status.Authenticating;
notifyListeners();
... goes to the DB, some logic happens and returns true
_status = Status.Authenticated;
notifyListeners();
print("FROM LOGIN STATE: $_status");
} catch (e) {
print('Oops');
_status = Status.InvalidLogin;
notifyListeners();
}
}
最后,这是我的LoginState.dart
{{1}}
感谢您的帮助。
答案 0 :(得分:0)
弄清楚了。在我的登录小部件中-我有一个ChangeNotifierProvider可以更改上下文。因此,在这种情况下-这将上下文更改为最低的小部件-登录小部件。