Skip to content

Instantly share code, notes, and snippets.

@MariaMelnik
Created June 2, 2020 17:55
Show Gist options
  • Save MariaMelnik/075eb5cfe11e903ab8f7f8f7fb3dfa2c to your computer and use it in GitHub Desktop.
Save MariaMelnik/075eb5cfe11e903ab8f7f8f7fb3dfa2c to your computer and use it in GitHub Desktop.
import 'dart:async';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
void main() async {
final core = Core();
runApp(MaterialApp(
home: App(core),
));
}
class App extends StatefulWidget {
final Core core;
const App(this.core);
@override
_AppState createState() => _AppState();
}
class _AppState extends State<App> {
@override
Widget build(BuildContext context) {
return Scaffold(
floatingActionButton: FloatingActionButton(
onPressed: () {
widget.core.news = [News(0)];
},
),
body: StreamBuilder<List<News>>(
initialData: widget.core.news,
stream: widget.core.newsStream,
builder: (ctx, value) {
List<Widget> news = value.data
.map(_newsToWidget)
.toList();
return ListView(
children: news,
);
},
),
);
}
Widget _newsToWidget(News n) {
return NewsWidget(n, () => _onNewsChanged(n));
}
void _onNewsChanged(News n) {
List<News> newList = widget.core.news
.map((News curN) => n.id == curN.id ? News(n.id, isFavorite: !n.isFavorite) : curN)
.toList();
widget.core.news = newList;
}
}
// ignore: must_be_immutable
class Core {
var _news = <News>[News(0), News(1), News(2)];
final c = StreamController<List<News>>.broadcast();
set news(List<News> news) {
_news = news;
c.sink.add(_news);
}
List<News> get news => _news;
Stream<List<News>> get newsStream => c.stream;
void dispose() {
c.close();
}
}
// ignore: must_be_immutable
class News {
final bool isFavorite;
final int id;
News(this.id, {bool isFavorite})
: this.isFavorite = isFavorite ?? false;
}
class NewsWidget extends StatelessWidget {
final News news;
final VoidCallback valueChanged;
NewsWidget(this.news, this.valueChanged);
@override
Widget build(BuildContext context) {
return GestureDetector(
child: Icon(news.isFavorite ? Icons.plus_one : Icons.minimize),
onTap: _onTap,
);
}
void _onTap() {
valueChanged?.call();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment