The main difference between both is that provider
is not strictly dependency injection.
By using widgets, provider
is also able to:
- providers are compatible with the Flutter devtool
- know when a variable cannot be accessed (scoped to a tree)
- know when to create and dispose of an object
- synchronize model -> model and model -> UI
- override some values for only a specific widget tree
- voluntarily prevent circular dependency
All of these are, while optional, good for the health of your app in the long run.
It ensures that you’re always up to date, makes it harder to have “spaghetti code”, and makes your different elements more composable.