首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未使用ChangeNotifier设置用户?

未使用ChangeNotifier设置用户?
EN

Stack Overflow用户
提问于 2020-06-14 06:10:45
回答 1查看 71关注 0票数 0

我正在使用块模式进行状态管理,当我使用WPUserInfoResponse方法访问用户数据来设置currentuser时,在我登录并试图访问用户页面上的currentuser时,我仍然得到null。

不断收到错误

代码语言:javascript
复制
   The following NoSuchMethodError was thrown building UserPage(dirty, dependencies: 
   [InheritedProvider<Wordpress>], state: _UserPageState#df273):
   The getter 'username' was called on null.
   Receiver: null
   Tried calling: username
   The relevant error-causing widget was:
   UserPage file:///F:/Flutter/mindmover/lib/providers/wordpress.dart:82:31

Wordpress changenotifier,其中有login和getuser方法,当用户登录到登录页面时会调用它们。我已经检查过currentuser,它不是空的。

代码语言:javascript
复制
enum LoginState { loggedin, signedout }
enum RoleState { admin, mentor, user }
enum ErrorState { invalidParams, serverIssue }

class Wordpress extends ChangeNotifier {
  String userTokenId;
  int errorMessage = 1;
  WPUserInfo.Data currentuser;

  LoginState loginState = LoginState.signedout;

  get isLoggedIn => loginState == LoginState.loggedin;
  get isSignOut => loginState == LoginState.signedout;
  get errorMessageState => errorMessage;
  WPUserInfo.Data get currentUserModel => currentuser;

  dynamic lindawk =
      WPJsonAPI.instance.initWith(baseUrl: "https://www.XXXX.dk");

  Future login(String username, String password, context) async {
    print(username.toString() + password.toString());

    WPUserLoginResponse wpUserLoginResponse = await WPJsonAPI.instance.api(
      (request) {
        return request.wpLogin(
            username: username,
            password: password,
            authType: WPAuthType.WpUsername);
      },
    );

    if (wpUserLoginResponse != null) {
      userTokenId = wpUserLoginResponse.data.userToken;
      loginState = LoginState.loggedin;

      getUser(userTokenId, context);
    } else {
      print("invalid login details");
      errorMessage += 2;
    }
  }

  getUser(String userTokenId, context) async {
    WPUserInfo.WPUserInfoResponse wpUserInfoResponse =
        await WPJsonAPI.instance.api(
      (request) {
        notifyListeners();
        return request.wpGetUserInfo(userTokenId);
      },
    );

    if (wpUserInfoResponse != null) {
      print(wpUserInfoResponse.data.username);
      currentuser = wpUserInfoResponse.data;
      notifyListeners();
      onValidUser(currentuser, context);
    } else {
      wpUserInfoResponse.message.toString();
      errorMessage = 2;
      print("something went wrong");
      //errorMessage = "Something whent wrong";
    }
  }

  void onValidUser(WPUserInfo.Data user, context) {
    print(currentuser);
    Navigator.pushReplacement(
      context,
      MaterialPageRoute(
        builder: (context) => UserPage(
          user: user,
        ),
      ),
    );
  }
}

在wordpress class I user multiple provider中,player类可以正常工作,但MyApp类不能。

代码语言:javascript
复制
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: [
        ChangeNotifierProvider<Player>.value(
          value: Player(),
        ),
        ChangeNotifierProvider<Wordpress>(
          create: (_) { return Wordpress(); },
          child: AppBottomNavigationBar(),
        )
      ],

在用户页面上,我调用了wordpress类,但是username的值总是空的?

代码语言:javascript
复制
@override
  Widget build(BuildContext context) {
  Wordpress wordpress = Provider.of<Wordpress>(context);

    return Scaffold(
      appBar: AppBar(
        actions: <Widget>[
          FlatButton(
            onPressed: () => {
              Navigator.pushReplacement(
                context,
                MaterialPageRoute(
                  builder: (_) => AppBottomNavigationBar(),
                ),
              ),
            },
            child: Icon(Icons.add_circle_outline),
          ),
        ],
      ),
      body: Container(
        child: Column(
          children: <Widget>[
            FlatButton(
              onPressed: null,
              child: Text(wordpress.currentUserModel.username),
            ),
          ],
        ),
      ),
    );
}
EN

回答 1

Stack Overflow用户

发布于 2020-06-14 06:58:40

也许把类型给提供者会给你一个实际的Wordpress类,你在调用它之前有没有检查过你的Wordpress类中的currentUserModel是否是非空的?

代码语言:javascript
复制
@override
Widget build(BuildContext context) {
Wordpress wordpress = Provider.of<Wordpress>(context); //Give the type of value the provider should search in the tree

return Scaffold(
  appBar: AppBar(
    actions: <Widget>[
      FlatButton(
        onPressed: () => {
          Navigator.pushReplacement(
            context,
            MaterialPageRoute(
              builder: (_) => AppBottomNavigationBar(),
            ),
          ),
        },
        child: Icon(Icons.add_circle_outline),
      ),
    ],
  ),
  body: Container(
    child: Column(
      children: <Widget>[
        FlatButton(
          onPressed: null,
          child: Text(wordpress.currentUserModel.username), // without the type maybe provider can't give back the class and return null, null.currentUserModel.username gives the error
        ),
      ],
    ),
  ),
);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62366127

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档