I've been struggling with a similar situation: my problem was not that the icons never loaded, just that they could take a while to load on slower connections and until they loaded ugly, unformatted text like sentiment_very_satisfied would be shown on the page (often many times larger than the surrounding text as well making it very obvious).
The other solutions here didn't work for me (including font-display:block which I thought might be promising), so I came up with my own using CSS and jQuery. I'm sure you could easily adapt it to use vanilla JS.
CSS:
.material-icons{
opacity:0;
}
jQuery:
$(window).load(function() {
$('.material-icons').css('opacity','1');
});
The trick here is that, unlike the more commonly used $(document).ready() listener, $(window).load() waits for all elements of a page to be downloaded before being triggered. In this case, that means it won't change the opacity of the icons until the icon font has been downloaded.
The downside is that the icons won't show up until everything on the page has been downloaded, but that was a trade-off I was willing to make to avoid having huge spans of text visible on my page before the icon font loaded.
(I also added a transition to the CSS .material-icons{transition:opacity 0.5s;} so they showed up nice and smooth.)