Created
December 3, 2022 18:30
-
-
Save purplenoodlesoop/28f8c9beeec083b777cce9174913227c 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
// ignore_for_file: avoid_print | |
import 'package:flutter/material.dart'; | |
import 'package:unidirectional/inherited_selector.dart'; | |
class AdditionModel { | |
final int first; | |
final int second; | |
const AdditionModel(this.first, this.second); | |
@override | |
int get hashCode => Object.hashAll([first, second]); | |
@override | |
bool operator ==(Object other) => | |
identical(this, other) || | |
(other is AdditionModel && | |
other.first == first && | |
other.second == second); | |
AdditionModel copyWith({ | |
int? first, | |
int? second, | |
}) => | |
AdditionModel( | |
first ?? this.first, | |
second ?? this.second, | |
); | |
} | |
class AdditionScope extends StatefulWidget { | |
final Widget child; | |
const AdditionScope({required this.child, super.key}); | |
static _AdditionScopeState? _stateOf(BuildContext context) => | |
context.findAncestorStateOfType<_AdditionScopeState>(); | |
static void incrementFirst(BuildContext context) { | |
_stateOf(context)?.incrementFirst(); | |
} | |
static void incrementSecond(BuildContext context) { | |
_stateOf(context)?.incrementSecond(); | |
} | |
static int firstOf(BuildContext context) => InheritedSelector.select( | |
context, | |
(AdditionModel data) => data.first, | |
listen: true, | |
); | |
static int secondOf(BuildContext context) => InheritedSelector.select( | |
context, | |
(AdditionModel data) => data.second, | |
listen: true, | |
); | |
static int sumOf(BuildContext context) => InheritedSelector.select( | |
context, | |
(AdditionModel data) => data.first + data.second, | |
listen: true, | |
); | |
@override | |
State<AdditionScope> createState() => _AdditionScopeState(); | |
} | |
class _AdditionScopeState extends State<AdditionScope> { | |
AdditionModel model = const AdditionModel(0, 0); | |
void setModel(AdditionModel newModel) { | |
setState(() { | |
model = newModel; | |
}); | |
} | |
void incrementFirst() { | |
setModel( | |
model.copyWith(first: model.first + 1), | |
); | |
} | |
void incrementSecond() { | |
setModel( | |
model.copyWith(second: model.second + 1), | |
); | |
} | |
@override | |
Widget build(BuildContext context) => InheritedSelector( | |
data: model, | |
child: widget.child, | |
); | |
} | |
class InheritedSelectorScreen extends StatelessWidget { | |
const InheritedSelectorScreen({ | |
super.key, | |
}); | |
@override | |
Widget build(BuildContext context) { | |
print(runtimeType); | |
return AdditionScope( | |
child: Scaffold( | |
body: Column( | |
mainAxisAlignment: MainAxisAlignment.center, | |
children: [ | |
Row( | |
children: const [ | |
InheritedSelectorFirst(), | |
Text('+'), | |
InheritedSelectorSecond(), | |
Text('='), | |
InheritedSelectorSum(), | |
], | |
), | |
const InheritedSelectorButtons(), | |
], | |
), | |
), | |
); | |
} | |
} | |
class InheritedSelectorButtons extends StatelessWidget { | |
const InheritedSelectorButtons({ | |
super.key, | |
}); | |
@override | |
Widget build(BuildContext context) { | |
print(runtimeType); | |
return Row( | |
children: [ | |
ElevatedButton( | |
onPressed: () => AdditionScope.incrementFirst(context), | |
child: const Text('Increment First'), | |
), | |
ElevatedButton( | |
onPressed: () => AdditionScope.incrementSecond(context), | |
child: const Text('Increment Second'), | |
), | |
], | |
); | |
} | |
} | |
class InheritedSelectorFirst extends StatelessWidget { | |
const InheritedSelectorFirst({ | |
super.key, | |
}); | |
@override | |
Widget build(BuildContext context) { | |
print(runtimeType); | |
final first = AdditionScope.firstOf(context); | |
return Text( | |
first.toString(), | |
); | |
} | |
} | |
class InheritedSelectorSecond extends StatelessWidget { | |
const InheritedSelectorSecond({ | |
super.key, | |
}); | |
@override | |
Widget build(BuildContext context) { | |
print(runtimeType); | |
final second = AdditionScope.secondOf(context); | |
return Text( | |
second.toString(), | |
); | |
} | |
} | |
class InheritedSelectorSum extends StatelessWidget { | |
const InheritedSelectorSum({ | |
super.key, | |
}); | |
@override | |
Widget build(BuildContext context) { | |
print(runtimeType); | |
final sum = AdditionScope.sumOf(context); | |
return Text( | |
sum.toString(), | |
); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment