{"id":219,"date":"2025-05-09T13:54:00","date_gmt":"2025-05-09T13:54:00","guid":{"rendered":"https:\/\/www.webmobkey.com\/blog\/?p=219"},"modified":"2025-11-16T10:21:50","modified_gmt":"2025-11-16T10:21:50","slug":"flutterda-uzak-sunucudan-kolayca-veri-cekme-ve-listeleme","status":"publish","type":"post","link":"https:\/\/www.webmobdesign.com\/blog\/tr\/flutterda-uzak-sunucudan-kolayca-veri-cekme-ve-listeleme\/","title":{"rendered":"Flutter\u2019da Uzak Sunucudan Kolayca Veri \u00c7ekme ve Listeleme"},"content":{"rendered":"\n<p id=\"4f78\">Flutter ile bir projede d\u0131\u015f kaynaktan (\u00f6rne\u011fin bir JSON API ya da GitHub\u2019daki bir dosya) veri \u00e7ekmek ve bunu uygulamada g\u00f6stermek olduk\u00e7a basit ve g\u00fc\u00e7l\u00fc bir i\u015flemdir. Bu yaz\u0131da, Flutter\u2019da&nbsp;<code>http<\/code>&nbsp;paketini kullanarak uzak sunucudan veri nas\u0131l al\u0131n\u0131r, nas\u0131l modellenir ve kullan\u0131c\u0131ya nas\u0131l g\u00f6sterilir, bunu ad\u0131m ad\u0131m anlataca\u011f\u0131m.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"3e5d\"><strong>Tam Kod \u2014 main.dart<\/strong><\/h4>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: xml; title: ; notranslate\" title=\"\">\nimport 'dart:convert';\nimport 'package:flutter\/material.dart';\nimport 'package:http\/http.dart' as http;\n\n\/\/ MAIN APP\nvoid main() {\n  runApp(MaterialApp(\n    title: '\u00c7al\u0131\u015fma Saatleri',\n    theme: ThemeData(primarySwatch: Colors.teal),\n    home: WorkingHourScreen(),\n  ));\n}\n\/\/ SCREEN\nclass WorkingHourScreen extends StatefulWidget {\n  @override\n  _WorkingHourScreenState createState() =&gt; _WorkingHourScreenState();\n}\n\nclass _WorkingHourScreenState extends State&lt;WorkingHourScreen&gt; {\n  final WorkingHourService _service = WorkingHourService();\n  late Future&lt;List&lt;WorkingHour&gt;&gt; _future;\n\n  @override\n  void initState() {\n    super.initState();\n    _future = fetchWorkingHours();\n  }\n\n  Future&lt;List&lt;WorkingHour&gt;&gt; fetchWorkingHours() async {\n    Result? result = await _service.getWorkingHours();\n    if (result != null &amp;&amp; result.success &amp;&amp; result.data != null) {\n      return result.data.cast&lt;WorkingHour&gt;();\n    } else {\n      return &#x5B;];\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(title: Text(&quot;\u00c7al\u0131\u015fma Saatleri&quot;)),\n      body: FutureBuilder&lt;List&lt;WorkingHour&gt;&gt;(\n        future: _future,\n        builder: (context, snapshot) {\n          if (snapshot.connectionState == ConnectionState.waiting) {\n            return Center(child: CircularProgressIndicator());\n          } else if (snapshot.hasError) {\n            return Center(child: Text(&quot;Hata: ${snapshot.error}&quot;));\n          } else if (!snapshot.hasData || snapshot.data!.isEmpty) {\n            return Center(child: Text(&quot;Veri bulunamad\u0131.&quot;));\n          } else {\n            final hours = snapshot.data!;\n            return ListView.builder(\n              itemCount: hours.length,\n              itemBuilder: (context, index) {\n                final item = hours&#x5B;index];\n                return Card(\n                  margin: EdgeInsets.symmetric(horizontal: 12, vertical: 6),\n                  child: ListTile(\n                    title: Text(&quot;${item.day?.toLocal().toString().split(' ')&#x5B;0]}&quot;),\n                    subtitle: Text(&quot;Ba\u015flang\u0131\u00e7: ${item.startTime} - Biti\u015f: ${item.endTime}&quot;),\n                    leading: Icon(Icons.access_time),\n                  ),\n                );\n              },\n            );\n          }\n        },\n      ),\n    );\n  }\n}\n\n\/\/ MODEL\nclass WorkingHour {\n  int? id;\n  DateTime? day;\n  String? startTime;\n  String? endTime;\n  DateTime? createdAt;\n  DateTime? updatedAt;\n\n  WorkingHour({\n    this.id,\n    this.day,\n    this.startTime,\n    this.endTime,\n    this.createdAt,\n    this.updatedAt,\n  });\n\n  factory WorkingHour.fromJson(Map&lt;String, dynamic&gt; json) {\n    return WorkingHour(\n      id: json&#x5B;'id'],\n      day: json&#x5B;'day'] != null ? DateTime.tryParse(json&#x5B;'day']) : null,\n      startTime: json&#x5B;'start_time'],\n      endTime: json&#x5B;'end_time'],\n      createdAt:\n      json&#x5B;'created_at'] != null ? DateTime.tryParse(json&#x5B;'created_at']) : null,\n      updatedAt:\n      json&#x5B;'updated_at'] != null ? DateTime.tryParse(json&#x5B;'updated_at']) : null,\n    );\n  }\n}\n\n\/\/ RESULT WRAPPER\nclass Result {\n  bool success;\n  String? message;\n  dynamic data;\n\n  Result({required this.success, this.message, this.data});\n\n  factory Result.fromJson(Map&lt;String, dynamic&gt; json) {\n    return Result(\n      success: json&#x5B;'success'] ?? false,\n      message: json&#x5B;'message'],\n      data: json&#x5B;'data'],\n    );\n  }\n}\n\n\/\/ SERVICE\nclass WorkingHourService {\n  final String url = &quot;https:\/\/raw.githubusercontent.com\/AhmetAkinYazilim\/ExzamleDatabase\/refs\/heads\/main\/working_hours.json&quot;; \/\/ &lt;- kendi JSON URL'inle de\u011fi\u015ftir\n  Future&lt;Result?&gt; getWorkingHours() async {\n    try {\n      final response = await http.get(Uri.parse(url));\n      final data = json.decode(response.body);\n      final result = Result.fromJson(data);\n\n      if (response.statusCode &gt;= 200 &amp;&amp; response.statusCode &lt; 300) {\n        final hours = (result.data as List)\n            .map((e) =&gt; WorkingHour.fromJson(e))\n            .toList();\n\n        return Result(success: true, message: result.message, data: hours);\n      } else {\n        return Result(success: false, message: result.message);\n      }\n    } catch (e) {\n      return Result(success: false, message: e.toString());\n    }\n  }\n}\n<\/pre><\/div>\n\n\n<h3 class=\"wp-block-heading\" id=\"164f\">1. Gerekli Paketi Kurmak<\/h3>\n\n\n\n<p id=\"6321\">Veri \u00e7ekme i\u015flemleri i\u00e7in en s\u0131k kullan\u0131lan paketlerden biri&nbsp;<code>http<\/code>&nbsp;paketidir. Bu paketi projenize dahil etmek i\u00e7in&nbsp;<code>pubspec.yaml<\/code>&nbsp;dosyas\u0131na a\u015fa\u011f\u0131daki sat\u0131r\u0131 eklemeniz yeterli:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\ndependencies:\n  flutter:\n    sdk: flutter\n  http: ^0.13.6\n<\/pre><\/div>\n\n\n<p>Daha sonra terminalde \u015fu komutu \u00e7al\u0131\u015ft\u0131rarak paketi y\u00fckleyin:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nflutter pub get\n<\/pre><\/div>\n\n\n<h3 class=\"wp-block-heading\" id=\"46f7\">2. Proje Yap\u0131s\u0131 ve Kullan\u0131m Senaryosu<\/h3>\n\n\n\n<p id=\"5e49\">\u00d6rnek senaryomuzda, GitHub\u2019da bar\u0131nd\u0131r\u0131lan bir JSON dosyas\u0131ndan \u00e7al\u0131\u015fma saatlerini alaca\u011f\u0131z. Her g\u00fcn i\u00e7in ba\u015flang\u0131\u00e7 ve biti\u015f saatleri liste halinde kullan\u0131c\u0131ya g\u00f6sterilecek.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"db9a\">3. Uygulama Ekran\u0131<\/h4>\n\n\n\n<p id=\"2d23\">Ana ekran, veriyi \u00e7ektikten sonra bir liste olarak g\u00f6steriyor. Veri y\u00fcklenirken bir&nbsp;<code>Progress Indicator<\/code>, hata olu\u015fursa hata mesaj\u0131, veri yoksa \u201cVeri bulunamad\u0131\u201d mesaj\u0131 g\u00f6steriliyor:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: xml; title: ; notranslate\" title=\"\">\nbody: FutureBuilder&lt;List&lt;WorkingHour&gt;&gt;(\n  future: _future,\n  builder: (context, snapshot) {\n    if (snapshot.connectionState == ConnectionState.waiting) {\n      return Center(child: CircularProgressIndicator());\n    } else if (snapshot.hasError) {\n      return Center(child: Text(&quot;Hata: ${snapshot.error}&quot;));\n    } else if (!snapshot.hasData || snapshot.data!.isEmpty) {\n      return Center(child: Text(&quot;Veri bulunamad\u0131.&quot;));\n    } else {\n      final hours = snapshot.data!;\n      return ListView.builder(\n        itemCount: hours.length,\n        itemBuilder: (context, index) {\n          final item = hours&#x5B;index];\n          return Card(\n            child: ListTile(\n              title: Text(&quot;${item.day?.toLocal().toString().split(' ')&#x5B;0]}&quot;),\n              subtitle: Text(&quot;Ba\u015flang\u0131\u00e7: ${item.startTime} - Biti\u015f: ${item.endTime}&quot;),\n              leading: Icon(Icons.access_time),\n            ),\n          );\n        },\n      );\n    }\n  },\n),\n<\/pre><\/div>\n\n\n<h4 class=\"wp-block-heading\" id=\"a6b5\">4. Veri Modelleme (Model S\u0131n\u0131f\u0131)<\/h4>\n\n\n\n<p id=\"128e\">Sunucudan gelen JSON verilerini Dart nesnesine \u00e7evirmek i\u00e7in model s\u0131n\u0131flar\u0131m\u0131z\u0131 tan\u0131ml\u0131yoruz. \u00d6rne\u011fimizde&nbsp;<code>WorkingHour<\/code>&nbsp;ve&nbsp;<code>Result<\/code>&nbsp;ad\u0131nda iki model kulland\u0131k.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: xml; title: ; notranslate\" title=\"\">\nclass WorkingHour {\n  int? id;\n  DateTime? day;\n  String? startTime;\n  String? endTime;\n  ...\n}\n<\/pre><\/div>\n\n\n<p><code>Result<\/code>\u00a0s\u0131n\u0131f\u0131 ise API cevab\u0131n\u0131n ba\u015far\u0131l\u0131 m\u0131 de\u011fil mi oldu\u011funu, mesaj i\u00e7eri\u011fini ve veriyi temsil eder.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: xml; title: ; notranslate\" title=\"\">\nclass Result {\n  bool success;\n  String? message;\n  dynamic data;\n  ...\n}\n<\/pre><\/div>\n\n\n<h4 class=\"wp-block-heading\" id=\"ee4f\">5. Servis Katman\u0131: HTTP ile Veri \u00c7ekmek<\/h4>\n\n\n\n<p id=\"41ee\">Veriyi \u00e7eken servis s\u0131n\u0131f\u0131 \u015f\u00f6yle \u00e7al\u0131\u015f\u0131r:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: xml; title: ; notranslate\" title=\"\">\nclass WorkingHourService {\n  final String url = &quot;https:\/\/...\/working_hours.json&quot;;\n   Future&lt;Result?&gt; getWorkingHours() async {\n    try {\n      final response = await http.get(Uri.parse(url));\n      final data = json.decode(response.body);\n      ...\n    } catch (e) {\n      return Result(success: false, message: e.toString());\n    }\n  }\n}\n<\/pre><\/div>\n\n\n<p id=\"409c\">Burada&nbsp;<code>http.get<\/code>&nbsp;ile JSON verisi \u00e7ekilir,&nbsp;<code>json.decode<\/code>&nbsp;ile Dart map\u2019ine d\u00f6n\u00fc\u015ft\u00fcr\u00fcl\u00fcr ve model s\u0131n\u0131flar\u0131m\u0131za \u00e7evrilerek ekrana aktar\u0131l\u0131r.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"3aa0\">6. Tam Kod<\/h4>\n\n\n\n<p id=\"642b\">Uygulaman\u0131n tam kaynak kodunu&nbsp;<a href=\"https:\/\/github.com\/AhmetAkinYazilim\/ExzamleDatabase\" rel=\"noreferrer noopener\" target=\"_blank\">GitHub sayfamda<\/a>&nbsp;payla\u015ft\u0131m. Dilersen projeni kolayca oradan ba\u015flatabilirsin.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"7a07\">Sonu\u00e7<\/h4>\n\n\n\n<p id=\"4fb3\">Bu yaz\u0131da, Flutter\u2019da uzak bir kaynaktan veri \u00e7ekmenin temel ad\u0131mlar\u0131n\u0131 \u00f6\u011frendik:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>http<\/code>\u00a0paketi kurulumu<\/li>\n\n\n\n<li>JSON verisinin Dart modellerine \u00e7evrilmesi<\/li>\n\n\n\n<li><code>FutureBuilder<\/code>\u00a0ile asenkron veri g\u00f6sterimi<\/li>\n<\/ul>\n\n\n\n<p id=\"63a7\">Bu yap\u0131y\u0131 kullanarak API tabanl\u0131 projelerin temellerini kolayca olu\u015fturabilir, ger\u00e7ek zamanl\u0131 veri g\u00f6sterimleri geli\u015ftirebilirsin.<\/p>\n\n\n\n<p id=\"2906\">\u0130stersen bu yaz\u0131y\u0131 bir blog sitesine uygun \u015fekilde HTML format\u0131na da \u00e7evirebilirim ya da \u00f6rnek proje yap\u0131s\u0131 dosya hiyerar\u015fisiyle birlikte g\u00f6sterebilirim. Devam edelim mi?<a href=\"https:\/\/medium.com\/@ahmet-akn?source=post_page---post_author_info--ed45345157b4---------------------------------------\"><\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Flutter ile bir projede d\u0131\u015f kaynaktan (\u00f6rne\u011fin bir JSON API ya da GitHub\u2019daki bir dosya) veri &hellip; <a title=\"Flutter\u2019da Uzak Sunucudan Kolayca Veri \u00c7ekme ve Listeleme\" class=\"hm-read-more\" href=\"https:\/\/www.webmobdesign.com\/blog\/tr\/flutterda-uzak-sunucudan-kolayca-veri-cekme-ve-listeleme\/\"><span class=\"screen-reader-text\">Flutter\u2019da Uzak Sunucudan Kolayca Veri \u00c7ekme ve Listeleme<\/span>Read more<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6],"tags":[58],"class_list":["post-219","post","type-post","status-publish","format-standard","hentry","category-mobil-tr","tag-flutter-tr"],"_links":{"self":[{"href":"https:\/\/www.webmobdesign.com\/blog\/wp-json\/wp\/v2\/posts\/219","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.webmobdesign.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.webmobdesign.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.webmobdesign.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.webmobdesign.com\/blog\/wp-json\/wp\/v2\/comments?post=219"}],"version-history":[{"count":1,"href":"https:\/\/www.webmobdesign.com\/blog\/wp-json\/wp\/v2\/posts\/219\/revisions"}],"predecessor-version":[{"id":318,"href":"https:\/\/www.webmobdesign.com\/blog\/wp-json\/wp\/v2\/posts\/219\/revisions\/318"}],"wp:attachment":[{"href":"https:\/\/www.webmobdesign.com\/blog\/wp-json\/wp\/v2\/media?parent=219"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.webmobdesign.com\/blog\/wp-json\/wp\/v2\/categories?post=219"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.webmobdesign.com\/blog\/wp-json\/wp\/v2\/tags?post=219"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}