Always void prop drilling. It creates spaghetti code that feels like everything is being hung on by a wire. View models serve as a widget's home for all data and state correlated to said widget. View models are always wrapped (or created) with a Provider (or Provider.value). Any other types of field that shouldn't be stored in the view model, for example, a style class in Myoro Flutter Library should also be wrapped around the widget with Provider. Avoiding prop drilling like so grants more const widgets and clearer code. Furthermore, prop drilling should be used as a mechanism for the developer to see where a Widget is being rebuilt and what fields the widget are using are mutable.
When creating any type of widget. There are only a view select reasons to prop drill:
ValueNotifier values: When using ValueListenableBuilder, you want to pass the value being listened to with prop drilling. Not doing this creates confusing code as it is not clearer how a Widget is being rebuilt.