11import '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' ;
25
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+ );
415
5- class MyApp extends StatelessWidget {
6- // This widget is the root of your application.
16+ class HomePage extends StatefulWidget {
717 @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 ();
2619}
2720
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 > {
4122
42- @override
43- _MyHomePageState createState () => _MyHomePageState ();
44- }
23+ TextEditingController _controller = TextEditingController ();
4524
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+ }
5835 }
5936
6037 @override
6138 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.
6839 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+ ),
10299 ),
103100 ),
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.
109101 );
110102 }
111- }
103+ }
0 commit comments