AI Project Idea Generator App using Flutter (ONE main.dart) – Responsive & Futuristic
Demo :
Click Video πππ
⭐ FEATURES :
-
✔ Single File Flutter App (main.dart only)
-
✔ No Backend / No API
-
✔ Fully Responsive (Mobile + Desktop)
-
✔ Cyberpunk Hacker UI
-
✔ Perfect for Final Year Students
Code :
import 'dart:ui';
import 'dart:math';
import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart';
// ---------------------------------------------------------------------------
// MAIN ENTRY POINT
// ---------------------------------------------------------------------------
void main() {
runApp(const MyApp());
}
// ---------------------------------------------------------------------------
// ROOT WIDGET
// ---------------------------------------------------------------------------
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'AI Project Generator',
debugShowCheckedModeBanner: false,
theme: ThemeData.dark().copyWith(
scaffoldBackgroundColor: const Color(0xFF050505),
primaryColor: const Color(0xFF00F0FF),
colorScheme: const ColorScheme.dark(
primary: Color(0xFF00F0FF),
secondary: Color(0xFF7000FF),
surface: Color(0xFF101015),
),
textTheme: GoogleFonts.orbitronTextTheme(
ThemeData.dark().textTheme,
),
useMaterial3: true,
),
home: const GeneratorScreen(),
);
}
}
// ---------------------------------------------------------------------------
// DATA MODELS
// ---------------------------------------------------------------------------
class ProjectIdea {
final String title;
final String description;
final List<String> techStack;
const ProjectIdea({
required this.title,
required this.description,
required this.techStack,
});
}
// ---------------------------------------------------------------------------
// HARDCODED DATABASE (AI-POWERED SIMULATION)
// ---------------------------------------------------------------------------
const Map<String, List<ProjectIdea>> projectDatabase = {
'Flutter': [
ProjectIdea(
title: 'AR Furniture Visualizer',
description: 'An augmented reality app allowing users to place virtual furniture in their real-world environment to test fit and style before buying.',
techStack: ['Flutter', 'ARKit/ARCore', 'Firebase'],
),
ProjectIdea(
title: 'Crypto Portfolio AI',
description: 'A real-time cryptocurrency tracker that uses on-device ML to predict short-term price trends based on social sentiment.',
techStack: ['Flutter', 'TensorFlow Lite', 'Coingecko API'],
),
ProjectIdea(
title: 'EcoTrack Carbon Footprint',
description: 'A gamified automated carbon footprint tracker that scans grocery receipts and travel history to estimate impact.',
techStack: ['Flutter', 'OCR', 'Gamification'],
),
ProjectIdea(
title: 'Voice-Controlled Smart Hub',
description: 'A dedicated tablet interface for smart homes that runs offline voice recognition to control lights and security.',
techStack: ['Flutter', 'Porcupine (Voice)', 'IoT / MQTT'],
),
],
'Web Development': [
ProjectIdea(
title: 'AI Collaborative Whiteboard',
description: 'A real-time collaborative drawing board where an AI assistant expands rough sketches into high-fidelity UI designs.',
techStack: ['React/Next.js', 'Socket.io', 'Stable Diffusion API'],
),
ProjectIdea(
title: 'DevOps Visualizer Dashboard',
description: 'A 3D visualization of server architectures and container health using WebGL to monitor cloud infrastructure.',
techStack: ['Three.js', 'Vue.js', 'Docker API'],
),
ProjectIdea(
title: 'SaaS Boilerplate Generator',
description: 'An interactive CLI and Web tool that generates custom full-stack starter kits based on selected features.',
techStack: ['Node.js', 'EJS', 'TailwindCSS'],
),
],
'AI / ML': [
ProjectIdea(
title: 'Sign Language Translator',
description: 'A real-time computer vision system that translates American Sign Language (ASL) gestures into spoken text.',
techStack: ['Python', 'OpenCV', 'PyTorch'],
),
ProjectIdea(
title: 'DeepFake Detector',
description: 'A browser extension and web service that analyzes video metadata and artifacts to flag potential deepfake content.',
techStack: ['TensorFlow', 'Flask', 'React'],
),
ProjectIdea(
title: 'Personalized Music Composer',
description: 'An AI model that generates infinite ambient focus music tailored to the user’s current heart rate and weather.',
techStack: ['Python', 'NumPy', 'Spotify API'],
),
],
'Cyber Security': [
ProjectIdea(
title: 'Phishing Link Terminator',
description: 'An advanced email scanner that uses NLP to detect semantic urgency and suspicious patterns in incoming mails.',
techStack: ['Python', 'BERT Model', 'Chrome Extension'],
),
ProjectIdea(
title: 'Network Packet Visualizer',
description: 'A desktop tool that visualizes network traffic in a cyberpunk grid to identify anomalies and potential intrusions.',
techStack: ['Rust', 'Tauri', 'Wireshark Libs'],
),
ProjectIdea(
title: 'Zero-Knowledge File Vault',
description: 'A secure cloud storage client where encryption keys never leave the client device, ensuring total privacy.',
techStack: ['Go', 'React', 'WASM'],
),
],
};
// ---------------------------------------------------------------------------
// MAIN SCREEN
// ---------------------------------------------------------------------------
class GeneratorScreen extends StatefulWidget {
const GeneratorScreen({super.key});
@override
State<GeneratorScreen> createState() => _GeneratorScreenState();
}
class _GeneratorScreenState extends State<GeneratorScreen> with TickerProviderStateMixin {
String _selectedDomain = 'Flutter';
ProjectIdea? _currentIdea;
bool _isGenerating = false;
late AnimationController _glowController;
late AnimationController _cardController;
@override
void initState() {
super.initState();
// Background pulsing glow
_glowController = AnimationController(
vsync: this,
duration: const Duration(seconds: 4),
)..repeat(reverse: true);
// Card entrance animation
_cardController = AnimationController(
vsync: this,
duration: const Duration(milliseconds: 600),
);
}
@override
void dispose() {
_glowController.dispose();
_cardController.dispose();
super.dispose();
}
void _generateIdea() async {
setState(() {
_isGenerating = true;
_cardController.reverse(); // Hide current card
});
// Simulate AI "Processing"
await Future.delayed(const Duration(milliseconds: 1200));
final ideas = projectDatabase[_selectedDomain] ?? [];
if (ideas.isNotEmpty) {
final random = Random();
setState(() {
_currentIdea = ideas[random.nextInt(ideas.length)];
_isGenerating = false;
_cardController.forward(); // Show new card
});
} else {
setState(() {
_isGenerating = false;
});
}
}
@override
Widget build(BuildContext context) {
// Responsive Helper
final size = MediaQuery.of(context).size;
final isDesktop = size.width > 800;
final double contentWidth = isDesktop ? 600 : size.width * 0.9;
return Scaffold(
body: Stack(
children: [
// 1. FUTURISTIC BACKGROUND
Positioned.fill(
child: Container(
decoration: const BoxDecoration(
gradient: LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [
Color(0xFF050505),
Color(0xFF0A0A12),
Color(0xFF000000),
],
),
),
),
),
// Animated Glow Orbs
AnimatedBuilder(
animation: _glowController,
builder: (context, child) {
return Positioned(
top: -100 + (_glowController.value * 20),
right: -100,
child: Container(
width: 400,
height: 400,
decoration: BoxDecoration(
shape: BoxShape.circle,
color: const Color(0xFF7000FF).withOpacity(0.15),
boxShadow: [
BoxShadow(
color: const Color(0xFF7000FF).withOpacity(0.3),
blurRadius: 100,
spreadRadius: 50,
),
],
),
),
);
},
),
AnimatedBuilder(
animation: _glowController,
builder: (context, child) {
return Positioned(
bottom: -100 - (_glowController.value * 20),
left: -100,
child: Container(
width: 300,
height: 300,
decoration: BoxDecoration(
shape: BoxShape.circle,
color: const Color(0xFF00F0FF).withOpacity(0.15),
boxShadow: [
BoxShadow(
color: const Color(0xFF00F0FF).withOpacity(0.3),
blurRadius: 100,
spreadRadius: 50,
),
],
),
),
);
},
),
// 2. GLASSMORPHISM GRID OVERLAY (SUBTLE TEXTURE)
Positioned.fill(
child: CustomPaint(
painter: GridPainter(),
),
),
// 3. MAIN CONTENT
Center(
child: SingleChildScrollView(
child: ConstrainedBox(
constraints: BoxConstraints(maxWidth: contentWidth),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
// Header
Text(
'AI NEXUS',
textAlign: TextAlign.center,
style: GoogleFonts.orbitron(
fontSize: isDesktop ? 48 : 32,
fontWeight: FontWeight.w900,
color: Colors.white,
letterSpacing: 4,
shadows: [
const Shadow(color: Color(0xFF00F0FF), blurRadius: 20),
],
),
),
const SizedBox(height: 10),
Text(
'PROJECT IDEA GENERATOR',
textAlign: TextAlign.center,
style: GoogleFonts.robotoMono(
fontSize: 14,
color: Colors.white70,
letterSpacing: 2,
),
),
const SizedBox(height: 50),
// Domain Selector
GlassContainer(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'SELECT DOMAIN',
style: GoogleFonts.orbitron(
color: const Color(0xFF00F0FF),
fontSize: 12,
fontWeight: FontWeight.bold,
),
),
const SizedBox(height: 10),
DropdownButtonFormField<String>(
value: _selectedDomain,
dropdownColor: const Color(0xFF151520),
style: GoogleFonts.poppins(color: Colors.white),
decoration: InputDecoration(
filled: true,
fillColor: Colors.black26,
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(12),
borderSide: BorderSide.none,
),
enabledBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(12),
borderSide: BorderSide(color: Colors.white.withOpacity(0.1)),
),
),
icon: const Icon(Icons.arrow_drop_down, color: Color(0xFF00F0FF)),
items: projectDatabase.keys.map((String key) {
return DropdownMenuItem<String>(
value: key,
child: Text(key),
);
}).toList(),
onChanged: (val) {
setState(() {
_selectedDomain = val!;
});
},
),
],
),
),
const SizedBox(height: 30),
// GENERATE BUTTON
GestureDetector(
onTap: _isGenerating ? null : _generateIdea,
child: AnimatedContainer(
duration: const Duration(milliseconds: 200),
height: 60,
decoration: BoxDecoration(
gradient: LinearGradient(
colors: _isGenerating
? [Colors.grey, Colors.grey.shade800]
: [const Color(0xFF00F0FF), const Color(0xFF7000FF)],
),
borderRadius: BorderRadius.circular(30),
boxShadow: [
if (!_isGenerating)
BoxShadow(
color: const Color(0xFF00F0FF).withOpacity(0.6),
blurRadius: 20,
spreadRadius: 0,
offset: const Offset(0, 4),
),
],
),
child: Center(
child: _isGenerating
? const SizedBox(
width: 24,
height: 24,
child: CircularProgressIndicator(
color: Colors.white,
strokeWidth: 2,
),
)
: Text(
'INITIALIZE GENERATION',
style: GoogleFonts.orbitron(
color: Colors.white,
fontSize: 16,
fontWeight: FontWeight.bold,
letterSpacing: 1.5,
),
),
),
),
),
const SizedBox(height: 40),
// VIEWPORT / RESULT AREA
AnimatedSize(
duration: const Duration(milliseconds: 300),
child: _currentIdea == null && !_isGenerating
? Center(
child: Text(
'WAITING FOR INPUT...',
style: GoogleFonts.robotoMono(
color: Colors.white24,
fontSize: 14,
),
),
)
: FadeTransition(
opacity: _cardController,
child: SlideTransition(
position: Tween<Offset>(
begin: const Offset(0, 0.1),
end: Offset.zero,
).animate(CurvedAnimation(
parent: _cardController,
curve: Curves.easeOutBack,
)),
child: _ProjectCard(idea: _currentIdea),
),
),
),
],
),
),
),
),
],
),
);
}
}
// ---------------------------------------------------------------------------
// WIDGETS
// ---------------------------------------------------------------------------
class GlassContainer extends StatelessWidget {
final Widget child;
final EdgeInsetsGeometry padding;
const GlassContainer({
super.key,
required this.child,
this.padding = const EdgeInsets.all(24),
});
@override
Widget build(BuildContext context) {
return ClipRRect(
borderRadius: BorderRadius.circular(20),
child: BackdropFilter(
filter: ImageFilter.blur(sigmaX: 10, sigmaY: 10),
child: Container(
padding: padding,
decoration: BoxDecoration(
color: Colors.white.withOpacity(0.05),
borderRadius: BorderRadius.circular(20),
border: Border.all(
color: Colors.white.withOpacity(0.1),
),
),
child: child,
),
),
);
}
}
class _ProjectCard extends StatelessWidget {
final ProjectIdea? idea;
const _ProjectCard({required this.idea});
@override
Widget build(BuildContext context) {
if (idea == null) return const SizedBox.shrink();
return GlassContainer(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
const Icon(Icons.lightbulb_outline, color: Color(0xFF00F0FF), size: 28),
const SizedBox(width: 12),
Expanded(
child: Text(
idea!.title,
style: GoogleFonts.orbitron(
fontSize: 20,
fontWeight: FontWeight.bold,
color: Colors.white,
),
),
),
],
),
const SizedBox(height: 16),
Text(
idea!.description,
style: GoogleFonts.poppins(
fontSize: 15,
color: Colors.white70,
height: 1.5,
),
),
const SizedBox(height: 24),
Text(
'RECOMMENDED STACK',
style: GoogleFonts.orbitron(
fontSize: 10,
color: const Color(0xFF7000FF),
fontWeight: FontWeight.bold,
),
),
const SizedBox(height: 12),
Wrap(
spacing: 8,
runSpacing: 8,
children: idea!.techStack.map((tech) {
return Container(
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 6),
decoration: BoxDecoration(
color: const Color(0xFF7000FF).withOpacity(0.2),
borderRadius: BorderRadius.circular(20),
border: Border.all(color: const Color(0xFF7000FF).withOpacity(0.5)),
),
child: Text(
tech,
style: GoogleFonts.robotoMono(
fontSize: 12,
color: Colors.white,
),
),
);
}).toList(),
),
],
),
);
}
}
// ---------------------------------------------------------------------------
// PAINTERS
// ---------------------------------------------------------------------------
class GridPainter extends CustomPainter {
@override
void paint(Canvas canvas, Size size) {
final paint = Paint()
..color = Colors.white.withOpacity(0.03)
..strokeWidth = 1;
const double step = 40;
for (double x = 0; x < size.width; x += step) {
canvas.drawLine(Offset(x, 0), Offset(x, size.height), paint);
}
for (double y = 0; y < size.height; y += step) {
canvas.drawLine(Offset(0, y), Offset(size.width, y), paint);
}
}
@override
bool shouldRepaint(covariant CustomPainter oldDelegate) => false;
}
Comments
Post a Comment