osam_flutter 2.0.8 osam_flutter: ^2.0.8 copied to clipboard
Navigation and UI elements which fits with Osam library
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:osam_flutter/osam_flutter.dart';
const colors = [Colors.red, Colors.blue, Colors.green, Colors.yellow];
final appKey = GlobalKey();
void main() async {
final core = Core();
runApp(MaterialApp(
key: appKey,
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(
appBar: AppBar(
title: OsamBuilder(
stream: widget.core.propertyStream((state) => state.test),
builder: (ctx, snapshot) {
print('new app bar');
return Text(snapshot.data.hashCode.toString());
},
),
),
body: Column(
children: <Widget>[
Expanded(
child: OsamBuilder<List<News>>(
key: ValueKey('list_builder'),
stream: widget.core.propertyStream((state) => state.test.news),
builder: (ctx, snapshot) => ListView(
key: ValueKey('list'),
children: snapshot.data
.map((e) => GestureDetector(
key: ValueKey(e.id),
onTap: () => e.update((state) => state.isFavorite = !state.isFavorite),
child: OsamBuilder(
key: ValueKey(e.id + 300),
stream: e.propertyStream((state) => state.isFavorite),
builder: (cx, snp) => Icon(snp.data ? Icons.check : Icons.close),
),
))
.toList(),
),
),
),
RaisedButton(
onPressed: () => widget.core.update((state) {
print(state.hashCode);
state.test = Test();
print(state.hashCode);
}),
)
],
),
);
}
}
// ignore: must_be_immutable
class Core extends BaseState<Core> {
var test = Test();
@override
List<Object> get props => [test];
}
// ignore: must_be_immutable
class Test extends BaseState<Test> {
var news = <News>[News(1), News(2)];
@override
List<Object> get props => [news];
}
// ignore: must_be_immutable
class News extends BaseState<News> {
bool isFavorite = false;
final id;
News(this.id);
@override
List<Object> get props => [isFavorite];
}