Flutter提供者未更新状态

时间:2020-02-04 16:46:57

标签: flutter flutter-provider

我还是比较陌生,甚至对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}}

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

弄清楚了。在我的登录小部件中-我有一个ChangeNotifierProvider可以更改上下文。因此,在这种情况下-这将上下文更改为最低的小部件-登录小部件。