1
1
import 'package:flutter/material.dart' ;
2
+ import 'package:github/github.dart' ;
3
+
4
+ import 'github_oauth_credentials.dart' ;
5
+ import 'src/github_login.dart' ;
2
6
3
7
void main () {
4
8
runApp (const MyApp ());
@@ -7,119 +11,55 @@ void main() {
7
11
class MyApp extends StatelessWidget {
8
12
const MyApp ({super .key});
9
13
10
- // This widget is the root of your application.
11
14
@override
12
15
Widget build (BuildContext context) {
13
16
return MaterialApp (
14
- title: 'Flutter Demo ' ,
17
+ title: 'GitHub Client ' ,
15
18
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 blue 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),
19
+ primarySwatch: Colors .blue,
20
+ visualDensity: VisualDensity .adaptivePlatformDensity,
32
21
useMaterial3: true ,
33
22
),
34
- home: const MyHomePage (title: 'Flutter Demo Home Page ' ),
23
+ home: const MyHomePage (title: 'GitHub Client ' ),
35
24
);
36
25
}
37
26
}
38
27
39
- class MyHomePage extends StatefulWidget {
28
+ class MyHomePage extends StatelessWidget {
40
29
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
30
final String title;
52
31
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
- }
70
-
71
32
@override
72
33
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.
79
- return Scaffold (
80
- 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
- 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),
88
- ),
89
- body: Center (
90
- // Center is a layout widget. It takes a single child and positions it
91
- // in the middle of the parent.
92
- 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
- mainAxisAlignment: MainAxisAlignment .center,
107
- children: < Widget > [
108
- const Text (
109
- 'You have pushed the button this many times:' ,
110
- ),
111
- Text (
112
- '$_counter ' ,
113
- style: Theme .of (context).textTheme.headlineMedium,
114
- ),
115
- ],
116
- ),
117
- ),
118
- floatingActionButton: FloatingActionButton (
119
- onPressed: _incrementCounter,
120
- tooltip: 'Increment' ,
121
- child: const Icon (Icons .add),
122
- ), // This trailing comma makes auto-formatting nicer for build methods.
34
+ return GithubLoginWidget (
35
+ builder: (context, httpClient) {
36
+ return FutureBuilder <CurrentUser >(
37
+ future: viewerDetail (httpClient.credentials.accessToken),
38
+ builder: (context, snapshot) {
39
+ return Scaffold (
40
+ appBar: AppBar (
41
+ title: Text (title),
42
+ elevation: 2 ,
43
+ ),
44
+ body: Center (
45
+ child: Text (
46
+ snapshot.hasData
47
+ ? 'Hello ${snapshot .data !.login }!'
48
+ : 'Retrieving viewer login details...' ,
49
+ ),
50
+ ),
51
+ );
52
+ },
53
+ );
54
+ },
55
+ githubClientId: githubClientId,
56
+ githubClientSecret: githubClientSecret,
57
+ githubScopes: githubScopes,
123
58
);
124
59
}
125
60
}
61
+
62
+ Future <CurrentUser > viewerDetail (String accessToken) async {
63
+ final gitHub = GitHub (auth: Authentication .withToken (accessToken));
64
+ return gitHub.users.getCurrentUser ();
65
+ }
0 commit comments