I’ll give you my solution although a lot of things are subject of taste more than “what is right”. Also I’m throwing some simple structs around instead of data objects.
The Character does everything:
The pickup only provides the data structure through an interface:
The inventory widget is connected to the component through an event to avoid calling UI function from the component. This way you can delete or replace the UI and the game will run all the same.
The inventory creates slots. The slots only care to set their own values.