flush method

void flush()

Implementation

void flush() {
  if (_queue.isEmpty) return;
  final uploadList = List<TrackModel>.from(_queue);
  _queue.clear();
  final config = AutoTrackConfigManager.instance.config;
  final host = config.host;
  if (config.samplingRate != 1) {
    if (Random().nextDouble() > config.samplingRate) {
      // 不在采样范围不上传
      return;
    }
  }

  if (config.uploadHandler != null) {
    config.uploadHandler!(uploadList);
  } else {
    if (host != null) {
      final t = DateTime.now().millisecondsSinceEpoch;

      httpClient.postUrl(Uri.parse(host)).then((request) {
        request.headers.contentType = ContentType.json;
        request.write(json.encode({
          'app_key': config.appKey ?? '',
          'signature': config.signature!(t),
          't': t,
          'user_id': config.userId ?? '',
          'track_id': config.trackId ?? '',
          'unique_id':
          config.uniqueId ?? AutoTrackConfigManager.instance.deviceId,
          'device_id': AutoTrackConfigManager.instance.deviceId,
          'data_list': uploadList.map((e) => e.toMap()).toList(),
          'app_version': AutoTrackConfigManager.instance.appVersion,
          'device_info': AutoTrackConfigManager.instance.deviceInfo
        }));
        return request.close();
      }).then((response) {
        AutoTrackLogger.getInstance()
            .debug('upload status => ${response.statusCode}');
      }).catchError((error) {
        AutoTrackLogger.getInstance().error(error);
      });
    }
  }
}