ffute 0.0.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ffute-0.0.1/PKG-INFO +8 -0
- ffute-0.0.1/ffmpeg/__init__.py +503 -0
- ffute-0.0.1/ffute/__init__.py +503 -0
- ffute-0.0.1/ffute.egg-info/PKG-INFO +8 -0
- ffute-0.0.1/ffute.egg-info/SOURCES.txt +7 -0
- ffute-0.0.1/ffute.egg-info/dependency_links.txt +1 -0
- ffute-0.0.1/ffute.egg-info/top_level.txt +2 -0
- ffute-0.0.1/pyproject.toml +15 -0
- ffute-0.0.1/setup.cfg +4 -0
ffute-0.0.1/PKG-INFO
ADDED
|
@@ -0,0 +1,503 @@
|
|
|
1
|
+
EXPERIMENT_01 = r'''EXPERIMENT 01 - FRUIT LIST USING WIDGETS AND LAYOUTS
|
|
2
|
+
===================================================
|
|
3
|
+
|
|
4
|
+
import 'package:flutter/material.dart';
|
|
5
|
+
|
|
6
|
+
void main() {
|
|
7
|
+
runApp(MyApp());
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
class MyApp extends StatelessWidget {
|
|
11
|
+
@override
|
|
12
|
+
Widget build(BuildContext context) {
|
|
13
|
+
return MaterialApp(
|
|
14
|
+
debugShowCheckedModeBanner: false,
|
|
15
|
+
home: HomePage(),
|
|
16
|
+
);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
class HomePage extends StatelessWidget {
|
|
21
|
+
@override
|
|
22
|
+
Widget build(BuildContext context) {
|
|
23
|
+
return Scaffold(
|
|
24
|
+
appBar: AppBar(title: Text("Fruits")),
|
|
25
|
+
body: ListView(
|
|
26
|
+
children: [
|
|
27
|
+
FruitCard(emoji: "🍎", name: "Apple", rate: "23.0"),
|
|
28
|
+
FruitCard(emoji: "🍌", name: "Banana", rate: "15.0"),
|
|
29
|
+
FruitCard(emoji: "🍇", name: "Grapes", rate: "30.0"),
|
|
30
|
+
FruitCard(emoji: "🍊", name: "Orange", rate: "20.0"),
|
|
31
|
+
],
|
|
32
|
+
),
|
|
33
|
+
);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
class FruitCard extends StatelessWidget {
|
|
38
|
+
final String emoji;
|
|
39
|
+
final String name;
|
|
40
|
+
final String rate;
|
|
41
|
+
|
|
42
|
+
FruitCard({
|
|
43
|
+
required this.emoji,
|
|
44
|
+
required this.name,
|
|
45
|
+
required this.rate,
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
@override
|
|
49
|
+
Widget build(BuildContext context) {
|
|
50
|
+
return Card(
|
|
51
|
+
child: Container(
|
|
52
|
+
padding: EdgeInsets.all(15),
|
|
53
|
+
child: Row(
|
|
54
|
+
children: [
|
|
55
|
+
Text(emoji, style: TextStyle(fontSize: 30)),
|
|
56
|
+
SizedBox(width: 23),
|
|
57
|
+
Column(
|
|
58
|
+
crossAxisAlignment: CrossAxisAlignment.start,
|
|
59
|
+
children: [
|
|
60
|
+
Text(name),
|
|
61
|
+
Text(rate),
|
|
62
|
+
],
|
|
63
|
+
),
|
|
64
|
+
],
|
|
65
|
+
),
|
|
66
|
+
),
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
}'''
|
|
70
|
+
|
|
71
|
+
EXPERIMENT_02 = r'''EXPERIMENT 02 - RESPONSIVE E-COMMERCE PRODUCT CATALOG
|
|
72
|
+
=====================================================
|
|
73
|
+
|
|
74
|
+
import 'package:flutter/material.dart';
|
|
75
|
+
|
|
76
|
+
void main() {
|
|
77
|
+
runApp(MyApp());
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
class MyApp extends StatelessWidget {
|
|
81
|
+
@override
|
|
82
|
+
Widget build(BuildContext context) {
|
|
83
|
+
return MaterialApp(
|
|
84
|
+
debugShowCheckedModeBanner: false,
|
|
85
|
+
home: HomePage(),
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
class HomePage extends StatelessWidget {
|
|
91
|
+
List<Map<String, String>> products = [
|
|
92
|
+
{"name": "Laptop", "price": "50000", "emoji": "💻"},
|
|
93
|
+
{"name": "Mobile", "price": "20000", "emoji": "📱"},
|
|
94
|
+
{"name": "Headphones", "price": "2000", "emoji": "🎧"},
|
|
95
|
+
{"name": "Smart Watch", "price": "5000", "emoji": "⌚"},
|
|
96
|
+
{"name": "Camera", "price": "30000", "emoji": "📷"},
|
|
97
|
+
{"name": "Tablet", "price": "25000", "emoji": "📱"},
|
|
98
|
+
];
|
|
99
|
+
|
|
100
|
+
@override
|
|
101
|
+
Widget build(BuildContext context) {
|
|
102
|
+
double width = MediaQuery.of(context).size.width;
|
|
103
|
+
|
|
104
|
+
int columns = 2;
|
|
105
|
+
|
|
106
|
+
if (width >= 600) {
|
|
107
|
+
columns = 3;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
if (width >= 900) {
|
|
111
|
+
columns = 4;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
return Scaffold(
|
|
115
|
+
appBar: AppBar(title: Text("Product Catalog")),
|
|
116
|
+
body: GridView.count(
|
|
117
|
+
crossAxisCount: columns,
|
|
118
|
+
children: [
|
|
119
|
+
for (var item in products)
|
|
120
|
+
ProductCard(
|
|
121
|
+
name: item["name"]!,
|
|
122
|
+
price: item["price"]!,
|
|
123
|
+
emoji: item["emoji"]!,
|
|
124
|
+
),
|
|
125
|
+
],
|
|
126
|
+
),
|
|
127
|
+
);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
class ProductCard extends StatelessWidget {
|
|
132
|
+
final String name;
|
|
133
|
+
final String price;
|
|
134
|
+
final String emoji;
|
|
135
|
+
|
|
136
|
+
ProductCard({
|
|
137
|
+
required this.name,
|
|
138
|
+
required this.price,
|
|
139
|
+
required this.emoji,
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
@override
|
|
143
|
+
Widget build(BuildContext context) {
|
|
144
|
+
return Card(
|
|
145
|
+
child: Container(
|
|
146
|
+
padding: EdgeInsets.all(10),
|
|
147
|
+
child: Column(
|
|
148
|
+
mainAxisAlignment: MainAxisAlignment.center,
|
|
149
|
+
children: [
|
|
150
|
+
Text(emoji, style: TextStyle(fontSize: 40)),
|
|
151
|
+
SizedBox(height: 10),
|
|
152
|
+
Text(name),
|
|
153
|
+
Text("Price: Rs. $price"),
|
|
154
|
+
ElevatedButton(
|
|
155
|
+
onPressed: () {},
|
|
156
|
+
child: Text("Buy Now"),
|
|
157
|
+
),
|
|
158
|
+
],
|
|
159
|
+
),
|
|
160
|
+
),
|
|
161
|
+
);
|
|
162
|
+
}
|
|
163
|
+
}'''
|
|
164
|
+
|
|
165
|
+
EXPERIMENT_03 = r'''EXPERIMENT 03 - SEARCH / FILTER PRODUCTS
|
|
166
|
+
========================================
|
|
167
|
+
|
|
168
|
+
import 'package:flutter/material.dart';
|
|
169
|
+
|
|
170
|
+
void main() {
|
|
171
|
+
runApp(MyApp());
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
class MyApp extends StatelessWidget {
|
|
175
|
+
@override
|
|
176
|
+
Widget build(BuildContext context) {
|
|
177
|
+
return MaterialApp(
|
|
178
|
+
debugShowCheckedModeBanner: false,
|
|
179
|
+
home: HomePage(),
|
|
180
|
+
);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
class HomePage extends StatefulWidget {
|
|
185
|
+
@override
|
|
186
|
+
State<HomePage> createState() => _HomePageState();
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
class _HomePageState extends State<HomePage> {
|
|
190
|
+
String search = "";
|
|
191
|
+
|
|
192
|
+
List<Map<String, String>> products = [
|
|
193
|
+
{"name": "Laptop", "price": "50000", "emoji": "💻"},
|
|
194
|
+
{"name": "Mobile", "price": "20000", "emoji": "📱"},
|
|
195
|
+
{"name": "Headphones", "price": "2000", "emoji": "🎧"},
|
|
196
|
+
{"name": "Smart Watch", "price": "5000", "emoji": "⌚"},
|
|
197
|
+
{"name": "Camera", "price": "30000", "emoji": "📷"},
|
|
198
|
+
{"name": "Tablet", "price": "25000", "emoji": "📱"},
|
|
199
|
+
];
|
|
200
|
+
|
|
201
|
+
@override
|
|
202
|
+
Widget build(BuildContext context) {
|
|
203
|
+
return Scaffold(
|
|
204
|
+
appBar: AppBar(title: Text("Product Search")),
|
|
205
|
+
body: Padding(
|
|
206
|
+
padding: EdgeInsets.all(10),
|
|
207
|
+
child: Column(
|
|
208
|
+
children: [
|
|
209
|
+
TextField(
|
|
210
|
+
decoration: InputDecoration(
|
|
211
|
+
labelText: "Search Product",
|
|
212
|
+
border: OutlineInputBorder(),
|
|
213
|
+
),
|
|
214
|
+
onChanged: (value) {
|
|
215
|
+
setState(() {
|
|
216
|
+
search = value;
|
|
217
|
+
});
|
|
218
|
+
},
|
|
219
|
+
),
|
|
220
|
+
|
|
221
|
+
SizedBox(height: 20),
|
|
222
|
+
|
|
223
|
+
Expanded(
|
|
224
|
+
child: GridView.count(
|
|
225
|
+
crossAxisCount: 2,
|
|
226
|
+
childAspectRatio: 0.9,
|
|
227
|
+
children: [
|
|
228
|
+
for (var item in products)
|
|
229
|
+
if (item["name"]!.toLowerCase().contains(search.toLowerCase()))
|
|
230
|
+
ProductCard(
|
|
231
|
+
name: item["name"]!,
|
|
232
|
+
price: item["price"]!,
|
|
233
|
+
emoji: item["emoji"]!,
|
|
234
|
+
),
|
|
235
|
+
],
|
|
236
|
+
),
|
|
237
|
+
),
|
|
238
|
+
],
|
|
239
|
+
),
|
|
240
|
+
),
|
|
241
|
+
);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
class ProductCard extends StatelessWidget {
|
|
246
|
+
final String name;
|
|
247
|
+
final String price;
|
|
248
|
+
final String emoji;
|
|
249
|
+
|
|
250
|
+
ProductCard({
|
|
251
|
+
required this.name,
|
|
252
|
+
required this.price,
|
|
253
|
+
required this.emoji,
|
|
254
|
+
});
|
|
255
|
+
|
|
256
|
+
@override
|
|
257
|
+
Widget build(BuildContext context) {
|
|
258
|
+
return Card(
|
|
259
|
+
elevation: 4,
|
|
260
|
+
child: Container(
|
|
261
|
+
padding: EdgeInsets.all(10),
|
|
262
|
+
child: Column(
|
|
263
|
+
mainAxisAlignment: MainAxisAlignment.center,
|
|
264
|
+
children: [
|
|
265
|
+
Text(emoji, style: TextStyle(fontSize: 40)),
|
|
266
|
+
SizedBox(height: 10),
|
|
267
|
+
Text(
|
|
268
|
+
name,
|
|
269
|
+
style: TextStyle(fontWeight: FontWeight.bold),
|
|
270
|
+
),
|
|
271
|
+
Text("Price: $price"),
|
|
272
|
+
ElevatedButton(
|
|
273
|
+
onPressed: () {},
|
|
274
|
+
child: Text("Buy Now"),
|
|
275
|
+
),
|
|
276
|
+
],
|
|
277
|
+
),
|
|
278
|
+
),
|
|
279
|
+
);
|
|
280
|
+
}
|
|
281
|
+
}'''
|
|
282
|
+
|
|
283
|
+
EXPERIMENT_04 = r'''EXPERIMENT 04 - CAR MILEAGE CALCULATOR WITH FORM VALIDATION
|
|
284
|
+
===========================================================
|
|
285
|
+
|
|
286
|
+
import 'package:flutter/material.dart';
|
|
287
|
+
|
|
288
|
+
void main() {
|
|
289
|
+
runApp(MyApp());
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
class MyApp extends StatelessWidget {
|
|
293
|
+
@override
|
|
294
|
+
Widget build(BuildContext context) {
|
|
295
|
+
return MaterialApp(
|
|
296
|
+
debugShowCheckedModeBanner: false,
|
|
297
|
+
home: HomePage(),
|
|
298
|
+
);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
class HomePage extends StatefulWidget {
|
|
303
|
+
@override
|
|
304
|
+
State<HomePage> createState() => _HomePageState();
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
class _HomePageState extends State<HomePage> {
|
|
308
|
+
TextEditingController distanceController = TextEditingController();
|
|
309
|
+
TextEditingController fuelController = TextEditingController();
|
|
310
|
+
|
|
311
|
+
final formKey = GlobalKey<FormState>();
|
|
312
|
+
|
|
313
|
+
double mileage = 0;
|
|
314
|
+
|
|
315
|
+
@override
|
|
316
|
+
Widget build(BuildContext context) {
|
|
317
|
+
return Scaffold(
|
|
318
|
+
appBar: AppBar(title: Text("Car Mileage Calculator")),
|
|
319
|
+
body: Padding(
|
|
320
|
+
padding: EdgeInsets.all(20),
|
|
321
|
+
child: Form(
|
|
322
|
+
key: formKey,
|
|
323
|
+
child: Column(
|
|
324
|
+
children: [
|
|
325
|
+
TextFormField(
|
|
326
|
+
controller: distanceController,
|
|
327
|
+
keyboardType: TextInputType.number,
|
|
328
|
+
decoration: InputDecoration(
|
|
329
|
+
labelText: "Distance (KM)",
|
|
330
|
+
border: OutlineInputBorder(),
|
|
331
|
+
),
|
|
332
|
+
validator: (value) {
|
|
333
|
+
if (value == null || value.isEmpty) {
|
|
334
|
+
return "Enter distance";
|
|
335
|
+
}
|
|
336
|
+
return null;
|
|
337
|
+
},
|
|
338
|
+
),
|
|
339
|
+
|
|
340
|
+
SizedBox(height: 20),
|
|
341
|
+
|
|
342
|
+
TextFormField(
|
|
343
|
+
controller: fuelController,
|
|
344
|
+
keyboardType: TextInputType.number,
|
|
345
|
+
decoration: InputDecoration(
|
|
346
|
+
labelText: "Fuel (Litres)",
|
|
347
|
+
border: OutlineInputBorder(),
|
|
348
|
+
),
|
|
349
|
+
validator: (value) {
|
|
350
|
+
if (value == null || value.isEmpty) {
|
|
351
|
+
return "Enter fuel";
|
|
352
|
+
}
|
|
353
|
+
return null;
|
|
354
|
+
},
|
|
355
|
+
),
|
|
356
|
+
|
|
357
|
+
SizedBox(height: 20),
|
|
358
|
+
|
|
359
|
+
ElevatedButton(
|
|
360
|
+
onPressed: () {
|
|
361
|
+
if (formKey.currentState!.validate()) {
|
|
362
|
+
double distance =
|
|
363
|
+
double.parse(distanceController.text);
|
|
364
|
+
double fuel =
|
|
365
|
+
double.parse(fuelController.text);
|
|
366
|
+
|
|
367
|
+
setState(() {
|
|
368
|
+
mileage = distance / fuel;
|
|
369
|
+
});
|
|
370
|
+
}
|
|
371
|
+
},
|
|
372
|
+
child: Text("Calculate Mileage"),
|
|
373
|
+
),
|
|
374
|
+
|
|
375
|
+
SizedBox(height: 20),
|
|
376
|
+
|
|
377
|
+
Text(
|
|
378
|
+
"Mileage: ${mileage.toStringAsFixed(2)} KM/L",
|
|
379
|
+
style: TextStyle(
|
|
380
|
+
fontSize: 20,
|
|
381
|
+
fontWeight: FontWeight.bold,
|
|
382
|
+
),
|
|
383
|
+
),
|
|
384
|
+
],
|
|
385
|
+
),
|
|
386
|
+
),
|
|
387
|
+
),
|
|
388
|
+
);
|
|
389
|
+
}
|
|
390
|
+
}'''
|
|
391
|
+
|
|
392
|
+
EXPERIMENT_05 = r'''EXPERIMENT 05 - NAVIGATION AND PASSING DATA (Navigator.push)
|
|
393
|
+
============================================================
|
|
394
|
+
|
|
395
|
+
import 'package:flutter/material.dart';
|
|
396
|
+
|
|
397
|
+
void main() {
|
|
398
|
+
runApp(MyApp());
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
class MyApp extends StatelessWidget {
|
|
402
|
+
@override
|
|
403
|
+
Widget build(BuildContext context) {
|
|
404
|
+
return MaterialApp(
|
|
405
|
+
debugShowCheckedModeBanner: false,
|
|
406
|
+
home: HomePage(),
|
|
407
|
+
);
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
class HomePage extends StatelessWidget {
|
|
412
|
+
TextEditingController nameController = TextEditingController();
|
|
413
|
+
|
|
414
|
+
@override
|
|
415
|
+
Widget build(BuildContext context) {
|
|
416
|
+
return Scaffold(
|
|
417
|
+
appBar: AppBar(title: Text("Home Page")),
|
|
418
|
+
body: Padding(
|
|
419
|
+
padding: EdgeInsets.all(20),
|
|
420
|
+
child: Column(
|
|
421
|
+
children: [
|
|
422
|
+
TextField(
|
|
423
|
+
controller: nameController,
|
|
424
|
+
decoration: InputDecoration(
|
|
425
|
+
labelText: "Enter Name",
|
|
426
|
+
border: OutlineInputBorder(),
|
|
427
|
+
),
|
|
428
|
+
),
|
|
429
|
+
|
|
430
|
+
SizedBox(height: 20),
|
|
431
|
+
|
|
432
|
+
ElevatedButton(
|
|
433
|
+
onPressed: () {
|
|
434
|
+
Navigator.push(
|
|
435
|
+
context,
|
|
436
|
+
MaterialPageRoute(
|
|
437
|
+
builder: (context) =>
|
|
438
|
+
SecondPage(name: nameController.text),
|
|
439
|
+
),
|
|
440
|
+
);
|
|
441
|
+
},
|
|
442
|
+
child: Text("Submit"),
|
|
443
|
+
),
|
|
444
|
+
],
|
|
445
|
+
),
|
|
446
|
+
),
|
|
447
|
+
);
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
class SecondPage extends StatelessWidget {
|
|
452
|
+
final String name;
|
|
453
|
+
|
|
454
|
+
SecondPage({required this.name});
|
|
455
|
+
|
|
456
|
+
@override
|
|
457
|
+
Widget build(BuildContext context) {
|
|
458
|
+
return Scaffold(
|
|
459
|
+
appBar: AppBar(title: Text("Second Page")),
|
|
460
|
+
body: Center(
|
|
461
|
+
child: Column(
|
|
462
|
+
mainAxisAlignment: MainAxisAlignment.center,
|
|
463
|
+
children: [
|
|
464
|
+
Text(
|
|
465
|
+
"Welcome $name",
|
|
466
|
+
style: TextStyle(fontSize: 25),
|
|
467
|
+
),
|
|
468
|
+
|
|
469
|
+
SizedBox(height: 20),
|
|
470
|
+
|
|
471
|
+
ElevatedButton(
|
|
472
|
+
onPressed: () {
|
|
473
|
+
Navigator.pop(context);
|
|
474
|
+
},
|
|
475
|
+
child: Text("Go Back"),
|
|
476
|
+
),
|
|
477
|
+
],
|
|
478
|
+
),
|
|
479
|
+
),
|
|
480
|
+
);
|
|
481
|
+
}
|
|
482
|
+
}'''
|
|
483
|
+
|
|
484
|
+
|
|
485
|
+
def e1():
|
|
486
|
+
print(EXPERIMENT_01)
|
|
487
|
+
|
|
488
|
+
|
|
489
|
+
def e2():
|
|
490
|
+
print(EXPERIMENT_02)
|
|
491
|
+
|
|
492
|
+
|
|
493
|
+
def e3():
|
|
494
|
+
print(EXPERIMENT_03)
|
|
495
|
+
|
|
496
|
+
|
|
497
|
+
def e4():
|
|
498
|
+
print(EXPERIMENT_04)
|
|
499
|
+
|
|
500
|
+
|
|
501
|
+
def e5():
|
|
502
|
+
print(EXPERIMENT_05)
|
|
503
|
+
|
|
@@ -0,0 +1,503 @@
|
|
|
1
|
+
EXPERIMENT_01 = r'''EXPERIMENT 01 - FRUIT LIST USING WIDGETS AND LAYOUTS
|
|
2
|
+
===================================================
|
|
3
|
+
|
|
4
|
+
import 'package:flutter/material.dart';
|
|
5
|
+
|
|
6
|
+
void main() {
|
|
7
|
+
runApp(MyApp());
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
class MyApp extends StatelessWidget {
|
|
11
|
+
@override
|
|
12
|
+
Widget build(BuildContext context) {
|
|
13
|
+
return MaterialApp(
|
|
14
|
+
debugShowCheckedModeBanner: false,
|
|
15
|
+
home: HomePage(),
|
|
16
|
+
);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
class HomePage extends StatelessWidget {
|
|
21
|
+
@override
|
|
22
|
+
Widget build(BuildContext context) {
|
|
23
|
+
return Scaffold(
|
|
24
|
+
appBar: AppBar(title: Text("Fruits")),
|
|
25
|
+
body: ListView(
|
|
26
|
+
children: [
|
|
27
|
+
FruitCard(emoji: "🍎", name: "Apple", rate: "23.0"),
|
|
28
|
+
FruitCard(emoji: "🍌", name: "Banana", rate: "15.0"),
|
|
29
|
+
FruitCard(emoji: "🍇", name: "Grapes", rate: "30.0"),
|
|
30
|
+
FruitCard(emoji: "🍊", name: "Orange", rate: "20.0"),
|
|
31
|
+
],
|
|
32
|
+
),
|
|
33
|
+
);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
class FruitCard extends StatelessWidget {
|
|
38
|
+
final String emoji;
|
|
39
|
+
final String name;
|
|
40
|
+
final String rate;
|
|
41
|
+
|
|
42
|
+
FruitCard({
|
|
43
|
+
required this.emoji,
|
|
44
|
+
required this.name,
|
|
45
|
+
required this.rate,
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
@override
|
|
49
|
+
Widget build(BuildContext context) {
|
|
50
|
+
return Card(
|
|
51
|
+
child: Container(
|
|
52
|
+
padding: EdgeInsets.all(15),
|
|
53
|
+
child: Row(
|
|
54
|
+
children: [
|
|
55
|
+
Text(emoji, style: TextStyle(fontSize: 30)),
|
|
56
|
+
SizedBox(width: 23),
|
|
57
|
+
Column(
|
|
58
|
+
crossAxisAlignment: CrossAxisAlignment.start,
|
|
59
|
+
children: [
|
|
60
|
+
Text(name),
|
|
61
|
+
Text(rate),
|
|
62
|
+
],
|
|
63
|
+
),
|
|
64
|
+
],
|
|
65
|
+
),
|
|
66
|
+
),
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
}'''
|
|
70
|
+
|
|
71
|
+
EXPERIMENT_02 = r'''EXPERIMENT 02 - RESPONSIVE E-COMMERCE PRODUCT CATALOG
|
|
72
|
+
=====================================================
|
|
73
|
+
|
|
74
|
+
import 'package:flutter/material.dart';
|
|
75
|
+
|
|
76
|
+
void main() {
|
|
77
|
+
runApp(MyApp());
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
class MyApp extends StatelessWidget {
|
|
81
|
+
@override
|
|
82
|
+
Widget build(BuildContext context) {
|
|
83
|
+
return MaterialApp(
|
|
84
|
+
debugShowCheckedModeBanner: false,
|
|
85
|
+
home: HomePage(),
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
class HomePage extends StatelessWidget {
|
|
91
|
+
List<Map<String, String>> products = [
|
|
92
|
+
{"name": "Laptop", "price": "50000", "emoji": "💻"},
|
|
93
|
+
{"name": "Mobile", "price": "20000", "emoji": "📱"},
|
|
94
|
+
{"name": "Headphones", "price": "2000", "emoji": "🎧"},
|
|
95
|
+
{"name": "Smart Watch", "price": "5000", "emoji": "⌚"},
|
|
96
|
+
{"name": "Camera", "price": "30000", "emoji": "📷"},
|
|
97
|
+
{"name": "Tablet", "price": "25000", "emoji": "📱"},
|
|
98
|
+
];
|
|
99
|
+
|
|
100
|
+
@override
|
|
101
|
+
Widget build(BuildContext context) {
|
|
102
|
+
double width = MediaQuery.of(context).size.width;
|
|
103
|
+
|
|
104
|
+
int columns = 2;
|
|
105
|
+
|
|
106
|
+
if (width >= 600) {
|
|
107
|
+
columns = 3;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
if (width >= 900) {
|
|
111
|
+
columns = 4;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
return Scaffold(
|
|
115
|
+
appBar: AppBar(title: Text("Product Catalog")),
|
|
116
|
+
body: GridView.count(
|
|
117
|
+
crossAxisCount: columns,
|
|
118
|
+
children: [
|
|
119
|
+
for (var item in products)
|
|
120
|
+
ProductCard(
|
|
121
|
+
name: item["name"]!,
|
|
122
|
+
price: item["price"]!,
|
|
123
|
+
emoji: item["emoji"]!,
|
|
124
|
+
),
|
|
125
|
+
],
|
|
126
|
+
),
|
|
127
|
+
);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
class ProductCard extends StatelessWidget {
|
|
132
|
+
final String name;
|
|
133
|
+
final String price;
|
|
134
|
+
final String emoji;
|
|
135
|
+
|
|
136
|
+
ProductCard({
|
|
137
|
+
required this.name,
|
|
138
|
+
required this.price,
|
|
139
|
+
required this.emoji,
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
@override
|
|
143
|
+
Widget build(BuildContext context) {
|
|
144
|
+
return Card(
|
|
145
|
+
child: Container(
|
|
146
|
+
padding: EdgeInsets.all(10),
|
|
147
|
+
child: Column(
|
|
148
|
+
mainAxisAlignment: MainAxisAlignment.center,
|
|
149
|
+
children: [
|
|
150
|
+
Text(emoji, style: TextStyle(fontSize: 40)),
|
|
151
|
+
SizedBox(height: 10),
|
|
152
|
+
Text(name),
|
|
153
|
+
Text("Price: Rs. $price"),
|
|
154
|
+
ElevatedButton(
|
|
155
|
+
onPressed: () {},
|
|
156
|
+
child: Text("Buy Now"),
|
|
157
|
+
),
|
|
158
|
+
],
|
|
159
|
+
),
|
|
160
|
+
),
|
|
161
|
+
);
|
|
162
|
+
}
|
|
163
|
+
}'''
|
|
164
|
+
|
|
165
|
+
EXPERIMENT_03 = r'''EXPERIMENT 03 - SEARCH / FILTER PRODUCTS
|
|
166
|
+
========================================
|
|
167
|
+
|
|
168
|
+
import 'package:flutter/material.dart';
|
|
169
|
+
|
|
170
|
+
void main() {
|
|
171
|
+
runApp(MyApp());
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
class MyApp extends StatelessWidget {
|
|
175
|
+
@override
|
|
176
|
+
Widget build(BuildContext context) {
|
|
177
|
+
return MaterialApp(
|
|
178
|
+
debugShowCheckedModeBanner: false,
|
|
179
|
+
home: HomePage(),
|
|
180
|
+
);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
class HomePage extends StatefulWidget {
|
|
185
|
+
@override
|
|
186
|
+
State<HomePage> createState() => _HomePageState();
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
class _HomePageState extends State<HomePage> {
|
|
190
|
+
String search = "";
|
|
191
|
+
|
|
192
|
+
List<Map<String, String>> products = [
|
|
193
|
+
{"name": "Laptop", "price": "50000", "emoji": "💻"},
|
|
194
|
+
{"name": "Mobile", "price": "20000", "emoji": "📱"},
|
|
195
|
+
{"name": "Headphones", "price": "2000", "emoji": "🎧"},
|
|
196
|
+
{"name": "Smart Watch", "price": "5000", "emoji": "⌚"},
|
|
197
|
+
{"name": "Camera", "price": "30000", "emoji": "📷"},
|
|
198
|
+
{"name": "Tablet", "price": "25000", "emoji": "📱"},
|
|
199
|
+
];
|
|
200
|
+
|
|
201
|
+
@override
|
|
202
|
+
Widget build(BuildContext context) {
|
|
203
|
+
return Scaffold(
|
|
204
|
+
appBar: AppBar(title: Text("Product Search")),
|
|
205
|
+
body: Padding(
|
|
206
|
+
padding: EdgeInsets.all(10),
|
|
207
|
+
child: Column(
|
|
208
|
+
children: [
|
|
209
|
+
TextField(
|
|
210
|
+
decoration: InputDecoration(
|
|
211
|
+
labelText: "Search Product",
|
|
212
|
+
border: OutlineInputBorder(),
|
|
213
|
+
),
|
|
214
|
+
onChanged: (value) {
|
|
215
|
+
setState(() {
|
|
216
|
+
search = value;
|
|
217
|
+
});
|
|
218
|
+
},
|
|
219
|
+
),
|
|
220
|
+
|
|
221
|
+
SizedBox(height: 20),
|
|
222
|
+
|
|
223
|
+
Expanded(
|
|
224
|
+
child: GridView.count(
|
|
225
|
+
crossAxisCount: 2,
|
|
226
|
+
childAspectRatio: 0.9,
|
|
227
|
+
children: [
|
|
228
|
+
for (var item in products)
|
|
229
|
+
if (item["name"]!.toLowerCase().contains(search.toLowerCase()))
|
|
230
|
+
ProductCard(
|
|
231
|
+
name: item["name"]!,
|
|
232
|
+
price: item["price"]!,
|
|
233
|
+
emoji: item["emoji"]!,
|
|
234
|
+
),
|
|
235
|
+
],
|
|
236
|
+
),
|
|
237
|
+
),
|
|
238
|
+
],
|
|
239
|
+
),
|
|
240
|
+
),
|
|
241
|
+
);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
class ProductCard extends StatelessWidget {
|
|
246
|
+
final String name;
|
|
247
|
+
final String price;
|
|
248
|
+
final String emoji;
|
|
249
|
+
|
|
250
|
+
ProductCard({
|
|
251
|
+
required this.name,
|
|
252
|
+
required this.price,
|
|
253
|
+
required this.emoji,
|
|
254
|
+
});
|
|
255
|
+
|
|
256
|
+
@override
|
|
257
|
+
Widget build(BuildContext context) {
|
|
258
|
+
return Card(
|
|
259
|
+
elevation: 4,
|
|
260
|
+
child: Container(
|
|
261
|
+
padding: EdgeInsets.all(10),
|
|
262
|
+
child: Column(
|
|
263
|
+
mainAxisAlignment: MainAxisAlignment.center,
|
|
264
|
+
children: [
|
|
265
|
+
Text(emoji, style: TextStyle(fontSize: 40)),
|
|
266
|
+
SizedBox(height: 10),
|
|
267
|
+
Text(
|
|
268
|
+
name,
|
|
269
|
+
style: TextStyle(fontWeight: FontWeight.bold),
|
|
270
|
+
),
|
|
271
|
+
Text("Price: $price"),
|
|
272
|
+
ElevatedButton(
|
|
273
|
+
onPressed: () {},
|
|
274
|
+
child: Text("Buy Now"),
|
|
275
|
+
),
|
|
276
|
+
],
|
|
277
|
+
),
|
|
278
|
+
),
|
|
279
|
+
);
|
|
280
|
+
}
|
|
281
|
+
}'''
|
|
282
|
+
|
|
283
|
+
EXPERIMENT_04 = r'''EXPERIMENT 04 - CAR MILEAGE CALCULATOR WITH FORM VALIDATION
|
|
284
|
+
===========================================================
|
|
285
|
+
|
|
286
|
+
import 'package:flutter/material.dart';
|
|
287
|
+
|
|
288
|
+
void main() {
|
|
289
|
+
runApp(MyApp());
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
class MyApp extends StatelessWidget {
|
|
293
|
+
@override
|
|
294
|
+
Widget build(BuildContext context) {
|
|
295
|
+
return MaterialApp(
|
|
296
|
+
debugShowCheckedModeBanner: false,
|
|
297
|
+
home: HomePage(),
|
|
298
|
+
);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
class HomePage extends StatefulWidget {
|
|
303
|
+
@override
|
|
304
|
+
State<HomePage> createState() => _HomePageState();
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
class _HomePageState extends State<HomePage> {
|
|
308
|
+
TextEditingController distanceController = TextEditingController();
|
|
309
|
+
TextEditingController fuelController = TextEditingController();
|
|
310
|
+
|
|
311
|
+
final formKey = GlobalKey<FormState>();
|
|
312
|
+
|
|
313
|
+
double mileage = 0;
|
|
314
|
+
|
|
315
|
+
@override
|
|
316
|
+
Widget build(BuildContext context) {
|
|
317
|
+
return Scaffold(
|
|
318
|
+
appBar: AppBar(title: Text("Car Mileage Calculator")),
|
|
319
|
+
body: Padding(
|
|
320
|
+
padding: EdgeInsets.all(20),
|
|
321
|
+
child: Form(
|
|
322
|
+
key: formKey,
|
|
323
|
+
child: Column(
|
|
324
|
+
children: [
|
|
325
|
+
TextFormField(
|
|
326
|
+
controller: distanceController,
|
|
327
|
+
keyboardType: TextInputType.number,
|
|
328
|
+
decoration: InputDecoration(
|
|
329
|
+
labelText: "Distance (KM)",
|
|
330
|
+
border: OutlineInputBorder(),
|
|
331
|
+
),
|
|
332
|
+
validator: (value) {
|
|
333
|
+
if (value == null || value.isEmpty) {
|
|
334
|
+
return "Enter distance";
|
|
335
|
+
}
|
|
336
|
+
return null;
|
|
337
|
+
},
|
|
338
|
+
),
|
|
339
|
+
|
|
340
|
+
SizedBox(height: 20),
|
|
341
|
+
|
|
342
|
+
TextFormField(
|
|
343
|
+
controller: fuelController,
|
|
344
|
+
keyboardType: TextInputType.number,
|
|
345
|
+
decoration: InputDecoration(
|
|
346
|
+
labelText: "Fuel (Litres)",
|
|
347
|
+
border: OutlineInputBorder(),
|
|
348
|
+
),
|
|
349
|
+
validator: (value) {
|
|
350
|
+
if (value == null || value.isEmpty) {
|
|
351
|
+
return "Enter fuel";
|
|
352
|
+
}
|
|
353
|
+
return null;
|
|
354
|
+
},
|
|
355
|
+
),
|
|
356
|
+
|
|
357
|
+
SizedBox(height: 20),
|
|
358
|
+
|
|
359
|
+
ElevatedButton(
|
|
360
|
+
onPressed: () {
|
|
361
|
+
if (formKey.currentState!.validate()) {
|
|
362
|
+
double distance =
|
|
363
|
+
double.parse(distanceController.text);
|
|
364
|
+
double fuel =
|
|
365
|
+
double.parse(fuelController.text);
|
|
366
|
+
|
|
367
|
+
setState(() {
|
|
368
|
+
mileage = distance / fuel;
|
|
369
|
+
});
|
|
370
|
+
}
|
|
371
|
+
},
|
|
372
|
+
child: Text("Calculate Mileage"),
|
|
373
|
+
),
|
|
374
|
+
|
|
375
|
+
SizedBox(height: 20),
|
|
376
|
+
|
|
377
|
+
Text(
|
|
378
|
+
"Mileage: ${mileage.toStringAsFixed(2)} KM/L",
|
|
379
|
+
style: TextStyle(
|
|
380
|
+
fontSize: 20,
|
|
381
|
+
fontWeight: FontWeight.bold,
|
|
382
|
+
),
|
|
383
|
+
),
|
|
384
|
+
],
|
|
385
|
+
),
|
|
386
|
+
),
|
|
387
|
+
),
|
|
388
|
+
);
|
|
389
|
+
}
|
|
390
|
+
}'''
|
|
391
|
+
|
|
392
|
+
EXPERIMENT_05 = r'''EXPERIMENT 05 - NAVIGATION AND PASSING DATA (Navigator.push)
|
|
393
|
+
============================================================
|
|
394
|
+
|
|
395
|
+
import 'package:flutter/material.dart';
|
|
396
|
+
|
|
397
|
+
void main() {
|
|
398
|
+
runApp(MyApp());
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
class MyApp extends StatelessWidget {
|
|
402
|
+
@override
|
|
403
|
+
Widget build(BuildContext context) {
|
|
404
|
+
return MaterialApp(
|
|
405
|
+
debugShowCheckedModeBanner: false,
|
|
406
|
+
home: HomePage(),
|
|
407
|
+
);
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
class HomePage extends StatelessWidget {
|
|
412
|
+
TextEditingController nameController = TextEditingController();
|
|
413
|
+
|
|
414
|
+
@override
|
|
415
|
+
Widget build(BuildContext context) {
|
|
416
|
+
return Scaffold(
|
|
417
|
+
appBar: AppBar(title: Text("Home Page")),
|
|
418
|
+
body: Padding(
|
|
419
|
+
padding: EdgeInsets.all(20),
|
|
420
|
+
child: Column(
|
|
421
|
+
children: [
|
|
422
|
+
TextField(
|
|
423
|
+
controller: nameController,
|
|
424
|
+
decoration: InputDecoration(
|
|
425
|
+
labelText: "Enter Name",
|
|
426
|
+
border: OutlineInputBorder(),
|
|
427
|
+
),
|
|
428
|
+
),
|
|
429
|
+
|
|
430
|
+
SizedBox(height: 20),
|
|
431
|
+
|
|
432
|
+
ElevatedButton(
|
|
433
|
+
onPressed: () {
|
|
434
|
+
Navigator.push(
|
|
435
|
+
context,
|
|
436
|
+
MaterialPageRoute(
|
|
437
|
+
builder: (context) =>
|
|
438
|
+
SecondPage(name: nameController.text),
|
|
439
|
+
),
|
|
440
|
+
);
|
|
441
|
+
},
|
|
442
|
+
child: Text("Submit"),
|
|
443
|
+
),
|
|
444
|
+
],
|
|
445
|
+
),
|
|
446
|
+
),
|
|
447
|
+
);
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
class SecondPage extends StatelessWidget {
|
|
452
|
+
final String name;
|
|
453
|
+
|
|
454
|
+
SecondPage({required this.name});
|
|
455
|
+
|
|
456
|
+
@override
|
|
457
|
+
Widget build(BuildContext context) {
|
|
458
|
+
return Scaffold(
|
|
459
|
+
appBar: AppBar(title: Text("Second Page")),
|
|
460
|
+
body: Center(
|
|
461
|
+
child: Column(
|
|
462
|
+
mainAxisAlignment: MainAxisAlignment.center,
|
|
463
|
+
children: [
|
|
464
|
+
Text(
|
|
465
|
+
"Welcome $name",
|
|
466
|
+
style: TextStyle(fontSize: 25),
|
|
467
|
+
),
|
|
468
|
+
|
|
469
|
+
SizedBox(height: 20),
|
|
470
|
+
|
|
471
|
+
ElevatedButton(
|
|
472
|
+
onPressed: () {
|
|
473
|
+
Navigator.pop(context);
|
|
474
|
+
},
|
|
475
|
+
child: Text("Go Back"),
|
|
476
|
+
),
|
|
477
|
+
],
|
|
478
|
+
),
|
|
479
|
+
),
|
|
480
|
+
);
|
|
481
|
+
}
|
|
482
|
+
}'''
|
|
483
|
+
|
|
484
|
+
|
|
485
|
+
def e1():
|
|
486
|
+
print(EXPERIMENT_01)
|
|
487
|
+
|
|
488
|
+
|
|
489
|
+
def e2():
|
|
490
|
+
print(EXPERIMENT_02)
|
|
491
|
+
|
|
492
|
+
|
|
493
|
+
def e3():
|
|
494
|
+
print(EXPERIMENT_03)
|
|
495
|
+
|
|
496
|
+
|
|
497
|
+
def e4():
|
|
498
|
+
print(EXPERIMENT_04)
|
|
499
|
+
|
|
500
|
+
|
|
501
|
+
def e5():
|
|
502
|
+
print(EXPERIMENT_05)
|
|
503
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=61.0"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "ffute"
|
|
7
|
+
version = "0.0.1"
|
|
8
|
+
description = "ffute"
|
|
9
|
+
readme = { text = "ffute", content-type = "text/plain" }
|
|
10
|
+
requires-python = ">=3.7"
|
|
11
|
+
dependencies = []
|
|
12
|
+
|
|
13
|
+
[tool.setuptools.packages.find]
|
|
14
|
+
where = ["."]
|
|
15
|
+
include = ["ffute*", "ffmpeg*"]
|
ffute-0.0.1/setup.cfg
ADDED