Skip to content

Commit d538c30

Browse files
committed
Riverpod counter
1 parent 0396f41 commit d538c30

File tree

2 files changed

+53
-81
lines changed

2 files changed

+53
-81
lines changed

lib/main.dart

+29-81
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,22 @@
11
import 'package:flutter/material.dart';
2+
import 'package:flutter_riverpod/flutter_riverpod.dart';
3+
import 'package:riverpod_annotation/riverpod_annotation.dart';
4+
part 'main.g.dart';
5+
6+
@riverpod
7+
class Counter extends _$Counter {
8+
@override
9+
int build() {
10+
return 0;
11+
}
12+
13+
increment() {
14+
return state++;
15+
}
16+
}
217

318
void main() {
4-
runApp(const MyApp());
19+
runApp(const ProviderScope(child: MyApp()));
520
}
621

722
class MyApp extends StatelessWidget {
@@ -11,115 +26,48 @@ class MyApp extends StatelessWidget {
1126
@override
1227
Widget build(BuildContext context) {
1328
return MaterialApp(
14-
title: 'Flutter Demo',
29+
title: 'Riverpod Demo',
1530
theme: ThemeData(
16-
// This is the theme of your application.
17-
//
18-
// TRY THIS: Try running your application with "flutter run". You'll see
19-
// the application has a purple toolbar. Then, without quitting the app,
20-
// try changing the seedColor in the colorScheme below to Colors.green
21-
// and then invoke "hot reload" (save your changes or press the "hot
22-
// reload" button in a Flutter-supported IDE, or press "r" if you used
23-
// the command line to start the app).
24-
//
25-
// Notice that the counter didn't reset back to zero; the application
26-
// state is not lost during the reload. To reset the state, use hot
27-
// restart instead.
28-
//
29-
// This works for code too, not just values: Most code changes can be
30-
// tested with just a hot reload.
31-
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
31+
colorScheme: ColorScheme.fromSeed(
32+
seedColor: Colors.deepPurple,
33+
brightness: Brightness.dark,
34+
),
3235
useMaterial3: true,
3336
),
34-
home: const MyHomePage(title: 'Flutter Demo Home Page'),
37+
home: const MyHomePage(),
3538
);
3639
}
3740
}
3841

39-
class MyHomePage extends StatefulWidget {
40-
const MyHomePage({super.key, required this.title});
41-
42-
// This widget is the home page of your application. It is stateful, meaning
43-
// that it has a State object (defined below) that contains fields that affect
44-
// how it looks.
45-
46-
// This class is the configuration for the state. It holds the values (in this
47-
// case the title) provided by the parent (in this case the App widget) and
48-
// used by the build method of the State. Fields in a Widget subclass are
49-
// always marked "final".
50-
51-
final String title;
52-
53-
@override
54-
State<MyHomePage> createState() => _MyHomePageState();
55-
}
56-
57-
class _MyHomePageState extends State<MyHomePage> {
58-
int _counter = 0;
59-
60-
void _incrementCounter() {
61-
setState(() {
62-
// This call to setState tells the Flutter framework that something has
63-
// changed in this State, which causes it to rerun the build method below
64-
// so that the display can reflect the updated values. If we changed
65-
// _counter without calling setState(), then the build method would not be
66-
// called again, and so nothing would appear to happen.
67-
_counter++;
68-
});
69-
}
42+
class MyHomePage extends ConsumerWidget {
43+
const MyHomePage({super.key});
7044

7145
@override
72-
Widget build(BuildContext context) {
73-
// This method is rerun every time setState is called, for instance as done
74-
// by the _incrementCounter method above.
75-
//
76-
// The Flutter framework has been optimized to make rerunning build methods
77-
// fast, so that you can just rebuild anything that needs updating rather
78-
// than having to individually change instances of widgets.
46+
Widget build(BuildContext context, WidgetRef ref) {
7947
return Scaffold(
8048
appBar: AppBar(
81-
// TRY THIS: Try changing the color here to a specific color (to
82-
// Colors.amber, perhaps?) and trigger a hot reload to see the AppBar
83-
// change color while the other colors stay the same.
8449
backgroundColor: Theme.of(context).colorScheme.inversePrimary,
85-
// Here we take the value from the MyHomePage object that was created by
86-
// the App.build method, and use it to set our appbar title.
87-
title: Text(widget.title),
50+
title: const Text("Riverpod Demo"),
8851
),
8952
body: Center(
90-
// Center is a layout widget. It takes a single child and positions it
91-
// in the middle of the parent.
9253
child: Column(
93-
// Column is also a layout widget. It takes a list of children and
94-
// arranges them vertically. By default, it sizes itself to fit its
95-
// children horizontally, and tries to be as tall as its parent.
96-
//
97-
// Column has various properties to control how it sizes itself and
98-
// how it positions its children. Here we use mainAxisAlignment to
99-
// center the children vertically; the main axis here is the vertical
100-
// axis because Columns are vertical (the cross axis would be
101-
// horizontal).
102-
//
103-
// TRY THIS: Invoke "debug painting" (choose the "Toggle Debug Paint"
104-
// action in the IDE, or press "p" in the console), to see the
105-
// wireframe for each widget.
10654
mainAxisAlignment: MainAxisAlignment.center,
10755
children: <Widget>[
10856
const Text(
10957
'You have pushed the button this many times:',
11058
),
11159
Text(
112-
'$_counter',
60+
ref.watch(counterProvider).toString(),
11361
style: Theme.of(context).textTheme.headlineMedium,
11462
),
11563
],
11664
),
11765
),
11866
floatingActionButton: FloatingActionButton(
119-
onPressed: _incrementCounter,
67+
onPressed: () => ref.read(counterProvider.notifier).increment(),
12068
tooltip: 'Increment',
12169
child: const Icon(Icons.add),
122-
), // This trailing comma makes auto-formatting nicer for build methods.
70+
),
12371
);
12472
}
12573
}

lib/main.g.dart

+24
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)