Skip to content

Instantly share code, notes, and snippets.

@diegoveloper
Created April 11, 2021 21:00
Show Gist options
  • Save diegoveloper/dd2157b08aab7175669981256f0d9ee3 to your computer and use it in GitHub Desktop.
Save diegoveloper/dd2157b08aab7175669981256f0d9ee3 to your computer and use it in GitHub Desktop.
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
void main() {
runApp(MyApp());
}
class Counter {
final int count;
final String name;
Counter(this.count, this.name);
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: CounterPage.init(context),
);
}
}
class CounterProvider {
final _counterController = StreamController<Counter>();
Stream<Counter> get streamCounter => _counterController.stream;
final _sliderController = StreamController<int>();
Stream<int> get streamSlider => _sliderController.stream;
int _count = 0;
void increment() {
_count = _count + 1;
_counterController.add(Counter(_count, 'diego'));
}
void decrement() {
_count = _count - 1;
_counterController.add(Counter(_count, 'diego'));
}
void onChange(double val) {
_sliderController.add(val.toInt());
}
void dispose() {
_sliderController.close();
_counterController.close();
}
}
class CounterPage extends StatefulWidget {
CounterPage._();
static Widget init(BuildContext context) {
final provider = CounterProvider();
return MultiProvider(
providers: [
Provider<CounterProvider>(
create: (_) => provider,
),
StreamProvider<Counter>(
create: (_) => provider.streamCounter,
),
StreamProvider<int>(
create: (_) => provider.streamSlider,
)
],
child: CounterPage._(),
);
}
@override
_CounterPageState createState() => _CounterPageState();
}
class _CounterPageState extends State<CounterPage> {
@override
void dispose() {
Provider.of<CounterProvider>(context, listen: false).dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
final provider = Provider.of<CounterProvider>(context, listen: false);
print('rebuild');
return Scaffold(
appBar: AppBar(
title: Text('Counter App'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Consumer<Counter>(builder: (context, value, _) {
final c = value?.count;
return Text(
'${c?.toString() ?? 0}',
style: TextStyle(fontSize: 80.0),
);
}),
SizedBox(
height: 20.0,
),
Consumer<int>(builder: (context, value, _) {
return Slider(
value: value?.toDouble() ?? 1,
min: 1,
max: 100,
onChanged: provider.onChange,
);
}),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
FloatingActionButton(
onPressed: provider.increment,
child: Icon(Icons.add),
tooltip: 'Increment',
),
SizedBox(width: 20.0),
FloatingActionButton(
onPressed: provider.decrement,
child: Icon(Icons.remove),
tooltip: 'Decrement',
),
],
)
],
),
),
);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment