在flutter android中处理异步函数

问题描述 投票:0回答:1

这是获取用户功能,它检查用户是否在Hive中,根据用户联系人更改名称,从服务器获取用户数据。

getUserFromApiWithUrl 函数中发生错误,我调用此函数 4 次,但它不等待响应

  Future<UserModel> getUser(String userUrl) async {
    final hive = await Hive.box<UserModel>('users');

    if (hive.containsKey(userUrl)) {
      print("User is in the box");
      UserModel user = await hive.get(userUrl)!;
      user = await updateUser(user);
      return user;
    } else {
      print("User is not in the box");
      UserModel user = await getUserFromApiWithUrl(userUrl);
      user = await updateUser(user);
      hive.put(userUrl, user);
      return user;
    }
  }

这里是 getUserFromApiWithUrl 函数

  Future<UserModel> getUserFromApiWithUrl(String reqUserUrl) async {
    print('user url is $reqUserUrl');
    final url = Uri.parse('$baseUrl/api/v1/get-user-info-by-url');
    final data = {
      'user_phone': userPhone,
      'token': token,
      'req_user_url': reqUserUrl
    };

    final response = await http.post(url, body: jsonEncode(data), headers: {
      'Content-Type': 'application/json',
    });
    print(response);
    // hanle response
    if (response.statusCode == 200) {
      print("user is in the api");
      final user = UserModel.fromJson(jsonDecode(response.body));
      print("user is ${user.firstName}");
      return user;
    } else {
      throw Exception('Failed to load user');
    }
  }

这是我让它运行该函数 4 次但不等待响应(打印响应)的输出

I/flutter (11679): User is not in the box
I/flutter (11679): user url is {userUrl}
I/flutter (11679): User is not in the box
I/flutter (11679): user url is {userUrl}
I/flutter (11679): User is not in the box
I/flutter (11679): user url is {userUrl}
I/flutter (11679): User is not in the box
I/flutter (11679): user url is {userUrl}

它在 IOS 上运行良好,但在 Android 上运行不佳

flutter android-asynctask
1个回答
0
投票
Future<UserModel> getUser(String userUrl) async {
  final hive = await Hive.box<UserModel>('users');

  if (hive.containsKey(userUrl)) {
    print("User is in the box");
    UserModel user = await hive.get(userUrl)!;
    user = await updateUser(user);
    return user;
  } else {
    print("User is not in the box");
    UserModel user = await getUserFromApiWithUrl(userUrl);
    user = await updateUser(user);
    hive.put(userUrl, user);
    return user;
  }
}

// Define a Future that resolves sequentially
Future<UserModel> getUserSequentially(String userUrl) async {
  UserModel user = await getUser(userUrl);
  return user;
}

// Call the getUserSequentially function
await getUserSequentially(userUrl);
await getUserSequentially(userUrl);
await getUserSequentially(userUrl);
await getUserSequentially(userUrl);

在此版本的代码中,getUserSequentially 函数确保在进行下一次调用之前等待对 getUser 的每次调用。这有助于防止重叠执行并确保按顺序处理响应。您还可以检查以下步骤。

1- Flutter 版本:确保您使用的是 Flutter 的最新稳定版本。有时,可以通过更新到包含错误修复和改进的更新版本来解决问题。

2- Flutter 调试:使用 Flutter 的调试工具在运行时检查调用堆栈和变量。这可以帮助您识别代码中可能导致问题的任何意外行为或错误。

3- 网络权限:在 Android 上,网络请求可能需要 AndroidManifest.xml 文件中的互联网权限。确保这些权限配置正确。

4- FutureBuilder 或 StreamBuilder:如果您在 UI 中显示用户数据,请考虑使用 FutureBuilder 或 StreamBuilder 小部件,以确保数据可用时 UI 正确更新。

5- 考虑其他包:如果问题似乎与 http 包特别相关,您可能需要考虑使用其他 HTTP 客户端包,例如 dio,它提供更高级的功能,并且可能以不同的方式处理并发。

© www.soinside.com 2019 - 2024. All rights reserved.