Из вашего вопроса не ясно, какова роль самозаверяющего сертификата. Исходя из вашей работы, я предполагаю, что это серверный сертификат, который вы установили на сервере HTTPS. (Это не сертификат на стороне клиента, который вы хотели бы передать на сервер.)
Итак, вам нужно заставить Дарт HttpClient
доверять этому сертификату, который будет передан ему сервером как часть рукопожатия TLS. (Установив обратный вызов, вы заставили клиента доверять любому сертификату, а не только вашему серверу.)
Чтобы установить доверенный сертификат, используйте setTrustedCertificatesBytes
вместо useCertificateChainBytes
(который вы использовали бы, если бы ваш сертификат был на стороне клиента).
Вы не можете получить доступ к активам напрямую как File
s, поскольку они связаны сборкой. Вы делаете правильные вещи, загружая их и используя методы ...Bytes
. Вы можете улучшить читабельность своего кода следующим образом (убрав then
). Также обратите внимание на небольшое изменение на Uint8List
ByteData data = await rootBundle.load('assets/raw/certificate.crt');
SecurityContext context = SecurityContext.defaultContext;
context.setTrustedCertificatesBytes(data.buffer.asUint8List());
client = HttpClient(context: context);