Skip to content

Instantly share code, notes, and snippets.

@PlugFox
Last active August 5, 2021 21:33
Show Gist options
  • Select an option

  • Save PlugFox/6f13157effce2c1a525f8355dc35b0cc to your computer and use it in GitHub Desktop.

Select an option

Save PlugFox/6f13157effce2c1a525f8355dc35b0cc to your computer and use it in GitHub Desktop.
Store widget, Stateless
/*
* https://dartpad.dev/?null_safety=true&id=6f13157effce2c1a525f8355dc35b0cc
* https://gist.github.com/PlugFox/6f13157effce2c1a525f8355dc35b0cc/
*/
import 'dart:async';
import 'package:flutter/material.dart';
void main() => runZonedGuarded(
() => runApp(App()),
(error, stackTrace) => print(error),
);
class App extends StatelessWidget {
const App({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) => MaterialApp(
title: 'Counter',
home: Home(),
);
}
class Home extends StoreWidget<CounterState> {
Home({Key? key})
: super(
() => CounterState(),
key: key,
);
@override
void initState() {
super.initState();
store.counter = 1;
}
@override
void dispose() {
store.counter = 0;
super.dispose();
}
@override
Widget build(BuildContext context) => Scaffold(
body: SafeArea(
child: Center(
child: Text(
store.counter.toString(),
textScaleFactor: 4,
),
),
),
floatingActionButton: FloatingActionButton(
onPressed: () => setState(() => store.counter++),
child: const Icon(Icons.add),
),
);
}
class CounterState {
int counter = 0;
}
// StoreWidget
abstract class StoreWidget<Store extends Object> extends StatelessWidget {
late final _StoreElement<Store> _storeElement;
final Store Function() _storeBuilder;
// ignore: prefer_const_constructors_in_immutables
StoreWidget(Store Function() storeBuilder, {Key? key})
: _storeBuilder = storeBuilder,
super(key: key);
Store get store => _storeElement.store;
@override
_StoreElement<Store> createElement() =>
_StoreElement<Store>(this, _storeBuilder);
@mustCallSuper
void initState() {}
@mustCallSuper
void dispose() {}
void setState(VoidCallback fn) {
fn();
_storeElement.markNeedsBuild();
}
@override
Widget build(BuildContext context);
}
class _StoreElement<Store extends Object> extends StatelessElement {
late final Store store;
final Store Function() storeBuilder;
_StoreElement(StoreWidget<Store> widget, this.storeBuilder) : super(widget) {
store = storeBuilder();
widget._storeElement = this;
}
@override
StoreWidget<Store> get widget => super.widget as StoreWidget<Store>;
@override
Widget build() => widget.build(this);
void setState(VoidCallback fn) {
fn();
markNeedsBuild();
}
@override
void mount(Element? parent, Object? newSlot) {
super.mount(parent, newSlot);
widget.initState();
markNeedsBuild();
}
@override
void unmount() {
super.unmount();
widget.dispose();
}
@override
void update(StoreWidget<Store> newWidget) {
newWidget._storeElement = this;
super.update(newWidget);
markNeedsBuild();
rebuild();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment