首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将下面的类重构为StatefulWidget,并在异步间隙之后正确使用上下文之外的挂载

如何将下面的类重构为StatefulWidget,并在异步间隙之后正确使用上下文之外的挂载
EN

Stack Overflow用户
提问于 2022-11-22 11:15:04
回答 1查看 21关注 0票数 0

如何将下面的类重构为StatefulWidget,并在异步间隙之后正确使用上下文之外的挂载

代码语言:javascript
运行
复制
class AuthService {
  //sign up user
  void signUpUser({
    required BuildContext context,
    required String email,
    required String password,
    required String name,
   }) async {
    try {
      User user = User(
        id: '',
        name: name,
        password: password,
        email: email,
        address: '',
        type: '',
        token: '',
       // cart: [],
      );
      http.Response res = await http.post(
        Uri.parse('$uri/api/signup'),
        body: user.toJson(),
        headers: <String, String>{
          'Content-Type': 'application/json; charset=UTF-8',
        },
      );

      httpErrorHandle(
        response: res,
        context: context,
        onSuccess: () {
          showSnackBar(
            context,
            'Account created! Login with the same credentials!',
          );
        },
      );
    } catch (e) {
      showSnackBar(context, e.toString());
    }
  }

  // sign in user
  void signInUser({
    required BuildContext context,
    required String email,
    required String password,
  }) async {
    try {
      http.Response res = await http.post(
        Uri.parse('$uri/api/signin'),
        body: jsonEncode({
          'email': email,
          'password': password,
        }),
        headers: <String, String>{
          'Content-Type': 'application/json; charset=UTF-8',
        },
      );
      //print(res.body);
     
      httpErrorHandle(
        response: res,
        context: context,
       onSuccess: () async {

          SharedPreferences prefs = await SharedPreferences.getInstance();
          //Do not use BuildContexts across async gaps.dartuse_build_context_synchronously
          Provider.of<UserProvider>(context, listen: false).setUser(res.body);
          await prefs.setString('x-auth-token', jsonDecode(res.body)['token']); 
         
 //Do not use BuildContexts across async gaps.dartuse_build_context_synchronously
            Navigator.pushNamedAndRemoveUntil(
            context,
            HomeScreen.routeName,
            (route) => false,
          );
     

        },
      );

    } catch (e) {
      showSnackBar(context, e.toString());
    }
  }
  

   // get user data
  void getUserData (
    BuildContext context,
  ) async {
    try {
       SharedPreferences prefs = await SharedPreferences.getInstance();
       String? token = prefs.getString('x-auth-token');

       if(token == null ){
        prefs.setString('x-auth-token', '');
       }

     var tokenRes = await http.post
     (Uri.parse('$uri/tokenIsValid'),
     headers: <String, String>{
       'Content-Type': 'application/json; charset=UTF-8',
       'x-auth-token': token!
     },
     );

     var response = jsonDecode(tokenRes.body);

     if(response == true){
    http.Response userRes =  await http.get
       (Uri.parse('$uri/'),headers: <String, String>{
       'Content-Type': 'application/json; charset=UTF-8',
       'x-auth-token': token
     }, );
 //Do not use BuildContexts across async gaps.dartuse_build_context_synchronously
     var userProvider = Provider.of<UserProvider>(context, listen: false);
     userProvider.setUser(userRes.body);
     }
    } catch (e) {
      showSnackBar(context, e.toString());
    }
  }
}

我需要重构上面的类,当代码中提到一个BuildContexts问题时,它会导致跨异步间隙的buildContexts警告问题。

EN

回答 1

Stack Overflow用户

发布于 2022-11-28 11:00:52

您必须将使用BuildContext作为参数的部分传递给异步函数。因此,您可以按以下方式对signInUser函数进行筛选:

代码语言:javascript
运行
复制
void signInUser({
    required BuildContext context,
    required String email,
    required String password,
    required UserProvider userProvider,
    required VoidCallback onSuccess,
  }) async {
    try {
      http.Response res = await http.post(
        Uri.parse('$uri/api/signin'),
        body: jsonEncode({
          'email': email,
          'password': password,
        }),
        headers: <String, String>{
          'Content-Type': 'application/json; charset=UTF-8',
        },
      );
      //print(res.body);

      httpErrorHandle(
        response: res,
        context: context,
        onSuccess: () async {
          SharedPreferences prefs = await SharedPreferences.getInstance();

          //Do not use BuildContexts across async gaps.dartuse_build_context_synchronously
          provider.setUser(res.body);

          await prefs.setString('x-auth-token', jsonDecode(res.body)['token']);

          //Do not use BuildContexts across async gaps.dartuse_build_context_synchronously
          onSuccess.call();
        },
      );
    } catch (e) {
      showSnackBar(context, e.toString());
    }
  }

在其他地方,您可以按以下方式调用signInUser

代码语言:javascript
运行
复制
signInUser(
  contex: context,
  email: email,
  password: ppassword,
  userProvider:
      Provider.of<UserProvider>(context, listen: false),
  onSuccess: () {
    Navigator.pushNamedAndRemoveUntil(
      context,
      HomeScreen.routeName,
      (route) => false,
    );
  });
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74531745

复制
相关文章

相似问题

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