1
1
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
+ }
2
17
3
18
void main () {
4
- runApp (const MyApp ());
19
+ runApp (const ProviderScope (child : MyApp () ));
5
20
}
6
21
7
22
class MyApp extends StatelessWidget {
@@ -11,115 +26,48 @@ class MyApp extends StatelessWidget {
11
26
@override
12
27
Widget build (BuildContext context) {
13
28
return MaterialApp (
14
- title: 'Flutter Demo' ,
29
+ title: 'Riverpod Demo' ,
15
30
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
+ ),
32
35
useMaterial3: true ,
33
36
),
34
- home: const MyHomePage (title : 'Flutter Demo Home Page' ),
37
+ home: const MyHomePage (),
35
38
);
36
39
}
37
40
}
38
41
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});
70
44
71
45
@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) {
79
47
return Scaffold (
80
48
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.
84
49
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" ),
88
51
),
89
52
body: Center (
90
- // Center is a layout widget. It takes a single child and positions it
91
- // in the middle of the parent.
92
53
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.
106
54
mainAxisAlignment: MainAxisAlignment .center,
107
55
children: < Widget > [
108
56
const Text (
109
57
'You have pushed the button this many times:' ,
110
58
),
111
59
Text (
112
- '$ _counter ' ,
60
+ ref. watch (counterProvider). toString () ,
113
61
style: Theme .of (context).textTheme.headlineMedium,
114
62
),
115
63
],
116
64
),
117
65
),
118
66
floatingActionButton: FloatingActionButton (
119
- onPressed: _incrementCounter ,
67
+ onPressed: () => ref. read (counterProvider.notifier). increment () ,
120
68
tooltip: 'Increment' ,
121
69
child: const Icon (Icons .add),
122
- ), // This trailing comma makes auto-formatting nicer for build methods.
70
+ ),
123
71
);
124
72
}
125
73
}
0 commit comments