Skip to content

Instantly share code, notes, and snippets.

@purplenoodlesoop
Created December 3, 2022 18:30
Show Gist options
  • Save purplenoodlesoop/28f8c9beeec083b777cce9174913227c to your computer and use it in GitHub Desktop.
Save purplenoodlesoop/28f8c9beeec083b777cce9174913227c to your computer and use it in GitHub Desktop.
// 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