Kodlar sırasıyla: Menü alanı
collection.dart
import '../../../../routes/routes.dart';
class Collection {
final String assetName;
final String title;
final String routeName;
Collection(this.assetName, this.title, this.routeName);
}
List<Collection> collections = [
Collection(
'assets/images/collection_icon/svg/quran.svg',
'Kuran',
RouteGenerator.quran,
),
Collection(
'assets/images/collection_icon/svg/hadees.svg',
'Hadis',
RouteGenerator.hadees,
),
Collection(
'assets/images/collection_icon/svg/duas.svg',
'Dualar',
RouteGenerator.dua,
),
Collection(
'assets/images/collection_icon/svg/tasbih.svg',
'Tesbih',
RouteGenerator.tasbih,
),
Collection(
'assets/images/collection_icon/svg/ilah.svg',
'Esmaul Hüsna',
RouteGenerator.allahName,
),
Collection(
'assets/images/collection_icon/svg/prayer_time.svg',
'Namaz Vakitleri',
RouteGenerator.prayerTimingPage,
),
Collection(
'assets/images/collection_icon/svg/kiblat.svg',
'Kıble',
RouteGenerator.qibla,
),
Collection(
'assets/images/collection_icon/svg/cami.svg',
'En yakın camii',
RouteGenerator.nearestMosque, // ekli
),
];collection_button.dart:import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:flutter_svg/flutter_svg.dart';
import '../../utils/coming_soon_dialog.dart';
import '../model/collection.dart';
class CollectionButton extends StatelessWidget {
const CollectionButton(this.collection, {super.key});
final Collection collection;
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: () {
// Eğer routeName "Coming Soon" veya boşsa, "Coming Soon" popup'ını göster
if (collection.routeName.isEmpty ||
collection.routeName.toLowerCase() == 'coming soon') {
showDialog(
context: context,
builder: (context) => const ComingSoonDialog(),
);
return;
}
// Eğer routeName tanımlıysa, ilgili sayfaya git
Navigator.of(context).pushNamed(collection.routeName);
},
child: Column(
children: [
SvgPicture.asset(
collection.assetName,
width: 64.w,
),
SizedBox(
width: 64.w,
child: Text(
collection.title,
style: Theme.of(context).textTheme.bodyLarge,
textAlign: TextAlign.center,
),
)
],
),
);
}
}routes.dart:import 'package:flutter/material.dart';
import '../src/features/hadees/screen/hadees_categories_screen.dart';
import '../src/features/tasbih/screen/tasbih_screen2.dart';
import '../src/features/allah_name/screen/allah_name_screen.dart';
import '../src/features/bottom_tab/screen/tab_screen.dart';
import '../src/features/dua/screen/dua_screen.dart';
import '../src/features/error/screen/database_error_screen.dart';
import '../src/features/permission/screen/location_permission_screen.dart';
import '../src/features/permission/screen/notification_permission_screen.dart';
import '../src/features/prayer_timing/screen/prayer_timing_screen.dart';
import '../src/features/qibla/screen/qibla_screen.dart';
import '../src/features/quran/screen/quran_screen.dart';
import '../src/features/setting/screen/thankyou_screen.dart';
import '../src/features/splash/screen/splash_screen.dart';
import '../src/features/mosque/screens/nearest_mosque_screen.dart'; // ✅ import eklendi
class RouteGenerator {
static const String splash = '/';
static const String tabScreen = '/tab';
static const String hadees = '/hadees';
static const String prayerTimingPage = '/prayer_timing';
static const String qibla = '/qibla';
static const String nearestMosque = '/nearest_mosque'; // Eklediğim
static const String thankyou = '/thank_you';
static const String databaseError = '/database_error';
static const String allahName = '/allah_name';
static const String tasbih = '/tasbih';
static const String dua = '/dua';
static const String quran = '/quran';
static const String locationPermission = '/location_permission';
static const String notificationPermission = '/notification_permission';
RouteGenerator._();
static Route<dynamic> generateRoute(RouteSettings settings) {
switch (settings.name) {
case splash:
return MaterialPageRoute(builder: (_) => const SplashScreen());
case tabScreen:
return MaterialPageRoute(builder: (_) => const TabScreen());
case prayerTimingPage:
return MaterialPageRoute(builder: (_) => const PrayerTimingScreen());
case qibla:
return MaterialPageRoute(builder: (_) => const QiblaScreen());
case thankyou:
return MaterialPageRoute(builder: (_) => const ThankyouScreen());
case nearestMosque:
return MaterialPageRoute(builder: (_) => NearestMosqueScreen());
case databaseError:
return MaterialPageRoute(builder: (_) => const DatabaseErrorScreen());
case allahName:
return MaterialPageRoute(builder: (_) => const AllahNameScreen());
case tasbih:
return MaterialPageRoute(builder: (_) => const ZikirmatikScreen());
case dua:
return MaterialPageRoute(builder: (_) => const DuaScreen());
case quran:
return MaterialPageRoute(builder: (_) => const QuranScreen());
case hadees:
return MaterialPageRoute(
builder: (_) => const HadeesCategoriesScreen());
case locationPermission:
return MaterialPageRoute(
builder: (_) => const LocationPermissionScreen());
case notificationPermission:
return MaterialPageRoute(
builder: (_) => const NotificationPermissionScreen());
default:
return MaterialPageRoute(
builder: (_) => Scaffold(
appBar: AppBar(title: const Text('Hata')),
body: const Center(child: Text('Sayfa bulunamadı')),
),
);
}
}
}main.dart: import 'dart:async';
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:google_mobile_ads/google_mobile_ads.dart';
import 'package:hive/hive.dart';
import 'package:hydrated_bloc/hydrated_bloc.dart';
import 'package:path_provider/path_provider.dart';
import 'package:sirat_e_mustaqeem/firebase_options.dart';
import 'package:sirat_e_mustaqeem/src/core/database/supabase_service.dart';
import 'package:sirat_e_mustaqeem/src/core/network/hive_service.dart';
import 'package:sirat_e_mustaqeem/src/core/network/onesignal_service.dart';
import 'package:sirat_e_mustaqeem/src/features/hadees/bloc/hadeeth_categories_cubit.dart';
import 'package:sirat_e_mustaqeem/src/features/home/widget/hadees_card/bloc/hadees_cubit.dart';
import 'package:sirat_e_mustaqeem/src/features/home/widget/random_image_card/bloc/random_image_card_cubit.dart';
import 'package:sirat_e_mustaqeem/src/features/quran/cubit/audio_player_cubit.dart';
import 'package:sirat_e_mustaqeem/src/features/quran/cubit/surah_cubit.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart';
import 'routes/routes.dart';
import 'src/core/notification/notification_service.dart';
import 'src/core/util/bloc/database/database_bloc.dart';
import 'src/core/util/bloc/dua/dua_bloc.dart';
import 'src/core/util/bloc/juz/juz_bloc.dart';
import 'src/core/util/bloc/location/location_bloc.dart';
import 'src/core/util/bloc/notification/notification_bloc.dart';
import 'src/core/util/bloc/prayer_timing_bloc/timing_bloc.dart';
import 'src/core/util/bloc/quran/quran_bloc.dart';
import 'src/core/util/bloc/surah/surah_bloc.dart';
import 'src/core/util/bloc/tasbih/tasbih_bloc.dart';
import 'src/core/util/bloc/theme/theme_bloc.dart';
import 'src/core/util/bloc/time_format/time_format_bloc.dart';
import 'src/features/allah_name/allah_names/allah_name_cubit.dart';
import 'src/features/bottom_tab/bloc/tab/tab_bloc.dart';
import 'src/features/quran/bloc/quran_theme/quran_theme_bloc.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await dotenv.load(fileName: ".env");
await NotificationService().init();
final appDocumentDir = await getApplicationDocumentsDirectory();
await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform);
HydratedBloc.storage = await HydratedStorage.build(
storageDirectory: appDocumentDir,
);
Hive.init(appDocumentDir.path);
HiveService.initialize;
OneSignalService.initialize;
unawaited(MobileAds.instance.initialize());
SupabaseService.initialize;
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MultiBlocProvider(
providers: [
BlocProvider<SurahCubit>(
create: (context) => SurahCubit(),
),
BlocProvider<HadeethCubit>(
create: (context) => HadeethCubit(),
),
BlocProvider<HadeesCubit>(
create: (context) => HadeesCubit(),
),
BlocProvider<RandomImageCardCubit>(
create: (context) => RandomImageCardCubit(),
),
BlocProvider<AudioPlayerCubit>(
create: (context) => AudioPlayerCubit(),
),
BlocProvider(
create: (context) => ThemeBloc(),
),
BlocProvider(
create: (context) => TimeFormatBloc(),
),
BlocProvider(
create: (context) => NotificationBloc(),
),
BlocProvider(
create: (context) => QuranThemeBloc(),
),
BlocProvider(
create: (context) => TimingBloc(),
),
BlocProvider(
create: (context) => AllahNameCubit(),
),
BlocProvider(
create: (context) => DuaBloc(),
),
BlocProvider(
create: (context) => QuranBloc(),
),
BlocProvider(
create: (context) => SurahBloc(),
),
BlocProvider(
create: (context) => TasbihBloc(),
),
BlocProvider(
create: (context) => JuzBloc(),
),
BlocProvider(
create: (context) => DatabaseBloc(),
),
BlocProvider(
create: (context) => TabBloc(),
),
BlocProvider(
create: (context) => LocationBloc(),
),
],
child: FutureBuilder<void>(
future: SystemChrome.setPreferredOrientations(
[
DeviceOrientation.portraitUp,
],
),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.done)
return ScreenUtilInit(
designSize: Size(414, 896),
builder: (context, child) {
return BlocBuilder<ThemeBloc, ThemeState>(
builder: (context, state) {
return MaterialApp(
title: 'Kuranı Kerim ve İslami Araçlar',
debugShowCheckedModeBanner: false,
color: Colors.white,
theme: state.currentTheme,
initialRoute: RouteGenerator.splash,
onGenerateRoute: RouteGenerator.generateRoute,
);
},
);
},
);
return MaterialApp(
title: 'Kuranı Kerim ve İslami Araçlar',
debugShowCheckedModeBanner: false,
color: Colors.white,
home: Container(),
);
}),
);
}
}Bu da en yakın camii sayfa ekranınearest_mosque_screen.dart:
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:geolocator/geolocator.dart';
import 'package:http/http.dart' as http;
import 'package:flutter_dotenv/flutter_dotenv.dart';
class NearestMosqueScreen extends StatefulWidget {
@override
_NearestMosqueScreenState createState() => _NearestMosqueScreenState();
}
class _NearestMosqueScreenState extends State<NearestMosqueScreen> {
late GoogleMapController mapController;
Position? currentPosition;
List<Marker> markers = [];
String apiKey = dotenv.env['GOOGLE_MAPS_API_KEY'] ?? "";
@override
void initState() {
super.initState();
_getCurrentLocation();
}
Future<void> _getCurrentLocation() async {
bool serviceEnabled;
LocationPermission permission;
serviceEnabled = await Geolocator.isLocationServiceEnabled();
if (!serviceEnabled) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Konum servisi etkin değil!')),
);
return;
}
permission = await Geolocator.checkPermission();
if (permission == LocationPermission.denied) {
permission = await Geolocator.requestPermission();
if (permission == LocationPermission.deniedForever) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
'Konum izni reddedildi! Lütfen ayarlardan etkinleştirin.')),
);
return;
}
}
Position position = await Geolocator.getCurrentPosition(
desiredAccuracy: LocationAccuracy.high);
setState(() {
currentPosition = position;
});
_getNearbyMosques(position.latitude, position.longitude);
}
Future<void> _getNearbyMosques(double lat, double lng) async {
if (apiKey.isEmpty) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Google Maps API Key eksik!')),
);
return;
}
final url =
"https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=$lat,$lng&radius=2000&type=mosque&key=$apiKey";
final response = await http.get(Uri.parse(url));
if (response.statusCode == 200) {
final data = json.decode(response.body);
if (data['status'] == 'OK') {
setState(() {
markers = data['results'].map<Marker>((place) {
return Marker(
markerId: MarkerId(place['place_id']),
position: LatLng(
place['geometry']['location']['lat'],
place['geometry']['location']['lng'],
),
infoWindow: InfoWindow(title: place['name']),
);
}).toList();
});
} else {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Camiler yüklenemedi: ${data['status']}')),
);
}
} else {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('API isteği başarısız: ${response.statusCode}')),
);
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text("En Yakın Camiler")),
body: currentPosition == null
? Center(child: CircularProgressIndicator())
: GoogleMap(
onMapCreated: (controller) => mapController = controller,
initialCameraPosition: CameraPosition(
target: LatLng(
currentPosition!.latitude, currentPosition!.longitude),
zoom: 14,
),
markers: Set<Marker>.of(markers),
),
);
}
}