1
1
import 'package:flutter/material.dart' ;
2
+ import 'package:github_following/Pages/FollowingPage.dart' ;
3
+ import 'package:github_following/Providers/UserProvider.dart' ;
4
+ import 'package:provider/provider.dart' ;
2
5
3
- void main () => runApp (MyApp ());
6
+ void main () => runApp (
7
+ ChangeNotifierProvider <UserProvider >(
8
+ builder: (context) => UserProvider (),
9
+ child: MaterialApp (
10
+ home: HomePage (),
11
+ debugShowCheckedModeBanner: false ,
12
+ ),
13
+ )
14
+ );
4
15
5
- class MyApp extends StatelessWidget {
6
- // This widget is the root of your application.
16
+ class HomePage extends StatefulWidget {
7
17
@override
8
- Widget build (BuildContext context) {
9
- return MaterialApp (
10
- title: 'Flutter Demo' ,
11
- theme: ThemeData (
12
- // This is the theme of your application.
13
- //
14
- // Try running your application with "flutter run". You'll see the
15
- // application has a blue toolbar. Then, without quitting the app, try
16
- // changing the primarySwatch below to Colors.green and then invoke
17
- // "hot reload" (press "r" in the console where you ran "flutter run",
18
- // or simply save your changes to "hot reload" in a Flutter IDE).
19
- // Notice that the counter didn't reset back to zero; the application
20
- // is not restarted.
21
- primarySwatch: Colors .blue,
22
- ),
23
- home: MyHomePage (title: 'Flutter Demo Home Page' ),
24
- );
25
- }
18
+ _StateHomePage createState () => _StateHomePage ();
26
19
}
27
20
28
- class MyHomePage extends StatefulWidget {
29
- MyHomePage ({Key key, this .title}) : super (key: key);
30
-
31
- // This widget is the home page of your application. It is stateful, meaning
32
- // that it has a State object (defined below) that contains fields that affect
33
- // how it looks.
34
-
35
- // This class is the configuration for the state. It holds the values (in this
36
- // case the title) provided by the parent (in this case the App widget) and
37
- // used by the build method of the State. Fields in a Widget subclass are
38
- // always marked "final".
39
-
40
- final String title;
21
+ class _StateHomePage extends State <HomePage > {
41
22
42
- @override
43
- _MyHomePageState createState () => _MyHomePageState ();
44
- }
23
+ TextEditingController _controller = TextEditingController ();
45
24
46
- class _MyHomePageState extends State <MyHomePage > {
47
- int _counter = 0 ;
48
-
49
- void _incrementCounter () {
50
- setState (() {
51
- // This call to setState tells the Flutter framework that something has
52
- // changed in this State, which causes it to rerun the build method below
53
- // so that the display can reflect the updated values. If we changed
54
- // _counter without calling setState(), then the build method would not be
55
- // called again, and so nothing would appear to happen.
56
- _counter++ ;
57
- });
25
+ void _getUser () {
26
+ if (_controller.text == '' ) {
27
+ Provider .of <UserProvider >(context).setMessage ('Please inter your username' );
28
+ } else {
29
+ Provider .of <UserProvider >(context).fetchUser (_controller.text).then ((value) {
30
+ if (value) {
31
+ Navigator .push (context, MaterialPageRoute (builder: (context) => FollowingPage ()));
32
+ }
33
+ });
34
+ }
58
35
}
59
36
60
37
@override
61
38
Widget build (BuildContext context) {
62
- // This method is rerun every time setState is called, for instance as done
63
- // by the _incrementCounter method above.
64
- //
65
- // The Flutter framework has been optimized to make rerunning build methods
66
- // fast, so that you can just rebuild anything that needs updating rather
67
- // than having to individually change instances of widgets.
68
39
return Scaffold (
69
- appBar: AppBar (
70
- // Here we take the value from the MyHomePage object that was created by
71
- // the App.build method, and use it to set our appbar title.
72
- title: Text (widget.title),
73
- ),
74
- body: Center (
75
- // Center is a layout widget. It takes a single child and positions it
76
- // in the middle of the parent.
77
- child: Column (
78
- // Column is also a layout widget. It takes a list of children and
79
- // arranges them vertically. By default, it sizes itself to fit its
80
- // children horizontally, and tries to be as tall as its parent.
81
- //
82
- // Invoke "debug painting" (press "p" in the console, choose the
83
- // "Toggle Debug Paint" action from the Flutter Inspector in Android
84
- // Studio, or the "Toggle Debug Paint" command in Visual Studio Code)
85
- // to see the wireframe for each widget.
86
- //
87
- // Column has various properties to control how it sizes itself and
88
- // how it positions its children. Here we use mainAxisAlignment to
89
- // center the children vertically; the main axis here is the vertical
90
- // axis because Columns are vertical (the cross axis would be
91
- // horizontal).
92
- mainAxisAlignment: MainAxisAlignment .center,
93
- children: < Widget > [
94
- Text (
95
- 'You have pushed the button this many times:' ,
96
- ),
97
- Text (
98
- '$_counter ' ,
99
- style: Theme .of (context).textTheme.display1,
100
- ),
101
- ],
40
+ body: Container (
41
+ color: Colors .black,
42
+ child: Padding (
43
+ padding: EdgeInsets .all (20 ),
44
+ child: Column (
45
+ children: < Widget > [
46
+ SizedBox (height: 100 ,),
47
+ Container (
48
+ width: 80 ,
49
+ height: 80 ,
50
+ child: CircleAvatar (
51
+ backgroundColor: Colors .transparent,
52
+ backgroundImage: NetworkImage ('https://icon-library.net/images/github-icon-png/github-icon-png-29.jpg' ),
53
+
54
+ ),
55
+
56
+ ),
57
+ SizedBox (height: 30 ,),
58
+ Text ("Github" , style: TextStyle (color: Colors .white, fontSize: 40 , fontWeight: FontWeight .bold),),
59
+ SizedBox (height: 150 ,),
60
+ Container (
61
+ padding: EdgeInsets .symmetric (horizontal: 15 , vertical: 10 ),
62
+ decoration: BoxDecoration (
63
+ borderRadius: BorderRadius .circular (10 ),
64
+ color: Colors .white.withOpacity (.1 )
65
+ ),
66
+ child: TextField (
67
+ onChanged: (value) {
68
+ Provider .of <UserProvider >(context).setMessage (null );
69
+ },
70
+ controller: _controller,
71
+ enabled: ! Provider .of <UserProvider >(context).isLoading (),
72
+ style: TextStyle (color: Colors .white),
73
+ decoration: InputDecoration (
74
+ errorText: Provider .of <UserProvider >(context).getMessage (),
75
+ border: InputBorder .none,
76
+ hintText: "Github username" ,
77
+ hintStyle: TextStyle (color: Colors .grey)
78
+ ),
79
+ ),
80
+ ),
81
+ SizedBox (height: 20 ,),
82
+ MaterialButton (
83
+ padding: EdgeInsets .all (20 ),
84
+ color: Colors .blue,
85
+ shape: RoundedRectangleBorder (
86
+ borderRadius: BorderRadius .circular (10 )
87
+ ),
88
+ child: Align (
89
+ child:
90
+ Provider .of <UserProvider >(context).isLoading () ?
91
+ CircularProgressIndicator (backgroundColor: Colors .white, strokeWidth: 2 ,) :
92
+ Text ('Get Your Following Now' , style: TextStyle (color: Colors .white),),
93
+ ), onPressed: () {
94
+ _getUser ();
95
+ },
96
+ )
97
+ ],
98
+ ),
102
99
),
103
100
),
104
- floatingActionButton: FloatingActionButton (
105
- onPressed: _incrementCounter,
106
- tooltip: 'Increment' ,
107
- child: Icon (Icons .add),
108
- ), // This trailing comma makes auto-formatting nicer for build methods.
109
101
);
110
102
}
111
- }
103
+ }
0 commit comments