Created
December 15, 2018 00:10
-
-
Save HansMuller/6adf596624e90f01ed7e2c4577269c0f to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
The application model is shared by an InheritedWidget: ModelBinding. | |
ModelBinding has-a Model. All of the descendants of ModelBinding can get | |
the model with Model.of(context) and in so doing, register themselves | |
as dependents which will be rebuilt when ModelBinding is rebuilt. | |
To change the shared model, the ModelBinding must be rebuilt with a new Model. | |
Descendants of ModelBinding must be provided with a callback that rebuilds | |
ModelBinding's stateful parent. | |
*/ | |
import 'package:flutter/material.dart'; | |
class Model { | |
const Model({ this.value = 0 }); | |
final int value; | |
@override | |
bool operator ==(Object other) { | |
if (identical(this, other)) | |
return true; | |
if (other.runtimeType != runtimeType) | |
return false; | |
final Model otherModel = other; | |
return otherModel.value == value; | |
} | |
@override | |
int get hashCode => value.hashCode; | |
static Model of(BuildContext context) { | |
final ModelBinding binding = context.inheritFromWidgetOfExactType(ModelBinding); | |
return binding.model; | |
} | |
} | |
class ModelBinding extends InheritedWidget { | |
ModelBinding({ | |
Key key, | |
this.model = const Model(), | |
Widget child, | |
}) : assert(model != null), super(key: key, child: child); | |
final Model model; | |
@override | |
bool updateShouldNotify(ModelBinding oldWidget) => model != oldWidget.model; | |
} | |
class ViewController extends StatelessWidget { | |
const ViewController({ Key key, this.updateModel }) : super(key: key); | |
final ValueChanged<Model> updateModel; | |
@override | |
Widget build(BuildContext context) { | |
return RaisedButton( | |
onPressed: () { | |
updateModel(Model(value: Model.of(context).value + 1)); | |
}, | |
child: Text('Hello World ${Model.of(context).value}'), | |
); | |
} | |
} | |
class App extends StatefulWidget { | |
@override | |
_AppState createState() => _AppState(); | |
} | |
class _AppState extends State<App> { | |
Model currentModel = Model(); | |
void updateModel(Model newModel) { | |
if (newModel != currentModel) { | |
setState(() { | |
currentModel = newModel; | |
}); | |
} | |
} | |
@override | |
Widget build(BuildContext context) { | |
return MaterialApp( | |
home: ModelBinding( | |
model: currentModel, | |
child: Scaffold( | |
body: Center( | |
child: ViewController(updateModel: updateModel), | |
), | |
), | |
), | |
); | |
} | |
} | |
void main() { | |
runApp(App()); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment