urlLauncher(String url) async // function for launching url
11 | {
12 | if (await canLaunch(url)) {
13 | return await launch(url);
14 | } else {
15 | throw 'Cannot launch $url';
16 | }
17 | }
18 |
19 | @override
20 | Widget build(BuildContext context) {
21 | return Scaffold(
22 | backgroundColor: Colors.white,
23 | appBar: AppBar(
24 | title: Text("About Us"),
25 | ),
26 | drawer: CustomAppDrawer(),
27 | body: SafeArea(
28 | child: SingleChildScrollView(
29 | child: Column(children: [
30 | Container(
31 | margin: EdgeInsets.only(top: 20),
32 | child: Center(
33 | child: Text(
34 | 'GeeksForGeeks Student Chapter',
35 | textAlign: TextAlign.center,
36 | style: TextStyle(
37 | color: Color(0xFF2F8D46),
38 | fontSize: 30,
39 | fontWeight: FontWeight.bold),
40 | ),
41 | ),
42 | ),
43 | SizedBox(
44 | height: 10,
45 | ),
46 | Container(
47 | margin: EdgeInsets.only(top: 20),
48 | child: Center(
49 | child: CircleAvatar(
50 | backgroundColor: Color(0xFF2F8D46),
51 | radius: 70,
52 | child: CircleAvatar(
53 | backgroundImage: AssetImage('assets/images/logo.jpeg'),
54 | radius: 67,
55 | foregroundColor: Color(0xFF2F8D46),
56 | ),
57 | )),
58 | ),
59 | SizedBox(
60 | height: 20,
61 | ),
62 | Row(
63 | mainAxisAlignment: MainAxisAlignment.center,
64 | children: [
65 | TypewriterAnimatedTextKit(
66 | text: ['About Us'],
67 | speed: Duration(milliseconds: 100),
68 | repeatForever: true,
69 | textStyle: TextStyle(
70 | color: Color(0xFF2F8D46),
71 | fontSize: 30,
72 | )),
73 | Icon(
74 | Icons.info,
75 | color: Color(0xFF2F8D46),
76 | size: 30,
77 | ),
78 | ],
79 | ),
80 | SizedBox(
81 | height: 20,
82 | ),
83 | Container(
84 | margin: EdgeInsets.only(left: 20, right: 20),
85 | child: Text(
86 | "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.",
87 | style: TextStyle(fontSize: 18),
88 | textAlign: TextAlign.start,
89 | )),
90 | SizedBox(
91 | height: 20,
92 | ),
93 | ]),
94 | ),
95 | ),
96 | );
97 | }
98 | }
99 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 | Welcome to GameofSource Mobile Application Development Arena.
24 |
25 | About Event
26 | Game of Source is a Open-Source Contribution event being organized by GeeksForGeeks and its student chapters across PAN India.
27 | The event is going to witness the participation from students of over 100+ colleges in various cities and will provide a plethora of opportunities to budding developers to directly learn from the domain experts and try their hands on practical execution of events in this celebration of learning.
28 |
29 | What participants must do
30 | Participants will be given an issue as a feature to develop in the web development template. Issues will be opened in github repository at a time specified earlier in the whatsapp group. Once going through the issues published participants must request the issue to be assigned to them. We check the participants github when there are many requests and assign an issue to a single participant only. Once assigned participants must solve that issue within 48 hours and make a pull request to repository from the branch. Our repo maintainers will go through the pull request thoroughly and can merge once satisfied all the rules mentioned in CONTRIBUTING.md file. If a participant is failed to make pull request and didn't show any prorgress on that issue within 24 hours, the issue will be cancelled and we assign that issue to another participant.
31 |
32 | Participants will be given an issue as a feature to develop in the ios and android application template. Issues will be opened in github repository at a time specified earlier in the slack channel. Once going through that issue participants must request the issue to be assigned to them. Once assigned participants must solve that issue within two days and make a push request to repository as a branch. Our event handlers will go through the pull request thoroughly and can merge once satisfied all the rules mentioned in CONTRIBUTING.md file.
33 |
34 | Important Resources
35 | Guide to Fork A repository : Click Here
36 | Guide to make a Pull request: Click Here
37 |
38 | Contact Us
39 | All the participant queries will be resolved in whatsapp group.
40 | Link to join https://chat.whatsapp.com/L9QKq3rqJKE3BfAV1yfFz4
41 |
--------------------------------------------------------------------------------
/lib/screens/social_media.dart:
--------------------------------------------------------------------------------
1 | // page for social media links of geeks for geeks
2 | import 'package:flutter/material.dart';
3 | import 'package:font_awesome_flutter/font_awesome_flutter.dart';
4 | import 'package:url_launcher/url_launcher.dart';
5 |
6 | import '../widgets/CustomAppDrawer.dart';
7 |
8 | class SocialMediaLinks extends StatefulWidget {
9 | static final String routeName = "/socialmedia";
10 |
11 | @override
12 | _SocialMediaLinksState createState() => _SocialMediaLinksState();
13 | }
14 |
15 | class _SocialMediaLinksState extends State {
16 | //urls for gfg different social media
17 | String fburl = "https://www.facebook.com/geeksforgeeks.org/";
18 | String websiteurl = "https://www.geeksforgeeks.org/";
19 | String twitterUrl = "https://twitter.com/geeksforgeeks";
20 | String linkedinUrl = "https://www.linkedin.com/company/geeksforgeeks/";
21 | String youtubeUrl = "https://www.youtube.com/geeksforgeeksvideos";
22 | String instagramUrl = "https://www.instagram.com/geeks_for_geeks/";
23 |
24 | @override
25 | Widget build(BuildContext context) {
26 | return Scaffold(
27 | drawer: CustomAppDrawer(),
28 | appBar: AppBar(
29 | title: Text('GFG Social media'),
30 | centerTitle: true,
31 | ),
32 | body: Center(
33 | child: FittedBox(
34 | child: Row(
35 | mainAxisAlignment: MainAxisAlignment.spaceEvenly,
36 | children: [
37 | if (fburl != null)
38 | IconButton(
39 | icon: Icon(
40 | FontAwesomeIcons.facebookF,
41 | size: 20,
42 | ),
43 | onPressed: () {
44 | launch(fburl);
45 | },
46 | ),
47 | if (instagramUrl != null)
48 | IconButton(
49 | icon: Icon(
50 | FontAwesomeIcons.instagram,
51 | size: 20,
52 | ),
53 | onPressed: () {
54 | launch(instagramUrl);
55 | },
56 | ),
57 | if (twitterUrl != null)
58 | IconButton(
59 | icon: Icon(
60 | FontAwesomeIcons.twitter,
61 | size: 20,
62 | ),
63 | onPressed: () {
64 | launch(twitterUrl);
65 | },
66 | ),
67 | if (linkedinUrl != null)
68 | IconButton(
69 | icon: Icon(
70 | FontAwesomeIcons.linkedinIn,
71 | size: 20,
72 | ),
73 | onPressed: () {
74 | launch(linkedinUrl);
75 | },
76 | ),
77 | if (youtubeUrl != null)
78 | IconButton(
79 | icon: Icon(
80 | FontAwesomeIcons.youtube,
81 | size: 20,
82 | ),
83 | onPressed: () {
84 | launch(youtubeUrl);
85 | },
86 | ),
87 | if (websiteurl != null)
88 | IconButton(
89 | icon: Icon(
90 | FontAwesomeIcons.chrome,
91 | size: 20,
92 | ),
93 | onPressed: () {
94 | launch(websiteurl);
95 | },
96 | )
97 | //in case of null
98 | else
99 | IconButton(
100 | icon: Icon(
101 | FontAwesomeIcons.question,
102 | size: 20,
103 | ),
104 | onPressed: () {
105 | CircularProgressIndicator();
106 | },
107 | ),
108 | ],
109 | ),
110 | ),
111 | ),
112 | );
113 | }
114 | }
115 |
--------------------------------------------------------------------------------
/lib/screens/mission.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:animated_text_kit/animated_text_kit.dart';
3 |
4 | import '../widgets/CustomAppDrawer.dart';
5 |
6 | class MissionAndVision extends StatefulWidget {
7 | static final String routeName = "/mission";
8 |
9 | @override
10 | _MissionAndVisionState createState() => _MissionAndVisionState();
11 | }
12 |
13 | class _MissionAndVisionState extends State {
14 | @override
15 | Widget build(BuildContext context) {
16 | return Scaffold(
17 | drawer: CustomAppDrawer(),
18 | appBar: AppBar(
19 | title: Text(
20 | "Mission & Vision",
21 | ),
22 | centerTitle: true,
23 | ),
24 | body: SingleChildScrollView(
25 | child: Container(
26 | child: Column(
27 | children: [
28 | SizedBox(
29 | height: 20.0,
30 | ),
31 | SizedBox(
32 | height: 80.0,
33 | child: TextLiquidFill(
34 | text: 'Mission Of GFG',
35 | waveColor: Colors.white,
36 | boxBackgroundColor: Color.fromRGBO(128, 199, 131, 1),
37 | textStyle: TextStyle(
38 | fontSize: 40.0,
39 | fontWeight: FontWeight.bold,
40 | ),
41 | boxHeight: 80.0,
42 | ),
43 | ),
44 | SizedBox(
45 | height: 550.0,
46 | child: Padding(
47 | padding: EdgeInsets.all(20.0),
48 | child: Text(
49 | "With the idea ofg imparting programming knowledge, Mr. Sandeep Jain, an IIT Roorkee alumnus started a dream, GeeksforGeeks. Whether programming excites you or you feel stifled, wondering how to prepare for interview questions or how to ace data structures and algorithms, GeeksforGeeks is a one-stop solution. With every tick of time, we are adding arrows in our quiver. From articles on various computer science subjects to programming problems for practice, from basic to premium courses, from technologies to entrance examinations, we have been building ample content with superior quality.",
50 | style: TextStyle(
51 | fontSize: 22.0,
52 | color: Colors.black,
53 | ),
54 | ),
55 | ),
56 | ),
57 | SizedBox(
58 | height: 20.0,
59 | ),
60 | SizedBox(
61 | height: 80.0,
62 | child: TextLiquidFill(
63 | text: 'Vision Of GFG',
64 | waveColor: Colors.white,
65 | boxBackgroundColor: Color.fromRGBO(128, 199, 131, 1),
66 | textStyle: TextStyle(
67 | fontSize: 40.0,
68 | fontWeight: FontWeight.bold,
69 | ),
70 | boxHeight: 80.0,
71 | ),
72 | ),
73 | SizedBox(
74 | height: 550.0,
75 | child: Padding(
76 | padding: EdgeInsets.all(20.0),
77 | child: Text(
78 | "Lorem ipsum is a pseudo-Latin text used in web design, typography, layout, and printing in place of English to emphasise design elements over content. It's also called placeholder (or filler) text. It's a convenient tool for mock-ups. It helps to outline the visual elements of a document or presentation, eg typography, font, or layout. Lorem ipsum is mostly a part of a Latin text by the classical author and philosopher Cicero. Its words and letters have been changed by addition or removal, so to deliberately render its content nonsensical; it's not genuine, correct, or comprehensible Latin anymore.",
79 | style: TextStyle(
80 | fontSize: 22.0,
81 | color: Colors.black,
82 | ),
83 | ),
84 | ),
85 | ),
86 | ],
87 | ),
88 | ),
89 | ),
90 | );
91 | }
92 | }
93 |
--------------------------------------------------------------------------------
/lib/screens/contact_us_screen.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:fluttertoast/fluttertoast.dart';
3 |
4 | import '../components/embedded_map.dart';
5 | import '../services/firebase_storage_service.dart';
6 | import '../components/my_text_field.dart';
7 | import '../widgets/CustomAppDrawer.dart';
8 |
9 | // ignore: must_be_immutable
10 | class ContactUs extends StatelessWidget {
11 | static final String routeName = "/contact_us";
12 |
13 | final GlobalKey _formKey = GlobalKey();
14 |
15 | String _name, _email, _phone, _message;
16 |
17 | @override
18 | Widget build(BuildContext context) {
19 | return SafeArea(
20 | child: Scaffold(
21 | drawer: CustomAppDrawer(),
22 | appBar: AppBar(
23 | title: Text("Contact Us"),
24 | backgroundColor: Color(0xFF2F8D46),
25 | actions: [
26 | // submit form button
27 | IconButton(
28 | icon: Icon(Icons.send),
29 | onPressed: () {
30 | if (_formKey.currentState.validate()) {
31 | FirebaseStorageService.contactFormHandler(
32 | _name, _email, _phone, _message)
33 | .then((value) {
34 | _formKey.currentState.reset();
35 | Fluttertoast.showToast(
36 | backgroundColor: Color(0xFF2F8D46),
37 | msg: "Your response has been recorded!");
38 | }).catchError((error) {
39 | print(error);
40 | });
41 | } else {
42 | Fluttertoast.showToast(
43 | msg: "Please enter valid data!",
44 | backgroundColor: Color(0xFF2F8D46));
45 | }
46 | }),
47 | ],
48 | ),
49 | body: Form(
50 | key: _formKey,
51 | child: ListView(
52 | physics: BouncingScrollPhysics(),
53 | children: [
54 | MyTextField(
55 | labelText: "Name",
56 | onChanged: (String name) => _name = name,
57 | textCapitalization: TextCapitalization.words,
58 | validator: (String value) {
59 | if (value == null || value.trim() == "")
60 | return "Please enter your name";
61 | },
62 | prefixIconData: Icons.person,
63 | ),
64 | MyTextField(
65 | labelText: "Email",
66 | onChanged: (String email) => _email = email,
67 | keyboardType: TextInputType.emailAddress,
68 | validator: (String value) {
69 | if (value == null || value.trim() == "")
70 | return "Please enter an email address";
71 | else if (!(value.contains("@") && value.contains(".")))
72 | return "Please enter a valid email address";
73 | },
74 | prefixIconData: Icons.alternate_email,
75 | ),
76 | MyTextField(
77 | labelText: "Phone",
78 | onChanged: (String phone) => _phone = phone,
79 | keyboardType: TextInputType.phone,
80 | validator: (String value) {
81 | if (value == null || value.trim() == "")
82 | return "Please enter your phone number";
83 | },
84 | prefixIconData: Icons.phone,
85 | ),
86 | MyTextField(
87 | labelText: "Message",
88 | onChanged: (String message) => _message = message,
89 | textCapitalization: TextCapitalization.sentences,
90 | validator: (String value) {
91 | if (value == null || value.trim() == "")
92 | return "Please enter the message";
93 | },
94 | enableMultilineText: true,
95 | prefixIconData: Icons.message,
96 | ),
97 | SizedBox(
98 | height: 20.0,
99 | ),
100 | Column(
101 | children: [
102 | EmbeddedMap(),
103 | ],
104 | )
105 | ],
106 | ),
107 | ),
108 | ),
109 | );
110 | }
111 | }
112 |
--------------------------------------------------------------------------------
/lib/screens/EventRegistration.dart:
--------------------------------------------------------------------------------
1 | import 'package:cloud_firestore/cloud_firestore.dart';
2 | import 'package:flutter/material.dart';
3 | import 'package:our_gfg/models/event.dart';
4 | import 'package:our_gfg/services/firebase_storage_service.dart';
5 |
6 | import '../widgets/CustomAppDrawer.dart';
7 |
8 | class EventRegistration extends StatefulWidget {
9 | static final String routeName = "/event_registration";
10 | @override
11 | _EventRegistrationState createState() => _EventRegistrationState();
12 | }
13 |
14 | class _EventRegistrationState extends State {
15 | TextEditingController name = TextEditingController();
16 | TextEditingController usn = TextEditingController();
17 | TextEditingController email = TextEditingController();
18 | TextEditingController event = TextEditingController();
19 | final _formKey = GlobalKey();
20 |
21 | String dropDownHint = 'Select Event';
22 | List eventList = [];
23 |
24 | @override
25 | void initState() {
26 | fetchEvents();
27 | super.initState();
28 | }
29 |
30 | void fetchEvents() async {
31 | List event = await FirebaseStorageService.getUpcomingEvents();
32 | setState(() {
33 | for (Event i in event) {
34 | eventList.add(i.title);
35 | }
36 | });
37 | }
38 |
39 | @override
40 | Widget build(BuildContext context) {
41 | return Scaffold(
42 | appBar: AppBar(
43 | title: Text(
44 | "Register",
45 | style: TextStyle(fontSize: null),
46 | ),
47 | ),
48 | drawer: CustomAppDrawer(),
49 | body: SafeArea(
50 | top: false,
51 | bottom: false,
52 | child: Form(
53 | key: _formKey,
54 | child: ListView(
55 | padding: const EdgeInsets.symmetric(horizontal: 16.0),
56 | children: [
57 | Divider(),
58 | TextFormField(
59 | decoration: const InputDecoration(
60 | border: OutlineInputBorder(),
61 | prefixIcon: const Icon(Icons.person),
62 | hintText: 'Enter your first and last name',
63 | labelText: 'Name',
64 | ),
65 | controller: name,
66 | ),
67 | TextFormField(
68 | decoration: const InputDecoration(
69 | border: OutlineInputBorder(),
70 | prefixIcon: const Icon(Icons.carpenter_rounded),
71 | hintText: 'Enter your USN',
72 | labelText: 'USN',
73 | ),
74 | controller: usn,
75 | ),
76 | TextFormField(
77 | decoration: const InputDecoration(
78 | border: OutlineInputBorder(),
79 | prefixIcon: const Icon(Icons.email),
80 | hintText: 'Enter a email address',
81 | labelText: 'Email',
82 | ),
83 | controller: email,
84 | keyboardType: TextInputType.emailAddress,
85 | ),
86 | DropdownButton(
87 | hint: Text(
88 | dropDownHint,
89 | style: TextStyle(
90 | color: Colors.grey,
91 | ),
92 | ),
93 | items: eventList.map((String value) {
94 | return DropdownMenuItem(
95 | value: value,
96 | child: Text(value),
97 | );
98 | }).toList(),
99 | onChanged: (val) {
100 | setState(() {
101 | dropDownHint = val;
102 | });
103 | },
104 | ),
105 | Container(
106 | padding: const EdgeInsets.only(left: 40.0, top: 20.0),
107 | child: RaisedButton(
108 | child: const Text('Submit'),
109 | onPressed: () async {
110 | await FirebaseFirestore.instance
111 | .collection('EventRegistration')
112 | .add({
113 | 'Name': name.text,
114 | 'usn': usn.text,
115 | 'email': email.text,
116 | 'event': event.text
117 | }).then(
118 | (value) {
119 | Navigator.of(context).pop();
120 | },
121 | );
122 | },
123 | ),
124 | ),
125 | ],
126 | ),
127 | ),
128 | ),
129 | );
130 | }
131 | }
132 |
--------------------------------------------------------------------------------
/lib/components/newsletter.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:fluttertoast/fluttertoast.dart';
3 |
4 | import '../services/firebase_storage_service.dart';
5 |
6 | class Newsletter extends StatefulWidget {
7 | @override
8 | _NewsletterState createState() => _NewsletterState();
9 | }
10 |
11 | class _NewsletterState extends State {
12 | final _formKey = GlobalKey();
13 |
14 | final TextEditingController _emailController = TextEditingController();
15 |
16 | @override
17 | void dispose() {
18 | super.dispose();
19 | _emailController.dispose();
20 | }
21 |
22 | @override
23 | Widget build(BuildContext context) {
24 | return Container(
25 | alignment: Alignment.center,
26 | color: Color.fromRGBO(47, 141, 70, 1),
27 | child: Container(
28 | height: 300,
29 | child: Card(
30 | elevation: 18.0,
31 | shape: RoundedRectangleBorder(
32 | borderRadius: BorderRadius.circular(58.0),
33 | ),
34 | child: Padding(
35 | padding: EdgeInsets.all(8.8),
36 | child: Center(
37 | child: Column(
38 | children: [
39 | SizedBox(
40 | height: 12.0,
41 | ),
42 | Text(
43 | "Join Our Newsletter",
44 | style: TextStyle(
45 | color: Color.fromRGBO(47, 141, 70, 1),
46 | fontSize: 25.0,
47 | fontWeight: FontWeight.bold,
48 | ),
49 | textAlign: TextAlign.center,
50 | ),
51 | SizedBox(
52 | height: 12.0,
53 | ),
54 | Text(
55 | "Be one of the first to be notified when\nwe have an update...",
56 | style: TextStyle(
57 | color: Color.fromRGBO(47, 141, 70, 1),
58 | fontSize: 18.0,
59 | ),
60 | textAlign: TextAlign.center,
61 | ),
62 | SizedBox(height: 12),
63 | Form(
64 | key: _formKey,
65 | child: Column(
66 | // crossAxisAlignment: CrossAxisAlignment.start,
67 | children: [
68 | TextFormField(
69 | decoration: const InputDecoration(
70 | hintText: 'Enter your email',
71 | ),
72 | controller: _emailController,
73 | validator: (String value) {
74 | String pattern =
75 | r'^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$';
76 | RegExp regExp = new RegExp(pattern);
77 | if (value.length == 0) {
78 | return "Email is Required";
79 | } else if (!regExp.hasMatch(value)) {
80 | return "Invalid Email";
81 | } else {
82 | return null;
83 | }
84 | }),
85 | Padding(
86 | padding: const EdgeInsets.all(15),
87 | child: Center(
88 | child: RaisedButton(
89 | color: Color.fromRGBO(47, 141, 70, 1),
90 | onPressed: () async {
91 | if (_formKey.currentState.validate()) {
92 | try {
93 | await FirebaseStorageService
94 | .subscribeToNewsletter(
95 | _emailController.text?.trim());
96 | _emailController.clear();
97 | Fluttertoast.showToast(
98 | msg: "Subscribed successfully");
99 | } catch (e) {
100 | Fluttertoast.showToast(
101 | msg:
102 | "An error occurred. Please try again later");
103 | }
104 | }
105 | },
106 | child: Text(
107 | 'Subscribe',
108 | style: TextStyle(
109 | color: Colors.white,
110 | fontSize: 18,
111 | ),
112 | ),
113 | ),
114 | ),
115 | ),
116 | ],
117 | ),
118 | ),
119 | SizedBox(
120 | height: 12,
121 | ),
122 | ],
123 | ),
124 | ),
125 | ),
126 | ),
127 | ),
128 | );
129 | }
130 | }
131 |
--------------------------------------------------------------------------------
/lib/models/individual_member.dart:
--------------------------------------------------------------------------------
1 | import 'dart:math';
2 |
3 | import 'package:cached_network_image/cached_network_image.dart';
4 | import 'package:flutter/material.dart';
5 | import 'package:font_awesome_flutter/font_awesome_flutter.dart';
6 | import 'package:url_launcher/url_launcher.dart';
7 |
8 | import '../utils/tools.dart';
9 | import 'members.dart';
10 |
11 | class IndividualMember extends StatelessWidget {
12 | final Member member;
13 |
14 | const IndividualMember({Key key, this.member}) : super(key: key);
15 | @override
16 | Widget build(BuildContext context) {
17 | return Card(
18 | elevation: 0.0,
19 | child: Padding(
20 | padding: const EdgeInsets.all(12.0),
21 | child: Row(
22 | mainAxisSize: MainAxisSize.min,
23 | children: [
24 | ConstrainedBox(
25 | constraints: BoxConstraints.expand(
26 | height: MediaQuery.of(context).size.height * 0.2,
27 | width: MediaQuery.of(context).size.width * 0.3,
28 | ),
29 | child:
30 | (member.speakerImage == "" || member.speakerImage == null)
31 | ? FittedBox(
32 | fit: BoxFit.contain,
33 | child: Icon(
34 | Icons.account_circle,
35 | color: Colors.green,
36 | ),
37 | )
38 | : CachedNetworkImage(
39 | imageUrl: member.speakerImage ?? "",
40 | imageBuilder: (context, imageProvider) => Container(
41 | decoration: BoxDecoration(
42 | image: DecorationImage(
43 | image: imageProvider,
44 | fit: BoxFit.cover,
45 | ),
46 | ),
47 | ),
48 | progressIndicatorBuilder:
49 | (context, url, downloadProgress) =>
50 | CircularProgressIndicator(
51 | value: downloadProgress.progress),
52 | errorWidget: (context, url, error) {
53 | print(error.toString());
54 | return FittedBox(
55 | fit: BoxFit.contain,
56 | child: Icon(
57 | Icons.error,
58 | color: Colors.red,
59 | ),
60 | );
61 | })),
62 | SizedBox(
63 | width: 20,
64 | ),
65 | Expanded(
66 | child: Column(
67 | crossAxisAlignment: CrossAxisAlignment.start,
68 | mainAxisAlignment: MainAxisAlignment.start,
69 | mainAxisSize: MainAxisSize.min,
70 | children: [
71 | Column(
72 | crossAxisAlignment: CrossAxisAlignment.start,
73 | mainAxisSize: MainAxisSize.min,
74 | children: [
75 | Text(
76 | member.speakerName,
77 | style: Theme.of(context).textTheme.headline6,
78 | ),
79 | SizedBox(
80 | height: 5,
81 | ),
82 | AnimatedContainer(
83 | duration: Duration(seconds: 1),
84 | width: MediaQuery.of(context).size.width * 0.2,
85 | height: 5,
86 | color: Tools.multiColors[Random().nextInt(4)],
87 | ),
88 | ],
89 | ),
90 | SizedBox(
91 | height: 10,
92 | ),
93 | Text(member.speakerDesc,
94 | style: Theme.of(context).textTheme.headline6),
95 | SizedBox(
96 | height: 10,
97 | ),
98 | Text(
99 | member.speakerSession,
100 | style: Theme.of(context).textTheme.caption,
101 | ),
102 | socialActions(context, member),
103 | ],
104 | ),
105 | )
106 | ],
107 | ),
108 | ),
109 | );
110 | }
111 | }
112 |
113 | Widget socialActions(context, Member developers) => FittedBox(
114 | child: Row(
115 | // mainAxisAlignment: MainAxisAlignment.spaceBetween,
116 | children: [
117 | if (developers.fbUrl != null)
118 | IconButton(
119 | icon: Icon(
120 | FontAwesomeIcons.facebookF,
121 | size: 15,
122 | ),
123 | onPressed: () {
124 | launch(developers.fbUrl);
125 | },
126 | ),
127 | if (developers.instagramUrl != null)
128 | IconButton(
129 | icon: Icon(
130 | FontAwesomeIcons.instagram,
131 | size: 15,
132 | ),
133 | onPressed: () {
134 | launch(developers.instagramUrl);
135 | },
136 | ),
137 | if (developers.twitterUrl != null)
138 | IconButton(
139 | icon: Icon(
140 | FontAwesomeIcons.twitter,
141 | size: 15,
142 | ),
143 | onPressed: () {
144 | launch(developers.twitterUrl);
145 | },
146 | ),
147 | if (developers.githubUrl != null)
148 | IconButton(
149 | icon: Icon(
150 | FontAwesomeIcons.github,
151 | size: 15,
152 | ),
153 | onPressed: () {
154 | launch(developers.githubUrl);
155 | },
156 | ),
157 | if (developers.linkedinUrl != null)
158 | IconButton(
159 | icon: Icon(
160 | FontAwesomeIcons.linkedin,
161 | size: 15,
162 | ),
163 | onPressed: () {
164 | launch(developers.linkedinUrl);
165 | },
166 | )
167 | ],
168 | ),
169 | );
170 |
--------------------------------------------------------------------------------
/lib/widgets/CustomAppDrawer.dart:
--------------------------------------------------------------------------------
1 | import 'package:firebase_auth/firebase_auth.dart';
2 | import 'package:flutter/material.dart';
3 | import 'package:fluttertoast/fluttertoast.dart';
4 | import 'package:share/share.dart';
5 |
6 | import '../screens/EventRegistration.dart';
7 | import '../screens/contact_us_screen.dart';
8 | import '../screens/homepage.dart';
9 | import '../screens/LoginScreen.dart';
10 | import '../screens/about_screen.dart';
11 | import '../screens/members.dart';
12 | import '../screens/upcoming_events_screen.dart';
13 | import '../services/firebase_auth_service.dart';
14 |
15 | class CustomAppDrawer extends StatefulWidget {
16 | @override
17 | _CustomAppDrawerState createState() => _CustomAppDrawerState();
18 | }
19 |
20 | class _CustomAppDrawerState extends State {
21 | String email,name,googlename,firestorename;
22 | @override
23 | void initState() {
24 | getEmail();
25 | super.initState();
26 | }
27 | getEmail()async{
28 | email = FirebaseAuth.instance.currentUser.email;
29 | }
30 |
31 | @override
32 | Widget build(BuildContext context) {
33 | return Drawer(
34 | child: Container(
35 | child: ListView(children: [
36 | DrawerHeader(
37 | margin: EdgeInsets.symmetric(vertical: 0, horizontal: 2.5),
38 | decoration: BoxDecoration(
39 | image: DecorationImage(
40 | image: AssetImage("assets/images/logo.jpeg"),
41 | fit: BoxFit.cover)),
42 | child: null,
43 | ),
44 | ListTile(
45 | leading: Icon(Icons.person,color: Color.fromRGBO(47, 141, 70, 1),),
46 | title: Text(email),
47 | ),
48 | InkWell(
49 | onTap: () {
50 | Navigator.pushNamed(context, HomePage.routeName);
51 | },
52 | child: ListTile(
53 | title: Text(
54 | "Home",
55 | ),
56 | // style: TextStyle(color: Colors.white),
57 | leading: Icon(
58 | Icons.home,
59 | color: Color.fromRGBO(47, 141, 70, 1),
60 | ),
61 | ),
62 | ),
63 | Divider(
64 | color: Color.fromRGBO(47, 141, 70, 1),
65 | ),
66 | InkWell(
67 | onTap: () {
68 | Navigator.pushNamed(context, About.routeName);
69 | },
70 | child: ListTile(
71 | title: Text(
72 | "About Us",
73 | ),
74 | leading: Icon(
75 | Icons.info,
76 | color: Color.fromRGBO(47, 141, 70, 1),
77 | ),
78 | ),
79 | ),
80 | Divider(
81 | color: Color.fromRGBO(47, 141, 70, 1),
82 | ),
83 | InkWell(
84 | onTap: () {
85 | Navigator.pushNamed(context, Members.routeName);
86 | },
87 | child: ListTile(
88 | title: Text(
89 | "Team",
90 | ),
91 | leading: Icon(
92 | Icons.group,
93 | color: Color.fromRGBO(47, 141, 70, 1),
94 | ),
95 | ),
96 | ),
97 | Divider(
98 | color: Color.fromRGBO(47, 141, 70, 1),
99 | ),
100 | InkWell(
101 | onTap: () {
102 | Navigator.pushNamed(context, UpcomingEventsScreen.routeName);
103 | },
104 | child: ListTile(
105 | title: Text(
106 | "Events",
107 | ),
108 | leading: Icon(
109 | Icons.event,
110 | color: Color.fromRGBO(47, 141, 70, 1),
111 | ),
112 | ),
113 | ),
114 | Divider(
115 | color: Color.fromRGBO(47, 141, 70, 1),
116 | ),
117 | InkWell(
118 | onTap: () {
119 | Navigator.pushNamed(context, EventRegistration.routeName);
120 | },
121 | child: ListTile(
122 | title: Text(
123 | "Register",
124 | ),
125 | leading: Icon(
126 | Icons.app_registration,
127 | color: Color.fromRGBO(47, 141, 70, 1),
128 | ),
129 | ),
130 | ),
131 | Divider(
132 | color: Color.fromRGBO(47, 141, 70, 1),
133 | ),
134 | InkWell(
135 | onTap: () {
136 | Navigator.pushNamed(context, ContactUs.routeName);
137 | },
138 | child: ListTile(
139 | title: Text(
140 | "Contact Us",
141 | ),
142 | leading: Icon(
143 | Icons.contact_page,
144 | color: Color.fromRGBO(47, 141, 70, 1),
145 | ),
146 | ),
147 | ),
148 | Divider(
149 | color: Color.fromRGBO(47, 141, 70, 1),
150 | ),
151 | InkWell(
152 | onTap: () {
153 | Share.share('Find *Our GFG* app here, \n\n'
154 | 'Step 1: Visit https://github.com/GameofSource-GFG/Android-Development \n'
155 | 'Step 2: Click on ```Actions``` \n'
156 | 'Step 3: In the workflows listed, click on the latest workflow \n'
157 | 'Step 4: Download the ```release-apk``` present under the heading *Artifacts*');
158 | },
159 | child: ListTile(
160 | title: Text(
161 | "Share",
162 | ),
163 | leading: Icon(
164 | Icons.share,
165 | color: Color.fromRGBO(47, 141, 70, 1),
166 | ),
167 | ),
168 | ),
169 | Divider(
170 | color: Color.fromRGBO(47, 141, 70, 1),
171 | ),
172 | InkWell(
173 | onTap: () async {
174 | await FirebaseAuthService.logoutUser();
175 | Navigator.pushNamedAndRemoveUntil(
176 | context,
177 | LoginScreen.routeName,
178 | (route) => false,
179 | );
180 | Fluttertoast.showToast(msg: "Logged out successfully");
181 | },
182 | child: ListTile(
183 | title: Text(
184 | "Logout",
185 | ),
186 | leading: Icon(
187 | Icons.logout,
188 | color: Color.fromRGBO(47, 141, 70, 1),
189 | ),
190 | ),
191 | ),
192 | ]),
193 | ),
194 | );
195 | }
196 | }
197 |
--------------------------------------------------------------------------------
/CONTRIBUTING.md:
--------------------------------------------------------------------------------
1 | # Contributing
2 |
3 | ## Guidelines
4 |
5 | - Issues will be assigned on a first come, first serve basis. You just have to comment on the issue, asking to be assigned, and it will be done if found fit.
6 | - Preferably, you cannot work on any issue that is not assigned to you.
7 | - In case you want to submit an improvement to an existing feature or section, we prefer that you notify us in suggested medium of contact, describing in details your improvement. This will help others to analyze your contribution.
8 | - All PRs must be made from a Branch. Create a separate branch for every Issue you are working upon and once found fit, make a PR.
9 | - If you have no idea what are [issues](https://docs.github.com/en/free-pro-team@latest/github/managing-your-work-on-github/about-issues) or [PR](https://docs.github.com/en/free-pro-team@latest/github/collaborating-with-issues-and-pull-requests/about-pull-requests)s, please do refer to the links.
10 |
11 | **Make sure your code works before submitting it :D**
12 |
13 |
14 |
15 |
16 | Set it up locally
17 |
18 |
19 | ### Fork it
20 |
21 | You can get your own fork/copy of this project by using the Fork button.
22 |
23 | 
24 |
25 | ### Clone it
26 |
27 | You need to clone (download) it to local machine using
28 |
29 | ```sh
30 | $ git clone https://github.com//Android-Development.git
31 | ```
32 |
33 | Once you have cloned the repository, move to that folder first using `cd` command.
34 |
35 | ```sh
36 | $ cd Android-Development
37 | ```
38 |
39 | Move to this folder for all other commands.
40 |
41 | ### Set it up
42 |
43 | Run the following commands to see that _your local copy_ has a reference to _your forked remote repository_ in Github :octocat:
44 |
45 | ```sh
46 | $ git remote -v
47 | origin https://github.com//Android-Development.git (fetch)
48 | origin https://github.com//Android-Development.git (push)
49 | ```
50 |
51 | Now, lets add a reference to the original [Android-Development](https://github.com/GameofSource-GFG/Android-Development) repository using
52 |
53 | ```sh
54 | $ git remote add upstream https://github.com/GameofSource-GFG/Android-Development.git
55 | ```
56 |
57 | > This adds a new remote named **_upstream_**.
58 |
59 | Verify the changes using
60 |
61 | ```sh
62 | $ git remote -v
63 | origin https://github.com//Android-Development.git (fetch)
64 | origin https://github.com//Android-Development.git (push)
65 | upstream https://github.com/GameofSource-GFG/Android-Development.git (fetch)
66 | upstream https://github.com/GameofSource-GFG/Android-Development.git (push)
67 | ```
68 |
69 | ### Sync it
70 |
71 | **Always keep your local copy of repository updated with the original repository.**
72 |
73 | Before making any changes and/or in an appropriate interval, run the following commands _carefully_ to update your local repository.
74 |
75 | ```sh
76 | # Fetch all remote repositories and delete any deleted remote branches
77 | $ git fetch --all --prune
78 |
79 | # Switch to `main` branch
80 | $ git checkout main
81 |
82 | # Reset local `main` branch to match `upstream` repository's `main` branch
83 | $ git reset --hard upstream/main
84 |
85 | # Push changes to your forked `Android-Development` repo
86 | $ git push origin
87 | ```
88 |
89 | ### You're Ready to Go
90 |
91 | Once you have completed these steps, you are ready to start contributing by checking our Issues and creating [pull requests](https://github.com/GameofSource-GFG/Android-Development/pulls).
92 |
93 |
94 |
95 | ---
96 |
97 |
98 |
99 | Installation
100 |
101 |
102 | Make sure you have following installed on your machine:
103 |
104 | - [Git](https://git-scm.com/downloads)
105 | - [Flutter SDK](https://flutter.dev/docs/get-started/install)
106 | - [Android Studio](https://developer.android.com/studio) or [VSCode](https://code.visualstudio.com/download)
107 |
108 | To setup Flutter in Android Studio check [here](https://flutter.dev/docs/development/tools/android-studio)
109 |
110 | To setup Flutter in VSCode check [here](https://flutter.dev/docs/development/tools/vs-code)
111 |
112 | Install all dependencies using:
113 |
114 | ```sh
115 | $ flutter pub get
116 | ```
117 |
118 | Run the app using:
119 |
120 | ```sh
121 | $ flutter run
122 | ```
123 |
124 |
130 |
131 |
132 |
133 | ---
134 |
135 | ### Create a new branch
136 |
137 | Whenever you are going to make contribution. Please create seperate branch using the command and keep your `main` branch clean and most stable version of your project (i.e. synced with remote branch).
138 |
139 | ```sh
140 | # It will create a new branch with name / and switch to that branch
141 | $ git checkout -b /
142 | #Example
143 | #$ git checkout -b monatheoctocat/1
144 | ```
145 |
146 | Create a seperate branch for contibution and try to use same name of branch as of your contributing feature associated with your assigned issue.
147 |
148 | To switch to desired branch
149 |
150 | ```sh
151 | # To switch from one branch to other
152 | $ git checkout
153 | ```
154 |
155 | To add the changes to the branch. Use
156 |
157 | ```sh
158 | # To add all files to branch /
159 | $ git add .
160 | ```
161 |
162 | Type in a message relevant for the code reveiwer using
163 |
164 | ```sh
165 | # This message get associated with all files you have changed
166 | $ git commit -m 'relevant message'
167 | ```
168 |
169 | Now, Push your awesome work to your remote repository using
170 |
171 | ```sh
172 | # To push your work to your remote repository
173 | $ git push -u origin
174 | #Example
175 | #$ git push -u origin /
176 | ```
177 |
178 | Finally, go to your repository in browser and click on `compare and pull requests`.
179 |
180 | NOTE:
181 |
182 | **_Make sure you make Pull Request from your branch to the `development` branch of our project_**
183 |
184 | 
185 |
186 | Then add a title and description to your pull request that explains your precious effort.
187 | Don't forget to mention the issue number you are working on.
188 |
189 | ### Thank you for your contribution.
190 |
--------------------------------------------------------------------------------
/lib/screens/sign_up.dart:
--------------------------------------------------------------------------------
1 | //sign up page along with google sign in button
2 | import 'package:firebase_auth/firebase_auth.dart';
3 | import 'package:flutter/material.dart';
4 | import 'package:modal_progress_hud/modal_progress_hud.dart';
5 |
6 | import 'homepage.dart';
7 |
8 | String emailIdErrorMessage = "";
9 | String passwordErrorMessage = "";
10 |
11 | class SignUp extends StatefulWidget {
12 | static final String routeName = "/sign_up";
13 | @override
14 | _SignUpState createState() => _SignUpState();
15 | }
16 |
17 | class _SignUpState extends State {
18 | FirebaseAuth firebaseAuth = FirebaseAuth.instance;
19 | //DatabaseReference dbRef = FirebaseDatabase.instance.reference().child("Users");
20 | TextEditingController nameController = TextEditingController();
21 |
22 | //google sign-in
23 | // ignore: unused_field
24 |
25 | final email = TextEditingController();
26 | final password = TextEditingController();
27 | bool validityEmail = true;
28 | bool validityPassword = true;
29 |
30 | bool _isLoading = false;
31 | //email sign-up method
32 | void registerToFb() {
33 | setState(() {
34 | _isLoading = true;
35 | });
36 | firebaseAuth
37 | .createUserWithEmailAndPassword(
38 | email: email.text, password: password.text)
39 | .then((result) {
40 | Navigator.pushNamed(context, HomePage.routeName);
41 |
42 | setState(() {
43 | _isLoading = false;
44 | });
45 | }).catchError(
46 | (err) {
47 | setState(() {
48 | _isLoading = false;
49 | });
50 | showDialog(
51 | context: context,
52 | builder: (BuildContext context) {
53 | return AlertDialog(
54 | title: Text("Error"),
55 | content: Text(err.message),
56 | actions: [
57 | FlatButton(
58 | child: Text("Ok"),
59 | onPressed: () {
60 | Navigator.of(context).pop();
61 | },
62 | )
63 | ],
64 | );
65 | },
66 | );
67 | },
68 | );
69 | }
70 |
71 | @override
72 | void dispose() {
73 | // Cleaning up controllers.
74 | nameController.dispose();
75 | email.dispose();
76 | password.dispose();
77 | super.dispose();
78 | }
79 |
80 | @override
81 | Widget build(BuildContext context) {
82 | return ModalProgressHUD(
83 | inAsyncCall: _isLoading,
84 | child: Scaffold(
85 | backgroundColor: Colors.white,
86 | body: SafeArea(
87 | child: Padding(
88 | padding: EdgeInsets.all(36.0),
89 | child: ListView(children: [
90 | // SizedBox(height: 80),
91 | Column(
92 | children: [
93 | Image(
94 | image: NetworkImage(
95 | 'https://media.geeksforgeeks.org/wp-content/cdn-uploads/20190710102234/download3.png'),
96 | ),
97 | SizedBox(height: 16),
98 | Text(
99 | 'Geeks For Geeks',
100 | style: TextStyle(
101 | fontSize: 20,
102 | ),
103 | ),
104 | ],
105 | ),
106 | SizedBox(height: 60),
107 | Padding(
108 | padding: const EdgeInsets.only(left: 10, right: 10),
109 | child: TextField(
110 | textInputAction: TextInputAction.next,
111 | onSubmitted: (v) {
112 | FocusScope.of(context).requestFocus();
113 | },
114 | decoration: InputDecoration(
115 | enabledBorder: UnderlineInputBorder(
116 | borderSide: BorderSide(color: Colors.brown),
117 | ),
118 | hintText: '\tName',
119 | icon: Icon(
120 | Icons.person_add,
121 | color: Colors.brown,
122 | ),
123 | ),
124 | ),
125 | ),
126 | SizedBox(
127 | height: 13,
128 | ),
129 | Padding(
130 | padding: const EdgeInsets.only(left: 10, right: 10),
131 | child: TextField(
132 | controller: email,
133 | keyboardType: TextInputType.emailAddress,
134 | textInputAction: TextInputAction.next,
135 | onSubmitted: (v) {
136 | FocusScope.of(context).requestFocus();
137 | },
138 | decoration: InputDecoration(
139 | enabledBorder: UnderlineInputBorder(
140 | borderSide: BorderSide(color: Colors.brown),
141 | ),
142 | hintText: '\tEmail',
143 | icon: Icon(
144 | Icons.email,
145 | color: Colors.brown,
146 | ),
147 | errorText: validityEmail ? null : emailIdErrorMessage,
148 | ),
149 | ),
150 | ),
151 | SizedBox(height: 14),
152 | Padding(
153 | padding: const EdgeInsets.only(left: 10, right: 10),
154 | child: TextField(
155 | controller: password,
156 | textInputAction: TextInputAction.done,
157 |
158 | decoration: InputDecoration(
159 | hoverColor: Colors.brown,
160 | enabledBorder: UnderlineInputBorder(
161 | borderSide: BorderSide(color: Colors.brown),
162 | ),
163 | hintText: 'Password',
164 | icon: Icon(Icons.lock, color: Colors.brown),
165 | errorText: validityPassword ? null : passwordErrorMessage,
166 | ),
167 | obscureText:
168 | true, //replaces password with bullets as we enter it
169 | ),
170 | ),
171 |
172 | SizedBox(
173 | height: 10,
174 | ),
175 | Padding(
176 | padding: EdgeInsets.fromLTRB(10, 30, 10, 10),
177 | child: Column(
178 | children: [
179 | Text('Continue for a seamless experience!'),
180 | SizedBox(
181 | height: 10.0,
182 | ),
183 | RaisedButton(
184 | padding: EdgeInsets.only(left: 40, right: 40),
185 | shape: StadiumBorder(),
186 | color: Color(0xFF2F8D46),
187 | onPressed: () {
188 | setState(
189 | () {
190 | validityEmail = isValidEmail(email.text);
191 | validityPassword = isValidPassword(password.text);
192 | registerToFb();
193 | },
194 | );
195 | },
196 | child: Text('SIGN UP',
197 | style: TextStyle(color: Colors.white)),
198 | ),
199 | SizedBox(
200 | height: 10.0,
201 | ),
202 | ],
203 | ),
204 | ),
205 | ]),
206 | ),
207 | ),
208 | ),
209 | );
210 | }
211 | }
212 |
213 | bool isValidEmail(String email) {
214 | //Function that VALIDATES ENTERED EMAIL ID
215 |
216 | String p =
217 | r'^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$';
218 | RegExp regExp = new RegExp(p);
219 | if (email.isEmpty) {
220 | //assigning error message to String variable emailIdErrorMessage
221 | emailIdErrorMessage = "Please enter a Email-id";
222 | return false;
223 | } else if (!(regExp.hasMatch(email))) {
224 | //assigning error message to String variable emailIdErrorMessage
225 | emailIdErrorMessage = "Please enter a valid Email Address";
226 | return false;
227 | } else
228 | return true;
229 | }
230 |
231 | bool isValidPassword(String password) {
232 | //Function that VALIDATES ENTERED PASSWORD
233 |
234 | String pattern =
235 | r'^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[!@#\$&*~]).{8,}$';
236 | RegExp regExp = new RegExp(pattern);
237 | if (password.isEmpty) {
238 | //assigning error message to String variable passwordErrorMessage
239 | passwordErrorMessage = "Please enter Password";
240 | return false;
241 | } else if (password.length < 8) {
242 | //assigning error message to String variable passwordErrorMessage
243 | passwordErrorMessage = "Password must contain at least 8 characters";
244 | return false;
245 | } else if (!(regExp.hasMatch(password))) {
246 | //assigning error message to String variable passwordErrorMessage
247 | passwordErrorMessage =
248 | "Password must contain \n at least 1 upper case alphabet,\nat least one number \nand at least one special character \nalong with lowercase alphabets";
249 | return false;
250 | } else
251 | return true;
252 | }
253 |
--------------------------------------------------------------------------------
/lib/screens/LoginScreen.dart:
--------------------------------------------------------------------------------
1 | //User Login screen for the app
2 | import 'package:flutter/material.dart';
3 | import 'package:firebase_auth/firebase_auth.dart';
4 | import 'package:fluttertoast/fluttertoast.dart';
5 | import 'package:google_sign_in/google_sign_in.dart';
6 | import 'package:modal_progress_hud/modal_progress_hud.dart';
7 |
8 | import 'homepage.dart';
9 | import '../services/firebase_auth_service.dart';
10 | import 'sign_up.dart';
11 |
12 | class LoginScreen extends StatefulWidget {
13 | static final String routeName = "/login";
14 |
15 | @override
16 | _LoginScreenState createState() => _LoginScreenState();
17 | }
18 |
19 | String emailIdErrorMessage = "";
20 | String passwordErrorMessage = "";
21 | //string variables that store error messages
22 | //for incorrectly entered email and password respectively.
23 | //They are initialized to "" but their values are changed by
24 | //functions bool isValidEmail(String) and bool is isValidPassword(String)
25 | //if entered Data is invalid.
26 | //The functions bool isValidEmail(String) and bool isValidPassword(String)
27 | //validate the email and password entered by user.
28 |
29 | class _LoginScreenState extends State {
30 | //textControllers for textFields of email and password
31 | final email = TextEditingController();
32 | final password = TextEditingController();
33 |
34 | //boolean variables that indicate whether or not entered data is valid
35 | bool validityEmail = true;
36 | bool validityPassword = true;
37 | //They store values returned by functions bool isValidEmail(String) and bool is isValidPassword(String)
38 | //They are initialized to true but their values change depending on data entered.On pressing the LogIn button
39 | //the functions bool isValidEmail(String) and bool isValidPassword(String)
40 | //are called which validate entered data and return true if data is valid and false if data is invalid.
41 | // ignore: unused_field
42 | bool _isLoggedIn = false;
43 |
44 | GoogleSignIn _googleSignIn = GoogleSignIn(scopes: ['email']);
45 |
46 | _login() async {
47 | try {
48 | await _googleSignIn.signIn().then((value) {
49 | setState(() {
50 | _isLoggedIn = true;
51 | });
52 | Navigator.pushNamed(context, HomePage.routeName);
53 | });
54 | } catch (err) {
55 | print(err);
56 | }
57 | }
58 |
59 | // ignore: unused_element
60 | _logout() {
61 | _googleSignIn.signOut();
62 | setState(
63 | () {
64 | _isLoggedIn = false;
65 | },
66 | );
67 | }
68 |
69 | @override
70 | void dispose() {
71 | // Cleaning up controllers.
72 | email.dispose();
73 | password.dispose();
74 | super.dispose();
75 | }
76 |
77 | bool _isLoading = false;
78 |
79 | @override
80 | Widget build(BuildContext context) {
81 | return ModalProgressHUD(
82 | inAsyncCall: _isLoading,
83 | child: Scaffold(
84 | backgroundColor: Colors.white,
85 | body: SingleChildScrollView(
86 | child: Column(
87 | children: [
88 | Padding(
89 | //the GRAPHIC DESIGN included in the page
90 | padding: const EdgeInsets.all(8.0),
91 | child: Container(
92 | margin: EdgeInsets.only(top: 50.0),
93 | height: MediaQuery.of(context).size.height * 0.32,
94 | decoration: BoxDecoration(
95 | image: DecorationImage(
96 | //graphic design used for the screen
97 | image: AssetImage('assets/images/login-design.png'),
98 | fit: BoxFit.fitHeight)),
99 | ),
100 | ),
101 | //blank space
102 | SizedBox(height: 10.0),
103 | Padding(
104 | //textField to enter EMAIL ADDRESS
105 | padding: const EdgeInsets.all(16.0),
106 | child: TextField(
107 | controller: email,
108 | keyboardType: TextInputType.emailAddress,
109 | textInputAction: TextInputAction.next,
110 | onSubmitted: (v) {
111 | FocusScope.of(context).requestFocus();
112 | },
113 | decoration: InputDecoration(
114 | filled: true,
115 | fillColor: Color(0xFF2F8D46).withOpacity(0.2),
116 | hintText: 'Email',
117 | hintStyle:
118 | TextStyle(color: Colors.black.withOpacity(0.6)),
119 | prefixIcon: Icon(Icons.person, color: Color(0xFF2F8D46)),
120 | enabledBorder: OutlineInputBorder(
121 | borderSide: BorderSide(
122 | color: Color(0xFF2F8D46).withOpacity(0.2)),
123 | borderRadius: BorderRadius.circular(20.0),
124 | ),
125 | focusedBorder: OutlineInputBorder(
126 | borderSide: BorderSide(
127 | color: Color(0xFF2F8D46).withOpacity(0.2)),
128 | borderRadius: BorderRadius.circular(20.0),
129 | ),
130 | errorText: validityEmail ? null : emailIdErrorMessage,
131 | //here string stored in emailIdErrorMessage is displayed if boolean variable validityEmail is false
132 |
133 | errorBorder: OutlineInputBorder(
134 | borderSide: BorderSide(
135 | color: Colors.deepOrange,
136 | ),
137 | borderRadius: BorderRadius.circular(20.0),
138 | ),
139 | focusedErrorBorder: OutlineInputBorder(
140 | borderSide: BorderSide(
141 | color: Colors.deepOrange,
142 | ),
143 | borderRadius: BorderRadius.circular(20.0),
144 | )),
145 | ),
146 | ),
147 | Padding(
148 | //TextField to enter PASSWORD
149 | padding: const EdgeInsets.all(16.0),
150 | child: TextField(
151 | controller: password,
152 | textInputAction: TextInputAction.done,
153 | decoration: InputDecoration(
154 | filled: true,
155 | fillColor: Color(0xFF2F8D46).withOpacity(0.2),
156 | hintText: 'Password',
157 | hintStyle:
158 | TextStyle(color: Colors.black.withOpacity(0.6)),
159 | errorText: validityPassword ? null : passwordErrorMessage,
160 | //here string stored in emailIdErrorMessage is displayed if boolean variable validityEmail is false
161 |
162 | errorBorder: OutlineInputBorder(
163 | borderSide:
164 | BorderSide(color: Colors.deepOrange, width: 1.0),
165 | borderRadius: BorderRadius.circular(20.0),
166 | ),
167 | focusedErrorBorder: OutlineInputBorder(
168 | borderSide: BorderSide(
169 | color: Colors.deepOrange,
170 | ),
171 | borderRadius: BorderRadius.circular(20.0),
172 | ),
173 | prefixIcon: Icon(Icons.lock, color: Color(0xFF2F8D46)),
174 | enabledBorder: OutlineInputBorder(
175 | borderSide: BorderSide(
176 | color: Color(0xFF2F8D46).withOpacity(0.2)),
177 | borderRadius: BorderRadius.circular(20.0),
178 | ),
179 | focusedBorder: OutlineInputBorder(
180 | borderSide: BorderSide(
181 | color: Color(0xFF2F8D46).withOpacity(0.2)),
182 | borderRadius: BorderRadius.circular(20.0),
183 | )),
184 | obscureText: true,
185 | ),
186 | ),
187 | Padding(
188 | //LOGIN BUTTON
189 | //after pressing this button the emailId and Password entered by user
190 | //are validated by validating functions bool isValidEmail(String) and bool isValidPassword(String)
191 | //the value returned by function is stored in the boolean variables validityEmail and validityPassword
192 | // if the data is entered is valid functions return true.
193 | //if data entered is invalid:
194 | // 1.functions assign appropriate error messages to String variable passwordErrorMessage and String variable emailIdErrorMessage
195 | // 2. and then return false.
196 |
197 | padding: const EdgeInsets.all(16.0),
198 | child: MaterialButton(
199 | height: MediaQuery.of(context).size.height * 0.08,
200 | minWidth: MediaQuery.of(context).size.width,
201 | shape: RoundedRectangleBorder(
202 | borderRadius: new BorderRadius.circular(20)),
203 | onPressed: () async {
204 | setState(() {
205 | //storing value returned by validating functions into boolean variables
206 | validityEmail = isValidEmail(email.text);
207 | validityPassword = isValidPassword(password.text);
208 | });
209 | if (validityEmail && validityPassword) {
210 | try {
211 | setState(() {
212 | _isLoading = true;
213 | });
214 | await FirebaseAuthService.loginUser(
215 | email: email.text?.trim(),
216 | password: password.text,
217 | );
218 |
219 | Navigator.pushReplacementNamed(
220 | context,
221 | HomePage.routeName,
222 | );
223 | } on FirebaseAuthException catch (e) {
224 | Fluttertoast.showToast(msg: e.message);
225 | } catch (e) {
226 | Fluttertoast.showToast(
227 | msg:
228 | "An error occurred. Please try again later");
229 | } finally {
230 | setState(() {
231 | _isLoading = false;
232 | });
233 | }
234 | }
235 | },
236 | child: Text(
237 | "LOGIN",
238 | style: TextStyle(fontSize: 17.0, color: Colors.white),
239 | ),
240 | //Color(0xFF0DD6BB)
241 | color: new Color(0xFF2F8D46))),
242 | SizedBox(height: 10.0),
243 | Column(
244 | //REGISTER NOW LINK
245 | mainAxisAlignment: MainAxisAlignment.center,
246 | children: [
247 | Text(
248 | "Don't have a account yet?",
249 | style: TextStyle(),
250 | ),
251 | SizedBox(width: 5.0),
252 | InkWell(
253 | onTap: () {
254 | Navigator.pushNamed(context, SignUp.routeName);
255 | },
256 | child: Text(
257 | 'Register Now',
258 | style: TextStyle(
259 | color: Color(0xFF2F8D46),
260 | fontWeight: FontWeight.bold,
261 | decoration: TextDecoration.underline),
262 | ),
263 | //Color(0xFF0DD6BB)
264 | ),
265 | SizedBox(height: 10.0),
266 | RaisedButton(
267 | padding: EdgeInsets.only(left: 40, right: 40),
268 | shape: StadiumBorder(),
269 | color: Color(0xFF2F8D46),
270 | onPressed: () {
271 | _login();
272 | },
273 | child: Text(
274 | 'Sign In With Google',
275 | style: TextStyle(color: Colors.white),
276 | ),
277 | ),
278 | ],
279 | ),
280 | ],
281 | ),
282 | ),
283 | ),
284 | );
285 | }
286 | }
287 |
288 | bool isValidEmail(String email) {
289 | //Function that VALIDATES ENTERED EMAIL ID
290 |
291 | String p =
292 | r'^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$';
293 | RegExp regExp = new RegExp(p);
294 | if (email.isEmpty) {
295 | //assigning error message to String variable emailIdErrorMessage
296 | emailIdErrorMessage = "Please enter a Email-id";
297 | return false;
298 | } else if (!(regExp.hasMatch(email))) {
299 | //assigning error message to String variable emailIdErrorMessage
300 | emailIdErrorMessage = "Please enter a valid Email Address";
301 | return false;
302 | } else
303 | return true;
304 | }
305 |
306 | bool isValidPassword(String password) {
307 | //Function that VALIDATES ENTERED PASSWORD
308 |
309 | String pattern =
310 | r'^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[!@#\$&*~]).{8,}$';
311 | RegExp regExp = new RegExp(pattern);
312 | if (password.isEmpty) {
313 | //assigning error message to String variable passwordErrorMessage
314 | passwordErrorMessage = "Please enter Password";
315 | return false;
316 | } else if (password.length < 8) {
317 | //assigning error message to String variable passwordErrorMessage
318 | passwordErrorMessage = "Password must contain at least 8 characters";
319 | return false;
320 | } else if (!(regExp.hasMatch(password))) {
321 | //assigning error message to String variable passwordErrorMessage
322 | passwordErrorMessage =
323 | "Password must contain \n at least 1 upper case alphabet,\nat least one number \nand at least one special character \nalong with lowercase alphabets";
324 | return false;
325 | } else
326 | return true;
327 | }
328 |
--------------------------------------------------------------------------------
/pubspec.lock:
--------------------------------------------------------------------------------
1 | # Generated by pub
2 | # See https://dart.dev/tools/pub/glossary#lockfile
3 | packages:
4 | animated_text_kit:
5 | dependency: "direct main"
6 | description:
7 | name: animated_text_kit
8 | url: "https://pub.dartlang.org"
9 | source: hosted
10 | version: "2.5.1"
11 | archive:
12 | dependency: transitive
13 | description:
14 | name: archive
15 | url: "https://pub.dartlang.org"
16 | source: hosted
17 | version: "2.0.13"
18 | args:
19 | dependency: transitive
20 | description:
21 | name: args
22 | url: "https://pub.dartlang.org"
23 | source: hosted
24 | version: "1.6.0"
25 | async:
26 | dependency: transitive
27 | description:
28 | name: async
29 | url: "https://pub.dartlang.org"
30 | source: hosted
31 | version: "2.5.0-nullsafety.1"
32 | boolean_selector:
33 | dependency: transitive
34 | description:
35 | name: boolean_selector
36 | url: "https://pub.dartlang.org"
37 | source: hosted
38 | version: "2.1.0-nullsafety.1"
39 | cached_network_image:
40 | dependency: "direct main"
41 | description:
42 | name: cached_network_image
43 | url: "https://pub.dartlang.org"
44 | source: hosted
45 | version: "2.3.3"
46 | characters:
47 | dependency: transitive
48 | description:
49 | name: characters
50 | url: "https://pub.dartlang.org"
51 | source: hosted
52 | version: "1.1.0-nullsafety.3"
53 | charcode:
54 | dependency: transitive
55 | description:
56 | name: charcode
57 | url: "https://pub.dartlang.org"
58 | source: hosted
59 | version: "1.2.0-nullsafety.1"
60 | clock:
61 | dependency: transitive
62 | description:
63 | name: clock
64 | url: "https://pub.dartlang.org"
65 | source: hosted
66 | version: "1.1.0-nullsafety.1"
67 | cloud_firestore:
68 | dependency: "direct main"
69 | description:
70 | name: cloud_firestore
71 | url: "https://pub.dartlang.org"
72 | source: hosted
73 | version: "0.14.1+3"
74 | cloud_firestore_platform_interface:
75 | dependency: transitive
76 | description:
77 | name: cloud_firestore_platform_interface
78 | url: "https://pub.dartlang.org"
79 | source: hosted
80 | version: "2.1.2"
81 | cloud_firestore_web:
82 | dependency: transitive
83 | description:
84 | name: cloud_firestore_web
85 | url: "https://pub.dartlang.org"
86 | source: hosted
87 | version: "0.2.0+4"
88 | collection:
89 | dependency: transitive
90 | description:
91 | name: collection
92 | url: "https://pub.dartlang.org"
93 | source: hosted
94 | version: "1.15.0-nullsafety.3"
95 | color:
96 | dependency: transitive
97 | description:
98 | name: color
99 | url: "https://pub.dartlang.org"
100 | source: hosted
101 | version: "2.1.1"
102 | convert:
103 | dependency: transitive
104 | description:
105 | name: convert
106 | url: "https://pub.dartlang.org"
107 | source: hosted
108 | version: "2.1.1"
109 | crypto:
110 | dependency: transitive
111 | description:
112 | name: crypto
113 | url: "https://pub.dartlang.org"
114 | source: hosted
115 | version: "2.1.5"
116 | cupertino_icons:
117 | dependency: "direct main"
118 | description:
119 | name: cupertino_icons
120 | url: "https://pub.dartlang.org"
121 | source: hosted
122 | version: "1.0.0"
123 | fake_async:
124 | dependency: transitive
125 | description:
126 | name: fake_async
127 | url: "https://pub.dartlang.org"
128 | source: hosted
129 | version: "1.2.0-nullsafety.1"
130 | ffi:
131 | dependency: transitive
132 | description:
133 | name: ffi
134 | url: "https://pub.dartlang.org"
135 | source: hosted
136 | version: "0.1.3"
137 | file:
138 | dependency: transitive
139 | description:
140 | name: file
141 | url: "https://pub.dartlang.org"
142 | source: hosted
143 | version: "5.2.1"
144 | firebase:
145 | dependency: transitive
146 | description:
147 | name: firebase
148 | url: "https://pub.dartlang.org"
149 | source: hosted
150 | version: "7.3.2"
151 | firebase_auth:
152 | dependency: "direct main"
153 | description:
154 | name: firebase_auth
155 | url: "https://pub.dartlang.org"
156 | source: hosted
157 | version: "0.18.1+2"
158 | firebase_auth_platform_interface:
159 | dependency: transitive
160 | description:
161 | name: firebase_auth_platform_interface
162 | url: "https://pub.dartlang.org"
163 | source: hosted
164 | version: "2.1.1"
165 | firebase_auth_web:
166 | dependency: transitive
167 | description:
168 | name: firebase_auth_web
169 | url: "https://pub.dartlang.org"
170 | source: hosted
171 | version: "0.3.1+1"
172 | firebase_core:
173 | dependency: "direct main"
174 | description:
175 | name: firebase_core
176 | url: "https://pub.dartlang.org"
177 | source: hosted
178 | version: "0.5.0+1"
179 | firebase_core_platform_interface:
180 | dependency: transitive
181 | description:
182 | name: firebase_core_platform_interface
183 | url: "https://pub.dartlang.org"
184 | source: hosted
185 | version: "2.0.0"
186 | firebase_core_web:
187 | dependency: transitive
188 | description:
189 | name: firebase_core_web
190 | url: "https://pub.dartlang.org"
191 | source: hosted
192 | version: "0.2.0"
193 | firebase_database:
194 | dependency: "direct main"
195 | description:
196 | name: firebase_database
197 | url: "https://pub.dartlang.org"
198 | source: hosted
199 | version: "4.1.1"
200 | flutter:
201 | dependency: "direct main"
202 | description: flutter
203 | source: sdk
204 | version: "0.0.0"
205 | flutter_blurhash:
206 | dependency: transitive
207 | description:
208 | name: flutter_blurhash
209 | url: "https://pub.dartlang.org"
210 | source: hosted
211 | version: "0.5.0"
212 | flutter_cache_manager:
213 | dependency: transitive
214 | description:
215 | name: flutter_cache_manager
216 | url: "https://pub.dartlang.org"
217 | source: hosted
218 | version: "2.0.0"
219 | flutter_native_splash:
220 | dependency: "direct dev"
221 | description:
222 | name: flutter_native_splash
223 | url: "https://pub.dartlang.org"
224 | source: hosted
225 | version: "0.1.9"
226 | flutter_test:
227 | dependency: "direct dev"
228 | description: flutter
229 | source: sdk
230 | version: "0.0.0"
231 | flutter_web_plugins:
232 | dependency: transitive
233 | description: flutter
234 | source: sdk
235 | version: "0.0.0"
236 | fluttertoast:
237 | dependency: "direct main"
238 | description:
239 | name: fluttertoast
240 | url: "https://pub.dartlang.org"
241 | source: hosted
242 | version: "7.1.1"
243 | font_awesome_flutter:
244 | dependency: "direct main"
245 | description:
246 | name: font_awesome_flutter
247 | url: "https://pub.dartlang.org"
248 | source: hosted
249 | version: "8.10.0"
250 | google_fonts:
251 | dependency: "direct dev"
252 | description:
253 | name: google_fonts
254 | url: "https://pub.dartlang.org"
255 | source: hosted
256 | version: "1.1.1"
257 | google_sign_in:
258 | dependency: "direct main"
259 | description:
260 | name: google_sign_in
261 | url: "https://pub.dartlang.org"
262 | source: hosted
263 | version: "4.5.5"
264 | google_sign_in_platform_interface:
265 | dependency: transitive
266 | description:
267 | name: google_sign_in_platform_interface
268 | url: "https://pub.dartlang.org"
269 | source: hosted
270 | version: "1.1.2"
271 | google_sign_in_web:
272 | dependency: transitive
273 | description:
274 | name: google_sign_in_web
275 | url: "https://pub.dartlang.org"
276 | source: hosted
277 | version: "0.9.2"
278 | http:
279 | dependency: transitive
280 | description:
281 | name: http
282 | url: "https://pub.dartlang.org"
283 | source: hosted
284 | version: "0.12.2"
285 | http_parser:
286 | dependency: transitive
287 | description:
288 | name: http_parser
289 | url: "https://pub.dartlang.org"
290 | source: hosted
291 | version: "3.1.4"
292 | image:
293 | dependency: transitive
294 | description:
295 | name: image
296 | url: "https://pub.dartlang.org"
297 | source: hosted
298 | version: "2.1.18"
299 | intl:
300 | dependency: "direct main"
301 | description:
302 | name: intl
303 | url: "https://pub.dartlang.org"
304 | source: hosted
305 | version: "0.16.1"
306 | js:
307 | dependency: transitive
308 | description:
309 | name: js
310 | url: "https://pub.dartlang.org"
311 | source: hosted
312 | version: "0.6.2"
313 | matcher:
314 | dependency: transitive
315 | description:
316 | name: matcher
317 | url: "https://pub.dartlang.org"
318 | source: hosted
319 | version: "0.12.10-nullsafety.1"
320 | meta:
321 | dependency: transitive
322 | description:
323 | name: meta
324 | url: "https://pub.dartlang.org"
325 | source: hosted
326 | version: "1.3.0-nullsafety.3"
327 | mime:
328 | dependency: transitive
329 | description:
330 | name: mime
331 | url: "https://pub.dartlang.org"
332 | source: hosted
333 | version: "0.9.7"
334 | modal_progress_hud:
335 | dependency: "direct main"
336 | description:
337 | name: modal_progress_hud
338 | url: "https://pub.dartlang.org"
339 | source: hosted
340 | version: "0.1.3"
341 | octo_image:
342 | dependency: transitive
343 | description:
344 | name: octo_image
345 | url: "https://pub.dartlang.org"
346 | source: hosted
347 | version: "0.3.0"
348 | onesignal_flutter:
349 | dependency: "direct main"
350 | description:
351 | name: onesignal_flutter
352 | url: "https://pub.dartlang.org"
353 | source: hosted
354 | version: "2.6.1"
355 | path:
356 | dependency: transitive
357 | description:
358 | name: path
359 | url: "https://pub.dartlang.org"
360 | source: hosted
361 | version: "1.8.0-nullsafety.1"
362 | path_provider:
363 | dependency: transitive
364 | description:
365 | name: path_provider
366 | url: "https://pub.dartlang.org"
367 | source: hosted
368 | version: "1.6.22"
369 | path_provider_linux:
370 | dependency: transitive
371 | description:
372 | name: path_provider_linux
373 | url: "https://pub.dartlang.org"
374 | source: hosted
375 | version: "0.0.1+2"
376 | path_provider_macos:
377 | dependency: transitive
378 | description:
379 | name: path_provider_macos
380 | url: "https://pub.dartlang.org"
381 | source: hosted
382 | version: "0.0.4+4"
383 | path_provider_platform_interface:
384 | dependency: transitive
385 | description:
386 | name: path_provider_platform_interface
387 | url: "https://pub.dartlang.org"
388 | source: hosted
389 | version: "1.0.3"
390 | path_provider_windows:
391 | dependency: transitive
392 | description:
393 | name: path_provider_windows
394 | url: "https://pub.dartlang.org"
395 | source: hosted
396 | version: "0.0.4+1"
397 | pedantic:
398 | dependency: transitive
399 | description:
400 | name: pedantic
401 | url: "https://pub.dartlang.org"
402 | source: hosted
403 | version: "1.9.2"
404 | petitparser:
405 | dependency: transitive
406 | description:
407 | name: petitparser
408 | url: "https://pub.dartlang.org"
409 | source: hosted
410 | version: "3.1.0"
411 | platform:
412 | dependency: transitive
413 | description:
414 | name: platform
415 | url: "https://pub.dartlang.org"
416 | source: hosted
417 | version: "2.2.1"
418 | plugin_platform_interface:
419 | dependency: transitive
420 | description:
421 | name: plugin_platform_interface
422 | url: "https://pub.dartlang.org"
423 | source: hosted
424 | version: "1.0.3"
425 | process:
426 | dependency: transitive
427 | description:
428 | name: process
429 | url: "https://pub.dartlang.org"
430 | source: hosted
431 | version: "3.0.13"
432 | quiver:
433 | dependency: transitive
434 | description:
435 | name: quiver
436 | url: "https://pub.dartlang.org"
437 | source: hosted
438 | version: "2.1.4+1"
439 | rxdart:
440 | dependency: transitive
441 | description:
442 | name: rxdart
443 | url: "https://pub.dartlang.org"
444 | source: hosted
445 | version: "0.24.1"
446 | share:
447 | dependency: "direct main"
448 | description:
449 | name: share
450 | url: "https://pub.dartlang.org"
451 | source: hosted
452 | version: "0.6.5+4"
453 | shimmer:
454 | dependency: "direct main"
455 | description:
456 | name: shimmer
457 | url: "https://pub.dartlang.org"
458 | source: hosted
459 | version: "1.1.2"
460 | sky_engine:
461 | dependency: transitive
462 | description: flutter
463 | source: sdk
464 | version: "0.0.99"
465 | source_span:
466 | dependency: transitive
467 | description:
468 | name: source_span
469 | url: "https://pub.dartlang.org"
470 | source: hosted
471 | version: "1.8.0-nullsafety.2"
472 | sqflite:
473 | dependency: transitive
474 | description:
475 | name: sqflite
476 | url: "https://pub.dartlang.org"
477 | source: hosted
478 | version: "1.3.1+2"
479 | sqflite_common:
480 | dependency: transitive
481 | description:
482 | name: sqflite_common
483 | url: "https://pub.dartlang.org"
484 | source: hosted
485 | version: "1.0.2+1"
486 | stack_trace:
487 | dependency: transitive
488 | description:
489 | name: stack_trace
490 | url: "https://pub.dartlang.org"
491 | source: hosted
492 | version: "1.10.0-nullsafety.1"
493 | stream_channel:
494 | dependency: transitive
495 | description:
496 | name: stream_channel
497 | url: "https://pub.dartlang.org"
498 | source: hosted
499 | version: "2.1.0-nullsafety.1"
500 | string_scanner:
501 | dependency: transitive
502 | description:
503 | name: string_scanner
504 | url: "https://pub.dartlang.org"
505 | source: hosted
506 | version: "1.1.0-nullsafety.1"
507 | synchronized:
508 | dependency: transitive
509 | description:
510 | name: synchronized
511 | url: "https://pub.dartlang.org"
512 | source: hosted
513 | version: "2.2.0+2"
514 | term_glyph:
515 | dependency: transitive
516 | description:
517 | name: term_glyph
518 | url: "https://pub.dartlang.org"
519 | source: hosted
520 | version: "1.2.0-nullsafety.1"
521 | test_api:
522 | dependency: transitive
523 | description:
524 | name: test_api
525 | url: "https://pub.dartlang.org"
526 | source: hosted
527 | version: "0.2.19-nullsafety.2"
528 | timeago:
529 | dependency: "direct main"
530 | description:
531 | name: timeago
532 | url: "https://pub.dartlang.org"
533 | source: hosted
534 | version: "2.0.28"
535 | typed_data:
536 | dependency: transitive
537 | description:
538 | name: typed_data
539 | url: "https://pub.dartlang.org"
540 | source: hosted
541 | version: "1.3.0-nullsafety.3"
542 | url_launcher:
543 | dependency: "direct main"
544 | description:
545 | name: url_launcher
546 | url: "https://pub.dartlang.org"
547 | source: hosted
548 | version: "5.7.8"
549 | url_launcher_linux:
550 | dependency: transitive
551 | description:
552 | name: url_launcher_linux
553 | url: "https://pub.dartlang.org"
554 | source: hosted
555 | version: "0.0.1+3"
556 | url_launcher_macos:
557 | dependency: transitive
558 | description:
559 | name: url_launcher_macos
560 | url: "https://pub.dartlang.org"
561 | source: hosted
562 | version: "0.0.1+8"
563 | url_launcher_platform_interface:
564 | dependency: transitive
565 | description:
566 | name: url_launcher_platform_interface
567 | url: "https://pub.dartlang.org"
568 | source: hosted
569 | version: "1.0.9"
570 | url_launcher_web:
571 | dependency: transitive
572 | description:
573 | name: url_launcher_web
574 | url: "https://pub.dartlang.org"
575 | source: hosted
576 | version: "0.1.5"
577 | url_launcher_windows:
578 | dependency: transitive
579 | description:
580 | name: url_launcher_windows
581 | url: "https://pub.dartlang.org"
582 | source: hosted
583 | version: "0.0.1+1"
584 | uuid:
585 | dependency: transitive
586 | description:
587 | name: uuid
588 | url: "https://pub.dartlang.org"
589 | source: hosted
590 | version: "2.2.2"
591 | vector_math:
592 | dependency: transitive
593 | description:
594 | name: vector_math
595 | url: "https://pub.dartlang.org"
596 | source: hosted
597 | version: "2.1.0-nullsafety.3"
598 | webview_flutter:
599 | dependency: "direct main"
600 | description:
601 | name: webview_flutter
602 | url: "https://pub.dartlang.org"
603 | source: hosted
604 | version: "1.0.5"
605 | win32:
606 | dependency: transitive
607 | description:
608 | name: win32
609 | url: "https://pub.dartlang.org"
610 | source: hosted
611 | version: "1.7.3"
612 | xdg_directories:
613 | dependency: transitive
614 | description:
615 | name: xdg_directories
616 | url: "https://pub.dartlang.org"
617 | source: hosted
618 | version: "0.1.2"
619 | xml:
620 | dependency: transitive
621 | description:
622 | name: xml
623 | url: "https://pub.dartlang.org"
624 | source: hosted
625 | version: "4.5.1"
626 | yaml:
627 | dependency: transitive
628 | description:
629 | name: yaml
630 | url: "https://pub.dartlang.org"
631 | source: hosted
632 | version: "2.2.1"
633 | sdks:
634 | dart: ">=2.10.0 <2.11.0"
635 | flutter: ">=1.22.0 <2.0.0"
636 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 46;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
11 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
12 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
13 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
14 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
15 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
16 | /* End PBXBuildFile section */
17 |
18 | /* Begin PBXCopyFilesBuildPhase section */
19 | 9705A1C41CF9048500538489 /* Embed Frameworks */ = {
20 | isa = PBXCopyFilesBuildPhase;
21 | buildActionMask = 2147483647;
22 | dstPath = "";
23 | dstSubfolderSpec = 10;
24 | files = (
25 | );
26 | name = "Embed Frameworks";
27 | runOnlyForDeploymentPostprocessing = 0;
28 | };
29 | /* End PBXCopyFilesBuildPhase section */
30 |
31 | /* Begin PBXFileReference section */
32 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; };
33 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; };
34 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; };
35 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; };
36 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
37 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; };
38 | 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; };
39 | 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; };
40 | 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
41 | 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
42 | 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
43 | 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
44 | 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
45 | /* End PBXFileReference section */
46 |
47 | /* Begin PBXFrameworksBuildPhase section */
48 | 97C146EB1CF9000F007C117D /* Frameworks */ = {
49 | isa = PBXFrameworksBuildPhase;
50 | buildActionMask = 2147483647;
51 | files = (
52 | );
53 | runOnlyForDeploymentPostprocessing = 0;
54 | };
55 | /* End PBXFrameworksBuildPhase section */
56 |
57 | /* Begin PBXGroup section */
58 | 9740EEB11CF90186004384FC /* Flutter */ = {
59 | isa = PBXGroup;
60 | children = (
61 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,
62 | 9740EEB21CF90195004384FC /* Debug.xcconfig */,
63 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
64 | 9740EEB31CF90195004384FC /* Generated.xcconfig */,
65 | );
66 | name = Flutter;
67 | sourceTree = "";
68 | };
69 | 97C146E51CF9000F007C117D = {
70 | isa = PBXGroup;
71 | children = (
72 | 9740EEB11CF90186004384FC /* Flutter */,
73 | 97C146F01CF9000F007C117D /* Runner */,
74 | 97C146EF1CF9000F007C117D /* Products */,
75 | );
76 | sourceTree = "";
77 | };
78 | 97C146EF1CF9000F007C117D /* Products */ = {
79 | isa = PBXGroup;
80 | children = (
81 | 97C146EE1CF9000F007C117D /* Runner.app */,
82 | );
83 | name = Products;
84 | sourceTree = "";
85 | };
86 | 97C146F01CF9000F007C117D /* Runner */ = {
87 | isa = PBXGroup;
88 | children = (
89 | 97C146FA1CF9000F007C117D /* Main.storyboard */,
90 | 97C146FD1CF9000F007C117D /* Assets.xcassets */,
91 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,
92 | 97C147021CF9000F007C117D /* Info.plist */,
93 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,
94 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,
95 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */,
96 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */,
97 | );
98 | path = Runner;
99 | sourceTree = "";
100 | };
101 | /* End PBXGroup section */
102 |
103 | /* Begin PBXNativeTarget section */
104 | 97C146ED1CF9000F007C117D /* Runner */ = {
105 | isa = PBXNativeTarget;
106 | buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
107 | buildPhases = (
108 | 9740EEB61CF901F6004384FC /* Run Script */,
109 | 97C146EA1CF9000F007C117D /* Sources */,
110 | 97C146EB1CF9000F007C117D /* Frameworks */,
111 | 97C146EC1CF9000F007C117D /* Resources */,
112 | 9705A1C41CF9048500538489 /* Embed Frameworks */,
113 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */,
114 | );
115 | buildRules = (
116 | );
117 | dependencies = (
118 | );
119 | name = Runner;
120 | productName = Runner;
121 | productReference = 97C146EE1CF9000F007C117D /* Runner.app */;
122 | productType = "com.apple.product-type.application";
123 | };
124 | /* End PBXNativeTarget section */
125 |
126 | /* Begin PBXProject section */
127 | 97C146E61CF9000F007C117D /* Project object */ = {
128 | isa = PBXProject;
129 | attributes = {
130 | LastUpgradeCheck = 1020;
131 | ORGANIZATIONNAME = "";
132 | TargetAttributes = {
133 | 97C146ED1CF9000F007C117D = {
134 | CreatedOnToolsVersion = 7.3.1;
135 | LastSwiftMigration = 1100;
136 | };
137 | };
138 | };
139 | buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */;
140 | compatibilityVersion = "Xcode 9.3";
141 | developmentRegion = en;
142 | hasScannedForEncodings = 0;
143 | knownRegions = (
144 | en,
145 | Base,
146 | );
147 | mainGroup = 97C146E51CF9000F007C117D;
148 | productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
149 | projectDirPath = "";
150 | projectRoot = "";
151 | targets = (
152 | 97C146ED1CF9000F007C117D /* Runner */,
153 | );
154 | };
155 | /* End PBXProject section */
156 |
157 | /* Begin PBXResourcesBuildPhase section */
158 | 97C146EC1CF9000F007C117D /* Resources */ = {
159 | isa = PBXResourcesBuildPhase;
160 | buildActionMask = 2147483647;
161 | files = (
162 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,
163 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
164 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
165 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
166 | );
167 | runOnlyForDeploymentPostprocessing = 0;
168 | };
169 | /* End PBXResourcesBuildPhase section */
170 |
171 | /* Begin PBXShellScriptBuildPhase section */
172 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
173 | isa = PBXShellScriptBuildPhase;
174 | buildActionMask = 2147483647;
175 | files = (
176 | );
177 | inputPaths = (
178 | );
179 | name = "Thin Binary";
180 | outputPaths = (
181 | );
182 | runOnlyForDeploymentPostprocessing = 0;
183 | shellPath = /bin/sh;
184 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
185 | };
186 | 9740EEB61CF901F6004384FC /* Run Script */ = {
187 | isa = PBXShellScriptBuildPhase;
188 | buildActionMask = 2147483647;
189 | files = (
190 | );
191 | inputPaths = (
192 | );
193 | name = "Run Script";
194 | outputPaths = (
195 | );
196 | runOnlyForDeploymentPostprocessing = 0;
197 | shellPath = /bin/sh;
198 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
199 | };
200 | /* End PBXShellScriptBuildPhase section */
201 |
202 | /* Begin PBXSourcesBuildPhase section */
203 | 97C146EA1CF9000F007C117D /* Sources */ = {
204 | isa = PBXSourcesBuildPhase;
205 | buildActionMask = 2147483647;
206 | files = (
207 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,
208 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,
209 | );
210 | runOnlyForDeploymentPostprocessing = 0;
211 | };
212 | /* End PBXSourcesBuildPhase section */
213 |
214 | /* Begin PBXVariantGroup section */
215 | 97C146FA1CF9000F007C117D /* Main.storyboard */ = {
216 | isa = PBXVariantGroup;
217 | children = (
218 | 97C146FB1CF9000F007C117D /* Base */,
219 | );
220 | name = Main.storyboard;
221 | sourceTree = "";
222 | };
223 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = {
224 | isa = PBXVariantGroup;
225 | children = (
226 | 97C147001CF9000F007C117D /* Base */,
227 | );
228 | name = LaunchScreen.storyboard;
229 | sourceTree = "";
230 | };
231 | /* End PBXVariantGroup section */
232 |
233 | /* Begin XCBuildConfiguration section */
234 | 249021D3217E4FDB00AE95B9 /* Profile */ = {
235 | isa = XCBuildConfiguration;
236 | buildSettings = {
237 | ALWAYS_SEARCH_USER_PATHS = NO;
238 | CLANG_ANALYZER_NONNULL = YES;
239 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
240 | CLANG_CXX_LIBRARY = "libc++";
241 | CLANG_ENABLE_MODULES = YES;
242 | CLANG_ENABLE_OBJC_ARC = YES;
243 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
244 | CLANG_WARN_BOOL_CONVERSION = YES;
245 | CLANG_WARN_COMMA = YES;
246 | CLANG_WARN_CONSTANT_CONVERSION = YES;
247 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
248 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
249 | CLANG_WARN_EMPTY_BODY = YES;
250 | CLANG_WARN_ENUM_CONVERSION = YES;
251 | CLANG_WARN_INFINITE_RECURSION = YES;
252 | CLANG_WARN_INT_CONVERSION = YES;
253 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
254 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
255 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
256 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
257 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
258 | CLANG_WARN_STRICT_PROTOTYPES = YES;
259 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
260 | CLANG_WARN_UNREACHABLE_CODE = YES;
261 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
262 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
263 | COPY_PHASE_STRIP = NO;
264 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
265 | ENABLE_NS_ASSERTIONS = NO;
266 | ENABLE_STRICT_OBJC_MSGSEND = YES;
267 | GCC_C_LANGUAGE_STANDARD = gnu99;
268 | GCC_NO_COMMON_BLOCKS = YES;
269 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
270 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
271 | GCC_WARN_UNDECLARED_SELECTOR = YES;
272 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
273 | GCC_WARN_UNUSED_FUNCTION = YES;
274 | GCC_WARN_UNUSED_VARIABLE = YES;
275 | IPHONEOS_DEPLOYMENT_TARGET = 9.0;
276 | MTL_ENABLE_DEBUG_INFO = NO;
277 | SDKROOT = iphoneos;
278 | SUPPORTED_PLATFORMS = iphoneos;
279 | TARGETED_DEVICE_FAMILY = "1,2";
280 | VALIDATE_PRODUCT = YES;
281 | };
282 | name = Profile;
283 | };
284 | 249021D4217E4FDB00AE95B9 /* Profile */ = {
285 | isa = XCBuildConfiguration;
286 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
287 | buildSettings = {
288 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
289 | CLANG_ENABLE_MODULES = YES;
290 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
291 | ENABLE_BITCODE = NO;
292 | FRAMEWORK_SEARCH_PATHS = (
293 | "$(inherited)",
294 | "$(PROJECT_DIR)/Flutter",
295 | );
296 | INFOPLIST_FILE = Runner/Info.plist;
297 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
298 | LIBRARY_SEARCH_PATHS = (
299 | "$(inherited)",
300 | "$(PROJECT_DIR)/Flutter",
301 | );
302 | PRODUCT_BUNDLE_IDENTIFIER = com.gfg.ourGfg;
303 | PRODUCT_NAME = "$(TARGET_NAME)";
304 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
305 | SWIFT_VERSION = 5.0;
306 | VERSIONING_SYSTEM = "apple-generic";
307 | };
308 | name = Profile;
309 | };
310 | 97C147031CF9000F007C117D /* Debug */ = {
311 | isa = XCBuildConfiguration;
312 | buildSettings = {
313 | ALWAYS_SEARCH_USER_PATHS = NO;
314 | CLANG_ANALYZER_NONNULL = YES;
315 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
316 | CLANG_CXX_LIBRARY = "libc++";
317 | CLANG_ENABLE_MODULES = YES;
318 | CLANG_ENABLE_OBJC_ARC = YES;
319 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
320 | CLANG_WARN_BOOL_CONVERSION = YES;
321 | CLANG_WARN_COMMA = YES;
322 | CLANG_WARN_CONSTANT_CONVERSION = YES;
323 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
324 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
325 | CLANG_WARN_EMPTY_BODY = YES;
326 | CLANG_WARN_ENUM_CONVERSION = YES;
327 | CLANG_WARN_INFINITE_RECURSION = YES;
328 | CLANG_WARN_INT_CONVERSION = YES;
329 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
330 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
331 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
332 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
333 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
334 | CLANG_WARN_STRICT_PROTOTYPES = YES;
335 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
336 | CLANG_WARN_UNREACHABLE_CODE = YES;
337 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
338 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
339 | COPY_PHASE_STRIP = NO;
340 | DEBUG_INFORMATION_FORMAT = dwarf;
341 | ENABLE_STRICT_OBJC_MSGSEND = YES;
342 | ENABLE_TESTABILITY = YES;
343 | GCC_C_LANGUAGE_STANDARD = gnu99;
344 | GCC_DYNAMIC_NO_PIC = NO;
345 | GCC_NO_COMMON_BLOCKS = YES;
346 | GCC_OPTIMIZATION_LEVEL = 0;
347 | GCC_PREPROCESSOR_DEFINITIONS = (
348 | "DEBUG=1",
349 | "$(inherited)",
350 | );
351 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
352 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
353 | GCC_WARN_UNDECLARED_SELECTOR = YES;
354 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
355 | GCC_WARN_UNUSED_FUNCTION = YES;
356 | GCC_WARN_UNUSED_VARIABLE = YES;
357 | IPHONEOS_DEPLOYMENT_TARGET = 9.0;
358 | MTL_ENABLE_DEBUG_INFO = YES;
359 | ONLY_ACTIVE_ARCH = YES;
360 | SDKROOT = iphoneos;
361 | TARGETED_DEVICE_FAMILY = "1,2";
362 | };
363 | name = Debug;
364 | };
365 | 97C147041CF9000F007C117D /* Release */ = {
366 | isa = XCBuildConfiguration;
367 | buildSettings = {
368 | ALWAYS_SEARCH_USER_PATHS = NO;
369 | CLANG_ANALYZER_NONNULL = YES;
370 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
371 | CLANG_CXX_LIBRARY = "libc++";
372 | CLANG_ENABLE_MODULES = YES;
373 | CLANG_ENABLE_OBJC_ARC = YES;
374 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
375 | CLANG_WARN_BOOL_CONVERSION = YES;
376 | CLANG_WARN_COMMA = YES;
377 | CLANG_WARN_CONSTANT_CONVERSION = YES;
378 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
379 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
380 | CLANG_WARN_EMPTY_BODY = YES;
381 | CLANG_WARN_ENUM_CONVERSION = YES;
382 | CLANG_WARN_INFINITE_RECURSION = YES;
383 | CLANG_WARN_INT_CONVERSION = YES;
384 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
385 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
386 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
387 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
388 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
389 | CLANG_WARN_STRICT_PROTOTYPES = YES;
390 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
391 | CLANG_WARN_UNREACHABLE_CODE = YES;
392 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
393 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
394 | COPY_PHASE_STRIP = NO;
395 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
396 | ENABLE_NS_ASSERTIONS = NO;
397 | ENABLE_STRICT_OBJC_MSGSEND = YES;
398 | GCC_C_LANGUAGE_STANDARD = gnu99;
399 | GCC_NO_COMMON_BLOCKS = YES;
400 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
401 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
402 | GCC_WARN_UNDECLARED_SELECTOR = YES;
403 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
404 | GCC_WARN_UNUSED_FUNCTION = YES;
405 | GCC_WARN_UNUSED_VARIABLE = YES;
406 | IPHONEOS_DEPLOYMENT_TARGET = 9.0;
407 | MTL_ENABLE_DEBUG_INFO = NO;
408 | SDKROOT = iphoneos;
409 | SUPPORTED_PLATFORMS = iphoneos;
410 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
411 | TARGETED_DEVICE_FAMILY = "1,2";
412 | VALIDATE_PRODUCT = YES;
413 | };
414 | name = Release;
415 | };
416 | 97C147061CF9000F007C117D /* Debug */ = {
417 | isa = XCBuildConfiguration;
418 | baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
419 | buildSettings = {
420 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
421 | CLANG_ENABLE_MODULES = YES;
422 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
423 | ENABLE_BITCODE = NO;
424 | FRAMEWORK_SEARCH_PATHS = (
425 | "$(inherited)",
426 | "$(PROJECT_DIR)/Flutter",
427 | );
428 | INFOPLIST_FILE = Runner/Info.plist;
429 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
430 | LIBRARY_SEARCH_PATHS = (
431 | "$(inherited)",
432 | "$(PROJECT_DIR)/Flutter",
433 | );
434 | PRODUCT_BUNDLE_IDENTIFIER = com.gfg.ourGfg;
435 | PRODUCT_NAME = "$(TARGET_NAME)";
436 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
437 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
438 | SWIFT_VERSION = 5.0;
439 | VERSIONING_SYSTEM = "apple-generic";
440 | };
441 | name = Debug;
442 | };
443 | 97C147071CF9000F007C117D /* Release */ = {
444 | isa = XCBuildConfiguration;
445 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
446 | buildSettings = {
447 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
448 | CLANG_ENABLE_MODULES = YES;
449 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
450 | ENABLE_BITCODE = NO;
451 | FRAMEWORK_SEARCH_PATHS = (
452 | "$(inherited)",
453 | "$(PROJECT_DIR)/Flutter",
454 | );
455 | INFOPLIST_FILE = Runner/Info.plist;
456 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
457 | LIBRARY_SEARCH_PATHS = (
458 | "$(inherited)",
459 | "$(PROJECT_DIR)/Flutter",
460 | );
461 | PRODUCT_BUNDLE_IDENTIFIER = com.gfg.ourGfg;
462 | PRODUCT_NAME = "$(TARGET_NAME)";
463 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
464 | SWIFT_VERSION = 5.0;
465 | VERSIONING_SYSTEM = "apple-generic";
466 | };
467 | name = Release;
468 | };
469 | /* End XCBuildConfiguration section */
470 |
471 | /* Begin XCConfigurationList section */
472 | 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = {
473 | isa = XCConfigurationList;
474 | buildConfigurations = (
475 | 97C147031CF9000F007C117D /* Debug */,
476 | 97C147041CF9000F007C117D /* Release */,
477 | 249021D3217E4FDB00AE95B9 /* Profile */,
478 | );
479 | defaultConfigurationIsVisible = 0;
480 | defaultConfigurationName = Release;
481 | };
482 | 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = {
483 | isa = XCConfigurationList;
484 | buildConfigurations = (
485 | 97C147061CF9000F007C117D /* Debug */,
486 | 97C147071CF9000F007C117D /* Release */,
487 | 249021D4217E4FDB00AE95B9 /* Profile */,
488 | );
489 | defaultConfigurationIsVisible = 0;
490 | defaultConfigurationName = Release;
491 | };
492 | /* End XCConfigurationList section */
493 | };
494 | rootObject = 97C146E61CF9000F007C117D /* Project object */;
495 | }
496 |
--------------------------------------------------------------------------------