Last active
August 5, 2021 21:33
-
-
Save PlugFox/6f13157effce2c1a525f8355dc35b0cc to your computer and use it in GitHub Desktop.
Store widget, Stateless
This file contains hidden or 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
| /* | |
| * 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