Merhaba, hali hazırda çalışan Flutter uygulamasına En yakın camiler alanı eklemek istedim. Anasayfa menü kısmında eklenmesi gereken bir alan vardı ve oraya tıklayınca Coming Soon yazıyordu burayı en yakın cami ile değiştirdim. Ancak tıklayınca hala Coming Soon ekranı açılıyor. kök sayfasına .env için map apisi ekli. pubspec.yaml paketler ekli, manifest dosyasında gerekli bağlantılar da ekli sorun ne olabilir. Şimdiden teşekkür ederim.

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),
            ),
    );
  }
}