Build AI Project Idea Generator App in Flutter (One main.dart | Futuristic UI)
Demo :
Click Video πππ
✨ Features :
-
✅ Single
main.dartfile -
✅ No backend / no API
-
✅ Fully responsive (All devices)
-
✅ Cyberpunk animated UI
-
✅ Real-world project ideas
-
✅ Perfect for students & developers
Code :
import 'dart:math';
import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
void main() {
WidgetsFlutterBinding.ensureInitialized();
SystemChrome.setSystemUIOverlayStyle(const SystemUiOverlayStyle(
statusBarColor: Colors.transparent,
statusBarIconBrightness: Brightness.light,
));
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'FuzzuTech Idea Generator',
debugShowCheckedModeBanner: false,
theme: ThemeData.dark().copyWith(
scaffoldBackgroundColor: const Color(0xFF050505),
primaryColor: const Color(0xFF00E5FF),
colorScheme: const ColorScheme.dark(
primary: Color(0xFF00E5FF),
secondary: Color(0xFFD500F9),
surface: Color(0xFF101010),
),
textTheme: const TextTheme(
displayLarge: TextStyle(fontFamily: 'Courier', letterSpacing: -1.5, fontWeight: FontWeight.bold),
displayMedium: TextStyle(fontFamily: 'Courier', letterSpacing: -1.0, fontWeight: FontWeight.bold),
bodyLarge: TextStyle(fontFamily: 'Verdana', height: 1.5),
bodyMedium: TextStyle(fontFamily: 'Verdana', height: 1.4),
),
),
home: const IdeaGeneratorScreen(),
);
}
}
class IdeaGeneratorScreen extends StatefulWidget {
const IdeaGeneratorScreen({super.key});
@override
State<IdeaGeneratorScreen> createState() => _IdeaGeneratorScreenState();
}
class _IdeaGeneratorScreenState extends State<IdeaGeneratorScreen> with SingleTickerProviderStateMixin {
late Map<String, String> _currentIdea;
late AnimationController _glowController;
final Random _random = Random();
final List<Map<String, String>> _ideas = [
{
"title": "NeuroFocus AI",
"description": "An app that uses camera-based eye tracking or EEG headset data to detect focus loss and plays binaural beats to restore concentration.",
"level": "Advanced",
"stack": "Flutter, Python (Backend), TensorFlow, Audio API"
},
{
"title": "HoloRent - AR Asset Viewer",
"description": "Real estate app allowing users to scan their empty room and visualize 3D rental furniture in real-time AR before renting.",
"level": "Intermediate",
"stack": "Flutter, ARKit/ARCore, Firebase, Stripe"
},
{
"title": "CryptoTracker 360",
"description": "A minimalist cryptocurrency portfolio tracker that uses sentiment analysis from Twitter/X to predict short-term price movements.",
"level": "Beginner",
"stack": "Flutter, CoinGecko API, Twitter API, Provider"
},
{
"title": "VoiceCode Assistant",
"description": "Accessibility tool for developers that converts natural language voice commands into valid syntax for Python, Dart, or JS.",
"level": "Advanced",
"stack": "Flutter, Speech-to-Text, OpenAI API, WebSocket"
},
{
"title": "EcoSnap - Recycle AI",
"description": "Take a picture of any trash item, and the AI tells you exactly how and where to recycle it in your local city.",
"level": "Beginner",
"stack": "Flutter, TFLite (On-device), Google Maps API"
},
{
"title": "SkillSwap Decentralized",
"description": "A P2P time-banking app where users trade skills (e.g., coding for guitar lessons) without using money, recorded on a mini-ledger.",
"level": "Intermediate",
"stack": "Flutter, Solidity (Optional), Firebase, WebRTC"
},
{
"title": "DreamJournal + AI Analysis",
"description": "Users voice-record dreams immediately upon waking; AI transcribes it, visualizes the scene using DALL-E, and analyzes psychological patterns.",
"level": "Intermediate",
"stack": "Flutter, Whisper API, DALL-E API, SQLite"
},
{
"title": "FitQuest Gamified",
"description": "An RPG workout app where your physical steps level up your character, unlock weapons, and battle bosses.",
"level": "Beginner",
"stack": "Flutter, Pedometer Sensor, Hive Database"
},
{
"title": "ChefBot Fridge Scanner",
"description": "Scan ingredients in your fridge using object detection, and get instant gourmet recipes based on what you have.",
"level": "Advanced",
"stack": "Flutter, YOLOv8, Spoonacular API"
},
{
"title": "SafeWalk Guardian",
"description": "Safety app that monitors walking speed and location. If motion stops abnormally or user screams, it silently alerts emergency contacts.",
"level": "Intermediate",
"stack": "Flutter, Geolocation, Accelerometer, SMS API"
},
{
"title": "Retro Game Emulator Wrapper",
"description": "A beautiful, customizable frontend for organizing and launching retro game ROMs with cover art scraping.",
"level": "Advanced",
"stack": "Flutter, File I/O, SQFlite, API Scraping"
},
{
"title": "Subscription Manager",
"description": "Tracks all monthly subscriptions. scans email for receipts (with permission) and alerts you before free trials end.",
"level": "Beginner",
"stack": "Flutter, Google Sign-In, Gmail API, Local Notifications"
},
];
@override
void initState() {
super.initState();
_currentIdea = _ideas[0];
_glowController = AnimationController(
vsync: this,
duration: const Duration(seconds: 2),
)..repeat(reverse: true);
_generateIdea(); // Start with a random one
}
void _generateIdea() {
setState(() {
_currentIdea = _ideas[_random.nextInt(_ideas.length)];
});
}
@override
void dispose() {
_glowController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Stack(
children: [
// 1. Dynamic Background
const AnimatedBackground(),
// 2. Main Content
Center(
child: LayoutBuilder(
builder: (context, constraints) {
// Responsive Logic
double maxWidth = constraints.maxWidth > 800 ? 500 : constraints.maxWidth * 0.9;
return SingleChildScrollView(
child: ConstrainedBox(
constraints: BoxConstraints(maxWidth: maxWidth),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
// App Header
Center(
child: Text(
"FUZZUTECH",
style: TextStyle(
fontFamily: 'Courier',
fontSize: 16,
letterSpacing: 4,
color: Theme.of(context).primaryColor.withOpacity(0.8),
),
),
),
const SizedBox(height: 10),
Center(
child: Text(
"PROJECT GENESIS",
textAlign: TextAlign.center,
style: TextStyle(
fontFamily: 'Courier',
fontSize: 32,
fontWeight: FontWeight.w900,
color: Colors.white,
shadows: [
Shadow(color: Theme.of(context).primaryColor, blurRadius: 20),
],
),
),
),
const SizedBox(height: 50),
// Project Card
AnimatedBuilder(
animation: _glowController,
builder: (context, child) {
return Container(
decoration: BoxDecoration(
color: const Color(0xFF121212).withOpacity(0.8),
borderRadius: BorderRadius.circular(24),
border: Border.all(
color: Theme.of(context).primaryColor.withOpacity(0.5 + (_glowController.value * 0.3)),
width: 1.5,
),
boxShadow: [
BoxShadow(
color: Theme.of(context).primaryColor.withOpacity(0.1 + (_glowController.value * 0.15)),
blurRadius: 20 + (_glowController.value * 10),
spreadRadius: 2,
),
BoxShadow(
color: Theme.of(context).colorScheme.secondary.withOpacity(0.1),
blurRadius: 40,
offset: const Offset(0, 10),
)
],
),
child: ClipRRect(
borderRadius: BorderRadius.circular(24),
child: BackdropFilter(
filter: ImageFilter.blur(sigmaX: 10, sigmaY: 10),
child: Padding(
padding: const EdgeInsets.all(32.0),
child: AnimatedSwitcher(
duration: const Duration(milliseconds: 500),
transitionBuilder: (Widget child, Animation<double> animation) {
return FadeTransition(opacity: animation, child: SlideTransition(
position: Tween<Offset>(begin: const Offset(0.0, 0.1), end: Offset.zero).animate(animation),
child: child,
));
},
child: _IdeaContent(
key: ValueKey(_currentIdea['title']),
idea: _currentIdea,
),
),
),
),
),
);
},
),
const SizedBox(height: 50),
// Generate Button
Center(
child: MouseRegion(
cursor: SystemMouseCursors.click,
child: GestureDetector(
onTap: _generateIdea,
child: AnimatedContainer(
duration: const Duration(milliseconds: 200),
padding: const EdgeInsets.symmetric(horizontal: 40, vertical: 20),
decoration: BoxDecoration(
gradient: LinearGradient(
colors: [
Theme.of(context).primaryColor,
Theme.of(context).colorScheme.secondary,
],
begin: Alignment.topLeft,
end: Alignment.bottomRight,
),
borderRadius: BorderRadius.circular(50),
boxShadow: [
BoxShadow(
color: Theme.of(context).primaryColor.withOpacity(0.4),
blurRadius: 15,
offset: const Offset(0, 5),
)
],
),
child: const Row(
mainAxisSize: MainAxisSize.min,
children: [
Icon(Icons.bolt, color: Colors.black, size: 28),
SizedBox(width: 12),
Text(
"GENERATE IDEA",
style: TextStyle(
fontFamily: 'Courier', // Fallback for futuristic font
color: Colors.black,
fontSize: 18,
fontWeight: FontWeight.bold,
letterSpacing: 1,
),
),
],
),
),
),
),
),
const SizedBox(height: 30),
],
),
),
);
},
),
),
],
),
);
}
}
class _IdeaContent extends StatelessWidget {
final Map<String, String> idea;
const _IdeaContent({required this.key, required this.idea}) : super(key: key);
final Key key;
@override
Widget build(BuildContext context) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// Difficulty Badge
Container(
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 6),
decoration: BoxDecoration(
color: _getDifficultyColor(idea['level']!).withOpacity(0.2),
borderRadius: BorderRadius.circular(8),
border: Border.all(color: _getDifficultyColor(idea['level']!).withOpacity(0.5)),
),
child: Text(
idea['level']!.toUpperCase(),
style: TextStyle(
color: _getDifficultyColor(idea['level']!),
fontSize: 12,
fontWeight: FontWeight.bold,
letterSpacing: 1.2,
),
),
),
const SizedBox(height: 20),
// Title
Text(
idea['title']!,
style: const TextStyle(
fontFamily: 'Courier',
fontSize: 28,
fontWeight: FontWeight.w800,
color: Colors.white,
letterSpacing: -0.5,
),
),
const SizedBox(height: 16),
// Description
Text(
idea['description']!,
style: const TextStyle(
color: Color(0xFFB0B0B0),
fontSize: 16,
height: 1.6,
),
),
const SizedBox(height: 24),
// Divider
Container(
height: 1,
width: double.infinity,
decoration: BoxDecoration(
gradient: LinearGradient(
colors: [
Colors.transparent,
Colors.white.withOpacity(0.2),
Colors.transparent,
],
),
),
),
const SizedBox(height: 24),
// Tech Stack
const Text(
"CORE TECH STACK",
style: TextStyle(
color: Color(0xFF606060),
fontSize: 12,
fontWeight: FontWeight.bold,
letterSpacing: 2,
),
),
const SizedBox(height: 12),
Wrap(
spacing: 8,
runSpacing: 8,
children: (idea['stack'] ?? "").split(', ').map((tech) {
return Container(
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8),
decoration: BoxDecoration(
color: const Color(0xFF202020),
borderRadius: BorderRadius.circular(20),
border: Border.all(color: Colors.white10),
),
child: Text(
tech,
style: const TextStyle(color: Color(0xFF00E5FF), fontSize: 13),
),
);
}).toList(),
),
],
);
}
Color _getDifficultyColor(String level) {
switch (level) {
case 'Beginner': return const Color(0xFF00E676); // Green
case 'Intermediate': return const Color(0xFFFFEA00); // Yellow
case 'Advanced': return const Color(0xFFFF1744); // Red
default: return Colors.white;
}
}
}
class AnimatedBackground extends StatefulWidget {
const AnimatedBackground({super.key});
@override
State<AnimatedBackground> createState() => _AnimatedBackgroundState();
}
class _AnimatedBackgroundState extends State<AnimatedBackground> with SingleTickerProviderStateMixin {
late AnimationController _controller;
@override
void initState() {
super.initState();
_controller = AnimationController(
vsync: this, duration: const Duration(seconds: 10))
..repeat();
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Stack(
children: [
// Base dark layer
Container(color: const Color(0xFF050505)),
// Moving Gradient Blobs
AnimatedBuilder(
animation: _controller,
builder: (context, child) {
return CustomPaint(
painter: BackgroundPainter(_controller.value),
size: Size.infinite,
);
},
),
// Grid Overlay (Cyberpunk Mesh)
Opacity(
opacity: 0.1,
child: CustomPaint(
painter: GridPainter(),
size: Size.infinite,
),
),
],
);
}
}
class BackgroundPainter extends CustomPainter {
final double animationValue;
BackgroundPainter(this.animationValue);
@override
void paint(Canvas canvas, Size size) {
final paint = Paint()..maskFilter = const MaskFilter.blur(BlurStyle.normal, 100);
// Blob 1 (Cyan)
final offset1 = Offset(
size.width * 0.2 + (sin(animationValue * 2 * pi) * 100),
size.height * 0.3 + (cos(animationValue * 2 * pi) * 100),
);
paint.color = const Color(0xFF00E5FF).withOpacity(0.2);
canvas.drawCircle(offset1, 200, paint);
// Blob 2 (Purple)
final offset2 = Offset(
size.width * 0.8 - (cos(animationValue * 2 * pi) * 100),
size.height * 0.7 - (sin(animationValue * 2 * pi) * 100),
);
paint.color = const Color(0xFFD500F9).withOpacity(0.15);
canvas.drawCircle(offset2, 250, paint);
}
@override
bool shouldRepaint(covariant BackgroundPainter oldDelegate) => true;
}
class GridPainter extends CustomPainter {
@override
void paint(Canvas canvas, Size size) {
final paint = Paint()
..color = Colors.white
..strokeWidth = 0.5
..style = PaintingStyle.stroke;
const double step = 50;
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 GridPainter oldDelegate) => false;
}
Comments
Post a Comment