{"id":4351,"date":"2026-09-13T10:06:04","date_gmt":"2026-09-13T01:06:04","guid":{"rendered":"https:\/\/www.7crystalsky.com\/?p=4351"},"modified":"2026-09-13T10:06:05","modified_gmt":"2026-09-13T01:06:05","slug":"78%e6%ad%b3%e3%81%8b%e3%82%89%e3%81%ae%e6%8c%91%e6%88%a6%ef%bc%81flutter%e3%81%a7%e4%bd%9c%e3%82%8b%e3%80%8c%e8%a5%bf%e5%9b%bd%e4%b8%89%e5%8d%81%e4%b8%89%e6%89%80%e5%b7%a1%e7%a4%bc%e3%82%a2%e3%83%97","status":"publish","type":"post","link":"https:\/\/www.7crystalsky.com\/?p=4351","title":{"rendered":"78\u6b73\u304b\u3089\u306e\u6311\u6226\uff01Flutter\u3067\u4f5c\u308b\u300c\u897f\u56fd\u4e09\u5341\u4e09\u6240\u5de1\u793c\u30a2\u30d7\u30ea\u300d\u958b\u767a\u304b\u3089\u30b9\u30c8\u30a2\u516c\u958b\u307e\u3067\u306e\u5168\u8a18\u9332"},"content":{"rendered":"\n<p><\/p>\n\n\n\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_82_2 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Table of Contents<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/www.7crystalsky.com\/?p=4351\/#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB\" >\u306f\u3058\u3081\u306b<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/www.7crystalsky.com\/?p=4351\/#%E7%AC%AC0%E7%AB%A0%EF%BC%9A%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%AE%E5%A3%81%E3%82%92%E4%B8%8B%E3%81%92%E3%82%8B%EF%BC%88%E5%85%A5%E9%96%80%E7%B7%A8%EF%BC%89%E3%80%9C%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%81%A7%E5%8B%95%E3%81%8F%E8%B6%85%E7%B0%A1%E6%98%93%E7%89%88%E3%82%A2%E3%83%97%E3%83%AA%E3%80%9C\" >\u7b2c0\u7ae0\uff1a\u30d7\u30ed\u30b0\u30e9\u30df\u30f3\u30b0\u306e\u58c1\u3092\u4e0b\u3052\u308b\uff08\u5165\u9580\u7de8\uff09\u301c\u30d6\u30e9\u30a6\u30b6\u3067\u52d5\u304f\u8d85\u7c21\u6613\u7248\u30a2\u30d7\u30ea\u301c<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/www.7crystalsky.com\/?p=4351\/#%E7%AC%AC1%E7%AB%A0%EF%BC%9A%E3%81%84%E3%81%96Flutter%E3%81%AE%E4%B8%96%E7%95%8C%E3%81%B8%EF%BC%81%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89%E3%81%A8%E5%9F%BA%E6%9C%AC%E8%A8%AD%E8%A8%88\" >\u7b2c1\u7ae0\uff1a\u3044\u3056Flutter\u306e\u4e16\u754c\u3078\uff01\u74b0\u5883\u69cb\u7bc9\u3068\u57fa\u672c\u8a2d\u8a08<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/www.7crystalsky.com\/?p=4351\/#%E7%AC%AC2%E7%AB%A0%EF%BC%9A%E5%9C%B0%E5%9B%B3%E3%81%A8%E3%82%AB%E3%83%A1%E3%83%A9%E3%81%AE%E7%B5%B1%E5%90%88%EF%BC%88%E5%AF%A9%E6%9F%BB%E5%AF%BE%E7%AD%96%E3%81%AE%E6%A5%B5%E6%84%8F%EF%BC%89\" >\u7b2c2\u7ae0\uff1a\u5730\u56f3\u3068\u30ab\u30e1\u30e9\u306e\u7d71\u5408\uff08\u5be9\u67fb\u5bfe\u7b56\u306e\u6975\u610f\uff09<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/www.7crystalsky.com\/?p=4351\/#%E7%AC%AC3%E7%AB%A0%EF%BC%9A%E5%AE%8C%E5%85%A8%E7%89%88%E3%83%95%E3%83%AB%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89%E4%B8%80%E5%BC%8F\" >\u7b2c3\u7ae0\uff1a\u5b8c\u5168\u7248\u30d5\u30eb\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9\u4e00\u5f0f<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/www.7crystalsky.com\/?p=4351\/#%E7%AC%AC4%E7%AB%A0%EF%BC%9A%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92%E6%88%90%E9%95%B7%E3%81%95%E3%81%9B%E3%82%8B%EF%BC%81%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA%E5%8C%96%E3%81%B8%E3%81%AE%E9%81%93%EF%BC%88%E5%BF%9C%E7%94%A8%E7%B7%A8%EF%BC%89\" >\u7b2c4\u7ae0\uff1a\u30a2\u30d7\u30ea\u3092\u6210\u9577\u3055\u305b\u308b\uff01\u30b7\u30ea\u30fc\u30ba\u5316\u3078\u306e\u9053\uff08\u5fdc\u7528\u7de8\uff09<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/www.7crystalsky.com\/?p=4351\/#%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB%EF%BC%9A78%E6%AD%B3%E3%81%8B%E3%82%89%E3%81%AE%E6%8C%91%E6%88%A6%E3%82%92%E6%8C%AF%E3%82%8A%E8%BF%94%E3%81%A3%E3%81%A6\" >\u304a\u308f\u308a\u306b\uff1a78\u6b73\u304b\u3089\u306e\u6311\u6226\u3092\u632f\u308a\u8fd4\u3063\u3066<\/a><\/li><\/ul><\/nav><\/div>\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB\"><\/span><strong>\u306f\u3058\u3081\u306b<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>\u672c\u7a3f\u306f\u300178\u6b73\u3068\u3044\u3046\u5e74\u9f62\u3067\u30bc\u30ed\u304b\u3089\u30a2\u30d7\u30ea\u958b\u767a\u306b\u6311\u6226\u3057\u3001App Store\u304a\u3088\u3073Google Play Store\u306b\u3066\u300c\u897f\u56fd\u4e09\u5341\u4e09\u6240\u5de1\u793c\u30a2\u30d7\u30ea\u300d\u3092\u30ea\u30ea\u30fc\u30b9\u3057\u305f\u5b9f\u8df5\u7684\u306a\u8a18\u9332\u3067\u3059\u3002\u300c\u30b9\u30de\u30db\u3068\u30d1\u30bd\u30b3\u30f3\u3092\u697d\u3057\u3080\u4f1a\u300d\u3067\u306e\u6d3b\u52d5\u3092\u901a\u3058\u3001\u540c\u4e16\u4ee3\u306e\u4ef2\u9593\u305f\u3061\u304c\u300c\u81ea\u5206\u3060\u3051\u306e\u5de1\u793c\u306e\u8a18\u9332\u3092\u624b\u8efd\u306b\u6b8b\u3057\u305f\u3044\u300d\u3068\u8a71\u3057\u3066\u3044\u305f\u3053\u3068\u304c\u958b\u767a\u306e\u304d\u3063\u304b\u3051\u3067\u3057\u305f\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E7%AC%AC0%E7%AB%A0%EF%BC%9A%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%AE%E5%A3%81%E3%82%92%E4%B8%8B%E3%81%92%E3%82%8B%EF%BC%88%E5%85%A5%E9%96%80%E7%B7%A8%EF%BC%89%E3%80%9C%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%81%A7%E5%8B%95%E3%81%8F%E8%B6%85%E7%B0%A1%E6%98%93%E7%89%88%E3%82%A2%E3%83%97%E3%83%AA%E3%80%9C\"><\/span><strong>\u7b2c0\u7ae0\uff1a\u30d7\u30ed\u30b0\u30e9\u30df\u30f3\u30b0\u306e\u58c1\u3092\u4e0b\u3052\u308b\uff08\u5165\u9580\u7de8\uff09\u301c\u30d6\u30e9\u30a6\u30b6\u3067\u52d5\u304f\u8d85\u7c21\u6613\u7248\u30a2\u30d7\u30ea\u301c<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>\u300c\u30a2\u30d7\u30ea\u958b\u767a\u300d\u3068\u805e\u304f\u3068\u3001\u96e3\u3057\u3044\u5c02\u7528\u30bd\u30d5\u30c8\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u3066\u6697\u53f7\u306e\u3088\u3046\u306a\u6587\u5b57\u3092\u6253\u3061\u8fbc\u3080\u2026\u2026\u305d\u3093\u306a\u30a4\u30e1\u30fc\u30b8\u3092\u6301\u305f\u308c\u308b\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3002\u305d\u3053\u3067\u672c\u7ae0\u3067\u306f\u3001\u672c\u683c\u7684\u306a\u4e16\u754c\u3078\u98db\u3073\u8fbc\u3080\u524d\u306e\u300c\u6e96\u5099\u904b\u52d5\u300d\u3068\u3057\u3066\u3001\u30d1\u30bd\u30b3\u30f3\u306e\u300c\u30e1\u30e2\u5e33\u300d\u3068\u300c\u30d6\u30e9\u30a6\u30b6\u300d\u3060\u3051\u3067\u52d5\u304f\u8d85\u7c21\u6613\u7248\u30fb\u5de1\u793c\u30a2\u30d7\u30ea\u3092\u4f5c\u3063\u3066\u307f\u307e\u3057\u3087\u3046\u3002<\/p>\n\n\n\n<p><strong>1. <\/strong><strong>\u30e1\u30e2\u5e33\u306b\u30b3\u30fc\u30c9\u3092\u66f8\u304f<\/strong><\/p>\n\n\n\n<p>Web\u30b5\u30a4\u30c8\u3092\u4f5c\u308b\u305f\u3081\u306e\u6a19\u6e96\u6280\u8853\u3067\u3042\u308bJavaScript\uff08HTML\/CSS\/JS\uff09\u3092\u4f7f\u3044\u307e\u3059\u3002\u4ee5\u4e0b\u306e\u30b3\u30fc\u30c9\u3092\u30b3\u30d4\u30fc\u3057\u3001\u30e1\u30e2\u5e33\u306b\u8cbc\u308a\u4ed8\u3051\u3066 saigoku_mini.html \u3068\u3057\u3066\u4fdd\u5b58\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n\n\n\n<p>HTML<\/p>\n\n\n\n<p>&lt;!DOCTYPE html&gt;<\/p>\n\n\n\n<p>&lt;html lang=&#8221;ja&#8221;&gt;<\/p>\n\n\n\n<p>&lt;head&gt;<\/p>\n\n\n\n<p>&lt;meta charset=&#8221;UTF-8&#8243;&gt;<\/p>\n\n\n\n<p>&lt;meta name=&#8221;viewport&#8221; content=&#8221;width=device-width, initial-scale=1.0&#8243;&gt;<\/p>\n\n\n\n<p>&lt;title&gt;\u304b\u3093\u305f\u3093\u5de1\u793c\u30a2\u30d7\u30ea&lt;\/title&gt;<\/p>\n\n\n\n<p>&lt;style&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; body { font-family: sans-serif; background-color: #f5f5f5; margin: 0; padding: 20px; }<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; h1 { color: #333; text-align: center; }<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; ul { list-style: none; padding: 0; }<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; li { background: white; margin-bottom: 10px; padding: 15px; border-radius: 8px; box-shadow: 0 2px 4px rgba(0,0,0,0.1); display: flex; justify-content: space-between; align-items: center; }<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; .temple-name { font-size: 1.2em; font-weight: bold; }<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; .btn-map { background: #4285f4; color: white; padding: 8px 12px; text-decoration: none; border-radius: 4px; font-size: 0.9em; }<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; .check-area { display: flex; align-items: center; gap: 10px; }<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; input[type=&#8221;checkbox&#8221;] { transform: scale(1.5); }<\/p>\n\n\n\n<p>&lt;\/style&gt;<\/p>\n\n\n\n<p>&lt;\/head&gt;<\/p>\n\n\n\n<p>&lt;body&gt;<\/p>\n\n\n\n<p>&lt;h1&gt;\u897f\u56fd\u5de1\u793c\uff08\u304a\u8a66\u3057\u7248\uff09&lt;\/h1&gt;<\/p>\n\n\n\n<p>&lt;ul id=&#8221;temple-list&#8221;&gt;&lt;\/ul&gt;<\/p>\n\n\n\n<p>&lt;script&gt;<\/p>\n\n\n\n<p>\/\/ \u304a\u5bfa\u306e\u30c7\u30fc\u30bf\uff08\u307e\u305a\u306f3\u3064\u3060\u3051\uff09<\/p>\n\n\n\n<p>const temples = [<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; { id: 1, name: &#8220;\u7b2c1\u756a \u9752\u5cb8\u6e21\u5bfa&#8221;, keyword: &#8220;\u9752\u5cb8\u6e21\u5bfa&#8221; },<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; { id: 2, name: &#8220;\u7b2c2\u756a \u7d00\u4e09\u4e95\u5bfa&#8221;, keyword: &#8220;\u7d00\u4e09\u4e95\u5bfa&#8221; },<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; { id: 3, name: &#8220;\u7b2c3\u756a \u7c89\u6cb3\u5bfa&#8221;, keyword: &#8220;\u7c89\u6cb3\u5bfa&#8221; }<\/p>\n\n\n\n<p>];<\/p>\n\n\n\n<p>const listElement = document.getElementById(&#8216;temple-list&#8217;);<\/p>\n\n\n\n<p>\/\/ \u753b\u9762\u306b\u30ea\u30b9\u30c8\u3092\u81ea\u52d5\u3067\u4f5c\u308b\u9b54\u6cd5<\/p>\n\n\n\n<p>temples.forEach(temple =&gt; {<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; \/\/ \u904e\u53bb\u306e\u30c1\u30a7\u30c3\u30af\u72b6\u614b\u3092\u601d\u3044\u51fa\u3059<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; const isChecked = localStorage.getItem(&#8216;temple_&#8217; + temple.id) === &#8216;true&#8217; ? &#8216;checked&#8217; : &#8221;;<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; const li = document.createElement(&#8216;li&#8217;);<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; li.innerHTML = `<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;div class=&#8221;check-area&#8221;&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type=&#8221;checkbox&#8221; id=&#8221;check_${temple.id}&#8221; ${isChecked} onchange=&#8221;saveCheck(${temple.id}, this.checked)&#8221;&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;span class=&#8221;temple-name&#8221;&gt;${temple.name}&lt;\/span&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;\/div&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!&#8211; \u5730\u56f3\u3092\u958b\u304f\u30dc\u30bf\u30f3 &#8211;&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;a href=&#8221;https:\/\/www.google.com\/maps\/search\/?api=1&amp;query=${temple.keyword}&#8221; target=&#8221;_blank&#8221; class=&#8221;btn-map&#8221;&gt;\u5730\u56f3&lt;\/a&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; `;<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; listElement.appendChild(li);<\/p>\n\n\n\n<p>});<\/p>\n\n\n\n<p>\/\/ \u30c1\u30a7\u30c3\u30af\u3057\u305f\u72b6\u614b\u3092\u30bb\u30fc\u30d6\u3059\u308b\u9b54\u6cd5<\/p>\n\n\n\n<p>function saveCheck(id, isChecked) {<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; localStorage.setItem(&#8216;temple_&#8217; + id, isChecked);<\/p>\n\n\n\n<p>}<\/p>\n\n\n\n<p>&lt;\/script&gt;<\/p>\n\n\n\n<p>&lt;\/body&gt;<\/p>\n\n\n\n<p>&lt;\/html&gt;<\/p>\n\n\n\n<p><strong>2. <\/strong><strong>\u30a2\u30d7\u30ea\u307f\u305f\u3044\u306a\u300c3\u3064\u306e\u3072\u307f\u3064\u300d<\/strong><\/p>\n\n\n\n<p>\u305f\u3063\u305f\u6570\u5341\u884c\u306e\u30b3\u30fc\u30c9\u3067\u3059\u304c\u3001\u3053\u3053\u306b\u306f\u5de1\u793c\u30a2\u30d7\u30ea\u306b\u5fc5\u8981\u306a\u30a8\u30c3\u30bb\u30f3\u30b9\u304c\u8a70\u307e\u3063\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u81ea\u52d5\u3067\u4e26\u3079\u308b\u300c\u30eb\u30fc\u30d7\u300d\uff1a\u304a\u5bfa\u306e\u6570\u3060\u3051\u540c\u3058\u5f62\u306e\u30ea\u30b9\u30c8\u3092\u81ea\u52d5\u3067\u4f5c\u308a\u307e\u3059\uff08Flutter\u306e ListView.builder \u3068\u540c\u3058\u8003\u3048\u65b9\u3067\u3059\uff09\u3002<\/li>\n\n\n\n<li>\u5730\u56f3\u9023\u52d5\uff1a\u30dc\u30bf\u30f3\u306b [https:\/\/www.google.com\/maps\/search\/?api=1&amp;query=\u5bfa\u306e\u540d\u524d](https:\/\/www.google.com\/maps\/search\/?api=1&amp;query=\u5bfa\u306e\u540d\u524d) \u3068\u3044\u3046Google\u30de\u30c3\u30d7\u5c02\u7528\u306eURL\u3092\u8cbc\u308b\u3060\u3051\u3067\u3001API\u30ad\u30fc\u306e\u767b\u9332\u306a\u3057\u3067\u73fe\u5730\u306e\u5730\u56f3\u3092\u958b\u304f\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/li>\n\n\n\n<li>\u30bb\u30fc\u30d6\u6a5f\u80fd\uff1a\u30d6\u30e9\u30a6\u30b6\u306e\u4e2d\u306b\u3042\u308b\u5c0f\u3055\u306a\u5f15\u304d\u51fa\u3057\uff08localStorage\uff09\u3092\u4f7f\u3063\u3066\u3001\u30c1\u30a7\u30c3\u30af\u3092\u8a18\u9332\u3057\u307e\u3059\u3002<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E7%AC%AC1%E7%AB%A0%EF%BC%9A%E3%81%84%E3%81%96Flutter%E3%81%AE%E4%B8%96%E7%95%8C%E3%81%B8%EF%BC%81%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89%E3%81%A8%E5%9F%BA%E6%9C%AC%E8%A8%AD%E8%A8%88\"><\/span><strong>\u7b2c1\u7ae0\uff1a\u3044\u3056Flutter\u306e\u4e16\u754c\u3078\uff01\u74b0\u5883\u69cb\u7bc9\u3068\u57fa\u672c\u8a2d\u8a08<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>\u30d6\u30e9\u30a6\u30b6\u7248\u306e\u9650\u754c\uff08\u30aa\u30d5\u30e9\u30a4\u30f3\u3067\u4f7f\u3048\u306a\u3044\u3001\u30a2\u30a4\u30b3\u30f3\u304c\u7f6e\u3051\u306a\u3044\u7b49\uff09\u3092\u8d8a\u3048\u308b\u305f\u3081\u3001Google\u304c\u4f5c\u3063\u305f\u300cFlutter\u300d\u3092\u4f7f\u3044\u307e\u3059\u3002\u4e00\u3064\u306e\u30b3\u30fc\u30c9\u3067iPhone\u7528\u3068Android\u7528\u306e\u4e21\u65b9\u304c\u4f5c\u308c\u308b\u5f37\u529b\u306a\u6b66\u5668\u3067\u3059\u3002<\/p>\n\n\n\n<p><strong>1. <\/strong><strong>\u5fc5\u8981\u306a\u30d1\u30c3\u30b1\u30fc\u30b8\u306e\u6e96\u5099<\/strong><\/p>\n\n\n\n<p>\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u8a2d\u8a08\u56f3\u3067\u3042\u308b pubspec.yaml \u306b\u3001\u30a2\u30d7\u30ea\u306b\u5fc5\u8981\u306a\u9053\u5177\uff08\u30d1\u30c3\u30b1\u30fc\u30b8\uff09\u3092\u3059\u3079\u3066\u66f8\u304d\u8fbc\u307f\u307e\u3059\u3002<\/p>\n\n\n\n<p>YAML<\/p>\n\n\n\n<p>dependencies:<\/p>\n\n\n\n<p>&nbsp; flutter:<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; sdk: flutter<\/p>\n\n\n\n<p>&nbsp; shared_preferences: ^2.2.3&nbsp; # \u8a2a\u554f\u6e08\u307f\u30c1\u30a7\u30c3\u30af\u306e\u4fdd\u5b58\u7528<\/p>\n\n\n\n<p>&nbsp; image_picker: ^1.1.2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # \u30ab\u30e1\u30e9\u8d77\u52d5\u7528<\/p>\n\n\n\n<p>&nbsp; path_provider: ^2.1.3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # \u5199\u771f\u306e\u4fdd\u5b58\u5148\u53d6\u5f97\u7528<\/p>\n\n\n\n<p>&nbsp; google_maps_flutter: ^2.5.3 # Google Map\u8868\u793a\u7528<\/p>\n\n\n\n<p>&nbsp; geolocator: ^11.0.0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # \u73fe\u5728\u5730\u3068\u8ddd\u96e2\u8a08\u7b97\u7528<\/p>\n\n\n\n<p>&nbsp; path: ^1.9.0<\/p>\n\n\n\n<p>&nbsp; google_mobile_ads: ^5.1.0&nbsp;&nbsp; # \u5e83\u544a\u8868\u793a\u7528<\/p>\n\n\n\n<p><strong>2. <\/strong><strong>\u30ab\u30c3\u30b3\u306e\u8ff7\u5bae\u3092\u629c\u3051\u308b3\u3064\u306e\u6b66\u5668<\/strong><\/p>\n\n\n\n<p>Flutter\u306e\u30b3\u30fc\u30c9\u306f { } \u3084 ( ) \u304c\u5e7e\u91cd\u306b\u3082\u5165\u308c\u5b50\u306b\u306a\u308b\u305f\u3081\u3001\u6700\u521d\u306f\u6238\u60d1\u3046\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3002\u79c1\u306f\u4ee5\u4e0b\u306e3\u3064\u306e\u65b9\u6cd5\u3067\u3053\u308c\u3092\u514b\u670d\u3057\u307e\u3057\u305f\u3002<\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li><strong>\u300c\u672b\u5c3e\u306e\u30ab\u30f3\u30de\uff08,\uff09\u300d\u3092\u6253\u3064\u7656\u3092\u3064\u3051\u308b<\/strong>: \u9589\u3058\u30ab\u30c3\u30b3\u306e\u76f4\u524d\u306b , \u3092\u5165\u308c\u3066\u4fdd\u5b58\uff08\u81ea\u52d5\u6574\u5f62\uff09\u3059\u308b\u3068\u3001\u30b3\u30fc\u30c9\u304c\u7e26\u306b\u304d\u308c\u3044\u306b\u4e26\u3073\u307e\u3059\u3002\u3053\u308c\u304c\u6700\u5927\u306e\u79d8\u8a23\u3067\u3059\u3002<\/li>\n\n\n\n<li><strong>\u30ac\u30a4\u30c9\u30e9\u30a4\u30f3\u3092\u898b\u308b<\/strong>: \u30a8\u30c7\u30a3\u30bf\u306e\u7e26\u7dda\u3092\u898b\u3066\u3001\u3069\u306e\u30ab\u30c3\u30b3\u304c\u5bfe\u5fdc\u3057\u3066\u3044\u308b\u304b\u8996\u899a\u7684\u306b\u628a\u63e1\u3057\u307e\u3059\u3002<\/li>\n\n\n\n<li><strong>\u30b3\u30e1\u30f3\u30c8\u3092\u6a5f\u68b0\u306b\u66f8\u304b\u305b\u308b<\/strong>: Flutter\u306e\u8a2d\u5b9a\u3092\u6709\u52b9\u306b\u3057\u3001\/\/ Column \u306e\u3088\u3046\u306a\u9589\u3058\u30ab\u30c3\u30b3\u306e\u6ce8\u91c8\u3092\u81ea\u52d5\u8868\u793a\u3055\u305b\u307e\u3059\u3002<\/li>\n<\/ol>\n\n\n\n<p><strong>3. <\/strong><strong>\u304a\u5bfa\u306e\u30c7\u30fc\u30bf\u3092\u4f5c\u308b\u300c\u30af\u30e9\u30b9\u300d<\/strong><\/p>\n\n\n\n<p>\u5358\u306a\u308b\u6587\u5b57\u3067\u306f\u306a\u304f\u3001\u300c\u756a\u53f7\u306f\u6570\u5b57\uff08int\uff09\u300d\u300c\u7def\u5ea6\u7d4c\u5ea6\u306f\u5c0f\u6570\uff08double\uff09\u300d\u3068\u53b3\u5bc6\u306a\u30eb\u30fc\u30eb\uff08\u8a2d\u8a08\u56f3\uff09\u3092\u5b9a\u3081\u307e\u3059\u3002\u3053\u306e\u3088\u3046\u306b\u30c7\u30fc\u30bf\u3092\u4e00\u3064\u306e\u584a\u306b\u3059\u308b\u3053\u3068\u3067\u3001\u5f8c\u306e\u30ea\u30b9\u30c8\u8868\u793a\u3084\u5730\u56f3\u9023\u52d5\u304c\u683c\u6bb5\u306b\u4f5c\u308a\u3084\u3059\u304f\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<p>Dart<\/p>\n\n\n\n<p>class Temple {<\/p>\n\n\n\n<p>&nbsp; final int number;<\/p>\n\n\n\n<p>&nbsp; final String name;<\/p>\n\n\n\n<p>&nbsp; final String address;<\/p>\n\n\n\n<p>&nbsp; final String description;<\/p>\n\n\n\n<p>&nbsp; final double lat;<\/p>\n\n\n\n<p>&nbsp; final double lng;<\/p>\n\n\n\n<p>&nbsp; Temple({<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; required this.number,<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; required this.name,<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; required this.address,<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; required this.description,<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; required this.lat,<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; required this.lng,<\/p>\n\n\n\n<p>&nbsp; });<\/p>\n\n\n\n<p>}<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E7%AC%AC2%E7%AB%A0%EF%BC%9A%E5%9C%B0%E5%9B%B3%E3%81%A8%E3%82%AB%E3%83%A1%E3%83%A9%E3%81%AE%E7%B5%B1%E5%90%88%EF%BC%88%E5%AF%A9%E6%9F%BB%E5%AF%BE%E7%AD%96%E3%81%AE%E6%A5%B5%E6%84%8F%EF%BC%89\"><\/span><strong>\u7b2c2\u7ae0\uff1a\u5730\u56f3\u3068\u30ab\u30e1\u30e9\u306e\u7d71\u5408\uff08\u5be9\u67fb\u5bfe\u7b56\u306e\u6975\u610f\uff09<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>\u5de1\u793c\u30a2\u30d7\u30ea\u306e\u6838\u3068\u306a\u308b\u300c\u5730\u56f3\u9023\u643a\u300d\u3068\u300c\u30ab\u30e1\u30e9\u6a5f\u80fd\u300d\u306e\u5b9f\u88c5\u3067\u3059\u3002\u3053\u3053\u3067\u306f\u5404\u30d1\u30fc\u30c4\u304c\u300c\u3069\u3093\u306a\u4ed5\u4e8b\u3092\u3057\u3066\u3044\u308b\u306e\u304b\u300d\u3092\u89e3\u5256\u3057\u3066\u307f\u307e\u3057\u3087\u3046\u3002<\/p>\n\n\n\n<p><strong>\ud83d\udca1<\/strong><strong> <\/strong><strong>\u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u89e3\u5256\u2460\uff1a\u73fe\u5728\u5730\u304b\u3089\u304a\u5bfa\u307e\u3067\u306e\u8ddd\u96e2\u3092\u8a08\u7b97\u3059\u308b<\/strong><\/p>\n\n\n\n<p>\u5de1\u793c\u4e2d\u306b\u300c\u6b21\u306e\u304a\u5bfa\u307e\u3067\u3042\u3068\u4f55\u30ad\u30ed\u3060\u308d\u3046\uff1f\u300d\u3068\u78ba\u8a8d\u3067\u304d\u308b\u30ca\u30d3\u30b2\u30fc\u30b7\u30e7\u30f3\u6a5f\u80fd\u3067\u3059\u3002<\/p>\n\n\n\n<p>Dart<\/p>\n\n\n\n<p>double? dist;<\/p>\n\n\n\n<p>if (_pos != null) {<\/p>\n\n\n\n<p>&nbsp; dist = Geolocator.distanceBetween(<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _pos!.latitude, _pos!.longitude,<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.lat, t.lng) \/ 1000;<\/p>\n\n\n\n<p>}<\/p>\n\n\n\n<p>Geolocator.distanceBetween \u306b\u73fe\u5728\u5730\u3068\u304a\u5bfa\u306e\u7def\u5ea6\u30fb\u7d4c\u5ea6\u3092\u6e21\u3059\u3060\u3051\u3067\u30012\u70b9\u9593\u306e\u76f4\u7dda\u8ddd\u96e2\u3092\u81ea\u52d5\u3067\u7b97\u51fa\u3057\u3066\u304f\u308c\u307e\u3059\u3002\u8a08\u7b97\u7d50\u679c\u306f\u300c\u30e1\u30fc\u30c8\u30eb\u300d\u3067\u8fd4\u3063\u3066\u304f\u308b\u305f\u3081\u30011000\u3067\u5272\u308b\u3053\u3068\u3067\u300c\u30ad\u30ed\u30e1\u30fc\u30c8\u30eb\u300d\u306b\u76f4\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<p><strong>\ud83d\udca1<\/strong><strong> <\/strong><strong>\u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u89e3\u5256\u2461\uff1a\u5730\u56f3\u306b\u30d4\u30f3\u3092\u7acb\u3066\u308b<\/strong><\/p>\n\n\n\n<p>Google\u30de\u30c3\u30d7\u4e0a\u306b\u672d\u6240\u3092\u8868\u793a\u3057\u3001\u300c\u8a2a\u554f\u6e08\u307f\u300d\u306a\u3089\u8272\u3092\u5909\u3048\u308b\u5de5\u592b\u3067\u3059\u3002<\/p>\n\n\n\n<p>Dart<\/p>\n\n\n\n<p>markers: shikokuTemples.map((t) {<\/p>\n\n\n\n<p>&nbsp; final isV = visitedIds.contains(t.number.toString());<\/p>\n\n\n\n<p>&nbsp; return Marker(<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; markerId: MarkerId(t.number.toString()),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; position: LatLng(t.lat, t.lng),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; icon: BitmapDescriptor.defaultMarkerWithHue(<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; isV ? BitmapDescriptor.hueGreen : BitmapDescriptor.hueRed,<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; ),<\/p>\n\n\n\n<p>&nbsp; );<\/p>\n\n\n\n<p>}).toSet(),<\/p>\n\n\n\n<p>isV ? &#8230;hueGreen : &#8230;hueRed \u306f\u3001\u8a2a\u554f\u6e08\u307f\u306a\u3089\u7dd1\u8272\u306e\u30d4\u30f3\u3092\u3001\u307e\u3060\u306a\u3089\u8d64\u8272\u306e\u30d4\u30f3\u3092\u8868\u793a\u3059\u308b\u3068\u3044\u3046\u6761\u4ef6\u5206\u5c90\u3067\u3059\u3002<\/p>\n\n\n\n<p><strong>\ud83d\udea8<\/strong><strong> <\/strong><strong>\u6fc0\u95d8\uff01Apple\u5be9\u67fb\u306e\u30ea\u30b8\u30a7\u30af\u30c8\u5bfe\u7b56<\/strong><\/p>\n\n\n\n<p>Apple\u306e\u53b3\u683c\u306a\u5be9\u67fb\u306b\u76f4\u9762\u3057\u3001\u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u5927\u5e45\u306a\u898b\u76f4\u3057\u3092\u8feb\u3089\u308c\u307e\u3057\u305f\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u5bfe\u7b56\u2460\uff1aiPad\u30b7\u30df\u30e5\u30ec\u30fc\u30bf\u306e\u7f60<\/strong> \u5be9\u67fb\u5b98\u306f\u30ab\u30e1\u30e9\u306e\u306a\u3044\u300ciPad\u30b7\u30df\u30e5\u30ec\u30fc\u30bf\u300d\u3092\u4f7f\u3046\u3053\u3068\u304c\u3042\u308a\u307e\u3059\u3002\u3044\u304d\u306a\u308a\u30ab\u30e1\u30e9\u3092\u8d77\u52d5\u3059\u308b\u3068\u30a2\u30d7\u30ea\u304c\u30af\u30e9\u30c3\u30b7\u30e5\u3057\u305f\u3068\u5224\u5b9a\u3055\u308c\u3066\u3057\u307e\u3046\u305f\u3081\u3001showModalBottomSheet \u3092\u4f7f\u3063\u3066\u300c\u30ab\u30e1\u30e9\u3067\u64ae\u5f71\u300d\u304b\u300c\u5199\u771f\u30e9\u30a4\u30d6\u30e9\u30ea\u304b\u3089\u9078\u629e\u300d\u304b\u3092\u9078\u3079\u308b\u30c0\u30a4\u30a2\u30ed\u30b0\u3092\u30ef\u30f3\u30af\u30c3\u30b7\u30e7\u30f3\u631f\u3080\u3053\u3068\u3067\u89e3\u6c7a\u3057\u307e\u3057\u305f\u3002<\/li>\n\n\n\n<li><strong>\u5bfe\u7b56\u2461\uff1a\u30bf\u30c3\u30d7\u629c\u3051\uff08\u53cd\u5fdc\u3057\u306a\u3044\uff09\u3092\u9632\u3050\u9b54\u6cd5<\/strong> \u5927\u304d\u306a\u5199\u771f\u67a0\u3092\u5be9\u67fb\u5b98\u304c\u30bf\u30c3\u30d7\u3057\u3066\u3082\u53cd\u5fdc\u3057\u306a\u3044\u3068\u6307\u6458\u3055\u308c\u307e\u3057\u305f\u3002\u305d\u3053\u3067\u3001\u900f\u660e\u306a\u90e8\u5206\u3067\u3082\u78ba\u5b9f\u306b\u30bf\u30c3\u30d7\u3092\u691c\u77e5\u3059\u308b HitTestBehavior.opaque \u3092 GestureDetector \u306b\u8ffd\u52a0\u3057\u307e\u3057\u305f\u3002<\/li>\n\n\n\n<li><strong>\u5bfe\u7b56\u2462\uff1a\u30dc\u30bf\u30f3\u304c\u96a0\u308c\u306a\u3044\u305f\u3081\u306e\u900f\u660e\u306a\u30af\u30c3\u30b7\u30e7\u30f3<\/strong> \u7279\u5b9a\u306e\u30b9\u30de\u30db\u3067\u4e00\u756a\u4e0b\u307e\u3067\u30b9\u30af\u30ed\u30fc\u30eb\u3057\u305f\u969b\u3001\u30dc\u30bf\u30f3\u304c\u30ca\u30d3\u30b2\u30fc\u30b7\u30e7\u30f3\u30d0\u30fc\u306b\u96a0\u308c\u3066\u3057\u307e\u3046\u554f\u984c\u304c\u3042\u308a\u307e\u3057\u305f\u3002\u305d\u3053\u3067\u30b3\u30fc\u30c9\u306e\u6700\u5f8c\u306b const SizedBox(height: 60) \u3068\u3044\u3046\u900f\u660e\u306a\u4f59\u767d\u3092\u5165\u308c\u308b\u3053\u3068\u3067\u30ec\u30a4\u30a2\u30a6\u30c8\u5d29\u308c\u3092\u9632\u304e\u307e\u3057\u305f\u3002<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E7%AC%AC3%E7%AB%A0%EF%BC%9A%E5%AE%8C%E5%85%A8%E7%89%88%E3%83%95%E3%83%AB%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89%E4%B8%80%E5%BC%8F\"><\/span><strong>\u7b2c3\u7ae0\uff1a\u5b8c\u5168\u7248\u30d5\u30eb\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9\u4e00\u5f0f<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>\u3053\u308c\u307e\u3067\u306e\u89e3\u8aac\u3092\u8e0f\u307e\u3048\u305f\u3001\u30a2\u30d7\u30ea\u306e\u3059\u3079\u3066\u306e\u6a5f\u80fd\u304c\u96c6\u7d04\u3055\u308c\u305f\u5b8c\u5168\u7248\u306e\u30b3\u30fc\u30c9\u3067\u3059\u3002\u3053\u308c\u3092\u30b3\u30d4\u30fc\u3057\u3066\u4f7f\u3048\u3070\u3001\u305d\u306e\u307e\u307e\u52d5\u304f\u30a2\u30d7\u30ea\u304c\u5b8c\u6210\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p><strong>\ud83d\udcbb<\/strong><strong> main.dart <\/strong><strong>\uff08\u7d71\u5408\u30d5\u30eb\u30bd\u30fc\u30b9\uff09<\/strong><\/p>\n\n\n\n<p>\uff08\u203b\u672c\u7a3f\u3067\u306f\u300c\u56db\u56fd\u516b\u5341\u516b\u30f6\u6240\u4ed5\u69d8\u300d\u306e\u30b3\u30fc\u30c9\u3092\u63b2\u8f09\u3057\u3066\u3044\u307e\u3059\uff09<\/p>\n\n\n\n<p>Dart<\/p>\n\n\n\n<p>import &#8216;dart:io&#8217;;<\/p>\n\n\n\n<p>import &#8216;dart:async&#8217;;<\/p>\n\n\n\n<p>import &#8216;package:flutter\/material.dart&#8217;;<\/p>\n\n\n\n<p>import &#8216;package:shared_preferences\/shared_preferences.dart&#8217;;<\/p>\n\n\n\n<p>import &#8216;package:image_picker\/image_picker.dart&#8217;;<\/p>\n\n\n\n<p>import &#8216;package:path_provider\/path_provider.dart&#8217;;<\/p>\n\n\n\n<p>import &#8216;package:google_maps_flutter\/google_maps_flutter.dart&#8217;;<\/p>\n\n\n\n<p>import &#8216;package:geolocator\/geolocator.dart&#8217;;<\/p>\n\n\n\n<p>import &#8216;package:path\/path.dart&#8217; as p;<\/p>\n\n\n\n<p>import &#8216;package:google_mobile_ads\/google_mobile_ads.dart&#8217;;<\/p>\n\n\n\n<p>void main() {<\/p>\n\n\n\n<p>&nbsp; WidgetsFlutterBinding.ensureInitialized();<\/p>\n\n\n\n<p>&nbsp; MobileAds.instance.initialize();<\/p>\n\n\n\n<p>&nbsp; runApp(const ShikokuApp());<\/p>\n\n\n\n<p>}<\/p>\n\n\n\n<p>class ShikokuApp extends StatelessWidget {<\/p>\n\n\n\n<p>&nbsp; const ShikokuApp({super.key});<\/p>\n\n\n\n<p>&nbsp; @override<\/p>\n\n\n\n<p>&nbsp; Widget build(BuildContext context) {<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; return MaterialApp(<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; title: &#8216;\u56db\u56fd\u5de1\u793c88\u30f6\u6240\u30ca\u30d3&#8217;,<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; debugShowCheckedModeBanner: false,<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; theme: ThemeData(<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; colorScheme: ColorScheme.fromSeed(<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; seedColor: Colors.teal,<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; primary: Colors.teal[800]!,<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; useMaterial3: true,<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; home: const SplashScreen(),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; );<\/p>\n\n\n\n<p>&nbsp; }<\/p>\n\n\n\n<p>}<\/p>\n\n\n\n<p>class Temple {<\/p>\n\n\n\n<p>&nbsp; final int number;<\/p>\n\n\n\n<p>&nbsp; final String name;<\/p>\n\n\n\n<p>&nbsp; final String address;<\/p>\n\n\n\n<p>&nbsp; final String description;<\/p>\n\n\n\n<p>&nbsp; final double lat;<\/p>\n\n\n\n<p>&nbsp; final double lng;<\/p>\n\n\n\n<p>&nbsp; Temple({<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; required this.number,<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; required this.name,<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; required this.address,<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; required this.description,<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; required this.lat,<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; required this.lng,<\/p>\n\n\n\n<p>&nbsp; });<\/p>\n\n\n\n<p>}<\/p>\n\n\n\n<p>final List&lt;Temple&gt; shikokuTemples = [<\/p>\n\n\n\n<p>&nbsp; Temple(<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; number: 1,<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; name: &#8220;\u970a\u5c71\u5bfa&#8221;,<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; address: &#8220;\u5fb3\u5cf6\u770c\u9cf4\u9580\u5e02\u5927\u9ebb\u753a\u677f\u6771\u585a\u9f3b126&#8221;,<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; description: &#8220;\u56db\u56fd\u516b\u5341\u516b\u30f6\u6240\u970a\u5834\u306e\u7b2c1\u756a\u672d\u6240\u3002\u304a\u904d\u8def\u306e\u65c5\u7acb\u3061\u306e\u5bfa\u3068\u3057\u3066\u77e5\u3089\u308c\u307e\u3059\u3002&#8221;,<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; lat: 34.1601,<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; lng: 134.5028,<\/p>\n\n\n\n<p>&nbsp; ),<\/p>\n\n\n\n<p>&nbsp; Temple(<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; number: 2,<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; name: &#8220;\u6975\u697d\u5bfa&#8221;,<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; address: &#8220;\u5fb3\u5cf6\u770c\u9cf4\u9580\u5e02\u5927\u9ebb\u753a\u6867\u5b57\u30c0\u30f3\u30ce\u4e0a12&#8221;,<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; description: &#8220;\u5f18\u6cd5\u5927\u5e2b\u624b\u690d\u3048\u3068\u4f1d\u308f\u308b\u9577\u547d\u6749\u304c\u6709\u540d\u3067\u3001\u5b89\u7523\u3084\u9577\u5bff\u306e\u3054\u5229\u76ca\u304c\u3042\u308a\u307e\u3059\u3002&#8221;,<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; lat: 34.1558,<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; lng: 134.4883,<\/p>\n\n\n\n<p>&nbsp; ),<\/p>\n\n\n\n<p>&nbsp; \/\/ \u203b\u5b9f\u969b\u306e\u30a2\u30d7\u30ea\u3067\u306f\u3053\u3053\u306b\u516888\u7b87\u6240\u306e\u30c7\u30fc\u30bf\u3092\u8a18\u8ff0\u3057\u307e\u3059<\/p>\n\n\n\n<p>];<\/p>\n\n\n\n<p>class SplashScreen extends StatefulWidget {<\/p>\n\n\n\n<p>&nbsp; const SplashScreen({super.key});<\/p>\n\n\n\n<p>&nbsp; @override<\/p>\n\n\n\n<p>&nbsp; State&lt;SplashScreen&gt; createState() =&gt; _SplashScreenState();<\/p>\n\n\n\n<p>}<\/p>\n\n\n\n<p>class _SplashScreenState extends State&lt;SplashScreen&gt; {<\/p>\n\n\n\n<p>&nbsp; @override<\/p>\n\n\n\n<p>&nbsp; void initState() {<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; super.initState();<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; Timer(const Duration(seconds: 3), () {<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (mounted) {<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Navigator.of(context).pushReplacement(<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MaterialPageRoute(builder: (_) =&gt; const MainTabs()),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; });<\/p>\n\n\n\n<p>&nbsp; }<\/p>\n\n\n\n<p>&nbsp; @override<\/p>\n\n\n\n<p>&nbsp; Widget build(BuildContext context) {<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; return Scaffold(<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; backgroundColor: Colors.teal[50],<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; body: Center(<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; child: Column(<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mainAxisAlignment: MainAxisAlignment.center,<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; children: [<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const Icon(Icons.temple_buddhist, size: 100, color: Colors.teal),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const SizedBox(height: 20),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Text(<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8216;\u56db\u56fd\u5de1\u793c88\u30f6\u6240\u30ca\u30d3&#8217;,<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold, color: Colors.teal[900]),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ],<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; );<\/p>\n\n\n\n<p>&nbsp; }<\/p>\n\n\n\n<p>}<\/p>\n\n\n\n<p>class MainTabs extends StatefulWidget {<\/p>\n\n\n\n<p>&nbsp; const MainTabs({super.key});<\/p>\n\n\n\n<p>&nbsp; @override<\/p>\n\n\n\n<p>&nbsp; State&lt;MainTabs&gt; createState() =&gt; _MainTabsState();<\/p>\n\n\n\n<p>}<\/p>\n\n\n\n<p>class _MainTabsState extends State&lt;MainTabs&gt; {<\/p>\n\n\n\n<p>&nbsp; int _index = 0;<\/p>\n\n\n\n<p>&nbsp; final List&lt;Widget&gt; _screens = const [<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; TempleListScreen(),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; TempleMapScreen(),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; AppSettingsScreen(),<\/p>\n\n\n\n<p>&nbsp; ];<\/p>\n\n\n\n<p>&nbsp; BannerAd? _bannerAd;<\/p>\n\n\n\n<p>&nbsp; @override<\/p>\n\n\n\n<p>&nbsp; void initState() {<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; super.initState();<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; _loadBannerAd();<\/p>\n\n\n\n<p>&nbsp; }<\/p>\n\n\n\n<p>&nbsp; void _loadBannerAd() {<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; final adUnitId = Platform.isAndroid<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ? &#8216;ca-app-pub-9834322564165763\/1171588778&#8217; \/\/ Android\u7528\u30c6\u30b9\u30c8ID<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : &#8216;ca-app-pub-9834322564165763\/2934735716&#8217;; \/\/ iOS\u7528\u30c6\u30b9\u30c8ID<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; _bannerAd = BannerAd(<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; adUnitId: adUnitId,<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; size: AdSize.banner,<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; request: const AdRequest(),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; listener: BannerAdListener(<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; onAdLoaded: (ad) =&gt; setState(() {}),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; onAdFailedToLoad: (ad, error) {<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ad.dispose();<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; },<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; )..load();<\/p>\n\n\n\n<p>&nbsp; }<\/p>\n\n\n\n<p>&nbsp; @override<\/p>\n\n\n\n<p>&nbsp; void dispose() {<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; _bannerAd?.dispose();<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; super.dispose();<\/p>\n\n\n\n<p>&nbsp; }<\/p>\n\n\n\n<p>&nbsp; @override<\/p>\n\n\n\n<p>&nbsp; Widget build(BuildContext context) {<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; return Scaffold(<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; body: Column(<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; children: [<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Expanded(child: IndexedStack(index: _index, children: _screens)),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (_bannerAd != null)<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Container(<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alignment: Alignment.center,<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; width: _bannerAd!.size.width.toDouble(),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; height: _bannerAd!.size.height.toDouble(),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; child: AdWidget(ad: _bannerAd!),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const SizedBox(height: 50),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ],<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bottomNavigationBar: BottomNavigationBar(<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; currentIndex: _index,<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; onTap: (v) =&gt; setState(() =&gt; _index = v),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; items: const [<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BottomNavigationBarItem(icon: Icon(Icons.list), label: &#8216;\u672d\u6240\u4e00\u89a7&#8217;),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BottomNavigationBarItem(icon: Icon(Icons.map), label: &#8216;\u5de1\u793c\u30de\u30c3\u30d7&#8217;),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BottomNavigationBarItem(icon: Icon(Icons.info), label: &#8216;\u8a2d\u5b9a\u30fb\u8aac\u660e&#8217;),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ],<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; );<\/p>\n\n\n\n<p>&nbsp; }<\/p>\n\n\n\n<p>}<\/p>\n\n\n\n<p>class TempleListScreen extends StatefulWidget {<\/p>\n\n\n\n<p>&nbsp; const TempleListScreen({super.key});<\/p>\n\n\n\n<p>&nbsp; @override<\/p>\n\n\n\n<p>&nbsp; State&lt;TempleListScreen&gt; createState() =&gt; _TempleListScreenState();<\/p>\n\n\n\n<p>}<\/p>\n\n\n\n<p>class _TempleListScreenState extends State&lt;TempleListScreen&gt; {<\/p>\n\n\n\n<p>&nbsp; List&lt;String&gt; visitedIds = [];<\/p>\n\n\n\n<p>&nbsp; Position? _pos;<\/p>\n\n\n\n<p>&nbsp; @override<\/p>\n\n\n\n<p>&nbsp; void initState() {<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; super.initState();<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; _load();<\/p>\n\n\n\n<p>&nbsp; }<\/p>\n\n\n\n<p>&nbsp; _load() async {<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; final prefs = await SharedPreferences.getInstance();<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; setState(() =&gt; visitedIds = prefs.getStringList(&#8216;visited&#8217;) ?? []);<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; try {<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Position p = await Geolocator.getCurrentPosition();<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setState(() =&gt; _pos = p);<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; } catch (_) {}<\/p>\n\n\n\n<p>&nbsp; }<\/p>\n\n\n\n<p>&nbsp; @override<\/p>\n\n\n\n<p>&nbsp; Widget build(BuildContext context) {<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; return Scaffold(<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; appBar: AppBar(title: const Text(&#8216;\u672d\u6240\u4e00\u89a7&#8217;), backgroundColor: Colors.teal[100]),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; body: ListView.builder(<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; itemCount: shikokuTemples.length,<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; itemBuilder: (context, i) {<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final t = shikokuTemples[i];<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final isV = visitedIds.contains(t.number.toString());<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double? dist;<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (_pos != null) {<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dist = Geolocator.distanceBetween(_pos!.latitude, _pos!.longitude, t.lat, t.lng) \/ 1000;<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ListTile(<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; leading: CircleAvatar(<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; backgroundColor: Colors.teal[700],<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foregroundColor: Colors.white,<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; child: Text(t.number.toString()),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; title: Text(t.name),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; subtitle: Text(dist != null ? &#8220;${dist.toStringAsFixed(1)} km&#8221; : t.address),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; trailing: Icon(isV ? Icons.check_circle : Icons.circle_outlined, color: isV ? Colors.teal : null),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; onTap: () =&gt; Navigator.push(<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context,<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MaterialPageRoute(builder: (_) =&gt; DetailScreen(temple: t)),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ).then((_) =&gt; _load()),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; },<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; );<\/p>\n\n\n\n<p>&nbsp; }<\/p>\n\n\n\n<p>}<\/p>\n\n\n\n<p>class TempleMapScreen extends StatefulWidget {<\/p>\n\n\n\n<p>&nbsp; const TempleMapScreen({super.key});<\/p>\n\n\n\n<p>&nbsp; @override<\/p>\n\n\n\n<p>&nbsp; State&lt;TempleMapScreen&gt; createState() =&gt; _TempleMapScreenState();<\/p>\n\n\n\n<p>}<\/p>\n\n\n\n<p>class _TempleMapScreenState extends State&lt;TempleMapScreen&gt; {<\/p>\n\n\n\n<p>&nbsp; List&lt;String&gt; visitedIds = [];<\/p>\n\n\n\n<p>&nbsp; @override<\/p>\n\n\n\n<p>&nbsp; void initState() {<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; super.initState();<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; _load();<\/p>\n\n\n\n<p>&nbsp; }<\/p>\n\n\n\n<p>&nbsp; _load() async {<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; final prefs = await SharedPreferences.getInstance();<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; setState(() =&gt; visitedIds = prefs.getStringList(&#8216;visited&#8217;) ?? []);<\/p>\n\n\n\n<p>&nbsp; }<\/p>\n\n\n\n<p>&nbsp; @override<\/p>\n\n\n\n<p>&nbsp; Widget build(BuildContext context) {<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; return Scaffold(<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; appBar: AppBar(title: const Text(&#8216;\u5de1\u793c\u30de\u30c3\u30d7&#8217;), backgroundColor: Colors.teal[100]),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; body: GoogleMap(<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; initialCameraPosition: const CameraPosition(target: LatLng(34.1601, 134.5028), zoom: 8),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myLocationEnabled: true,<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; markers: shikokuTemples.map((t) {<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final isV = visitedIds.contains(t.number.toString());<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return Marker(<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; markerId: MarkerId(t.number.toString()),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; position: LatLng(t.lat, t.lng),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; icon: BitmapDescriptor.defaultMarkerWithHue(<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; isV ? BitmapDescriptor.hueGreen : BitmapDescriptor.hueRed,<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; infoWindow: InfoWindow(<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; title: t.name,<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; snippet: &#8216;\u8a73\u7d30\u3092\u898b\u308b&#8217;,<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; onTap: () =&gt; Navigator.push(<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context,<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MaterialPageRoute(builder: (_) =&gt; DetailScreen(temple: t)),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ).then((_) =&gt; _load()),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }).toSet(),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; );<\/p>\n\n\n\n<p>&nbsp; }<\/p>\n\n\n\n<p>}<\/p>\n\n\n\n<p>class DetailScreen extends StatefulWidget {<\/p>\n\n\n\n<p>&nbsp; final Temple temple;<\/p>\n\n\n\n<p>&nbsp; const DetailScreen({super.key, required this.temple});<\/p>\n\n\n\n<p>&nbsp; @override<\/p>\n\n\n\n<p>&nbsp; State&lt;DetailScreen&gt; createState() =&gt; _DetailScreenState();<\/p>\n\n\n\n<p>}<\/p>\n\n\n\n<p>class _DetailScreenState extends State&lt;DetailScreen&gt; {<\/p>\n\n\n\n<p>&nbsp; File? _landscapeImage;<\/p>\n\n\n\n<p>&nbsp; File? _goshuinImage;<\/p>\n\n\n\n<p>&nbsp; final TextEditingController _memoController = TextEditingController();<\/p>\n\n\n\n<p>&nbsp; bool _isVisited = false;<\/p>\n\n\n\n<p>&nbsp; @override<\/p>\n\n\n\n<p>&nbsp; void initState() {<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; super.initState();<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; _loadData();<\/p>\n\n\n\n<p>&nbsp; }<\/p>\n\n\n\n<p>&nbsp; _loadData() async {<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; final prefs = await SharedPreferences.getInstance();<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; final visited = prefs.getStringList(&#8216;visited&#8217;) ?? [];<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; final landPath = prefs.getString(&#8216;photo_${widget.temple.number}&#8217;);<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; final goshuinPath = prefs.getString(&#8216;goshuin_${widget.temple.number}&#8217;);<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; setState(() {<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _isVisited = visited.contains(widget.temple.number.toString());<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _memoController.text = prefs.getString(&#8216;memo_${widget.temple.number}&#8217;) ?? &#8220;&#8221;;<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (landPath != null &amp;&amp; File(landPath).existsSync()) _landscapeImage = File(landPath);<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (goshuinPath != null &amp;&amp; File(goshuinPath).existsSync()) _goshuinImage = File(goshuinPath);<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; });<\/p>\n\n\n\n<p>&nbsp; }<\/p>\n\n\n\n<p>&nbsp; _saveMemo() async {<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; final prefs = await SharedPreferences.getInstance();<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; await prefs.setString(&#8216;memo_${widget.temple.number}&#8217;, _memoController.text);<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; if (mounted) ScaffoldMessenger.of(context).showSnackBar(const SnackBar(content: Text(&#8220;\u30e1\u30e2\u3092\u4fdd\u5b58\u3057\u307e\u3057\u305f&#8221;)));<\/p>\n\n\n\n<p>&nbsp; }<\/p>\n\n\n\n<p>&nbsp; _toggleVisited() async {<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; final prefs = await SharedPreferences.getInstance();<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; List&lt;String&gt; visited = prefs.getStringList(&#8216;visited&#8217;) ?? [];<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; String id = widget.temple.number.toString();<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; _isVisited ? visited.remove(id) : visited.add(id);<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; await prefs.setStringList(&#8216;visited&#8217;, visited);<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; setState(() =&gt; _isVisited = !_isVisited);<\/p>\n\n\n\n<p>&nbsp; }<\/p>\n\n\n\n<p>&nbsp; Future&lt;void&gt; _takePhoto(bool isGoshuin) async {<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; final scaffoldMessenger = ScaffoldMessenger.of(context);<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; final source = await showModalBottomSheet&lt;ImageSource&gt;(<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context: context,<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; backgroundColor: Colors.white,<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; shape: const RoundedRectangleBorder(borderRadius: BorderRadius.vertical(top: Radius.circular(16))),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; builder: (BuildContext sheetCtx) {<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return SafeArea(<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; child: Column(<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mainAxisSize: MainAxisSize.min,<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; children: &lt;Widget&gt;[<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const Padding(<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; padding: EdgeInsets.all(16.0),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; child: Text(&#8216;\u5199\u771f\u306e\u8ffd\u52a0\u65b9\u6cd5&#8217;, style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold)),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ListTile(<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; leading: const Icon(Icons.photo_camera, color: Colors.teal),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; title: const Text(&#8216;\u30ab\u30e1\u30e9\u3067\u64ae\u5f71\u3059\u308b&#8217;),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; onTap: () =&gt; Navigator.pop(sheetCtx, ImageSource.camera),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ListTile(<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; leading: const Icon(Icons.photo_library, color: Colors.teal),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; title: const Text(&#8216;\u30a2\u30eb\u30d0\u30e0\u304b\u3089\u9078\u3076&#8217;),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; onTap: () =&gt; Navigator.pop(sheetCtx, ImageSource.gallery),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ],<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; },<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; );<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; if (source == null) return;<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; try {<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final picker = ImagePicker();<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final pickedFile = await picker.pickImage(source: source, maxWidth: 1000);<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (pickedFile == null) return;<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final dir = await getApplicationDocumentsDirectory();<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final fileName = isGoshuin ? &#8216;goshuin_${widget.temple.number}.jpg&#8217; : &#8216;land_${widget.temple.number}.jpg&#8217;;<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final savedFile = await File(pickedFile.path).copy(p.join(dir.path, fileName));<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final prefs = await SharedPreferences.getInstance();<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; await prefs.setString(isGoshuin ? &#8216;goshuin_${widget.temple.number}&#8217; : &#8216;photo_${widget.temple.number}&#8217;, savedFile.path);<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!mounted) return;<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setState(() {<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (isGoshuin) {<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _goshuinImage = savedFile;<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _landscapeImage = savedFile;<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; } catch (e) {<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!mounted) return;<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scaffoldMessenger.showSnackBar(SnackBar(content: Text(&#8220;\u753b\u50cf\u306e\u53d6\u5f97\u306b\u5931\u6557\u3057\u307e\u3057\u305f: $e&#8221;)));<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; }<\/p>\n\n\n\n<p>&nbsp; }<\/p>\n\n\n\n<p>&nbsp; @override<\/p>\n\n\n\n<p>&nbsp; Widget build(BuildContext context) {<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; return Scaffold(<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; appBar: AppBar(title: Text(widget.temple.name)),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; body: SingleChildScrollView(<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; child: Column(<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; children: [<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SizedBox(<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; height: 200,<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; child: GoogleMap(<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; initialCameraPosition: CameraPosition(target: LatLng(widget.temple.lat, widget.temple.lng), zoom: 15),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; markers: {Marker(markerId: const MarkerId(&#8216;temple_loc&#8217;), position: LatLng(widget.temple.lat, widget.temple.lng))}<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Padding(<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; padding: const EdgeInsets.all(16),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; child: Column(<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; crossAxisAlignment: CrossAxisAlignment.start,<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; children: [<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const Text(&#8220;\u3010\u5bfa\u9662\u89e3\u8aac\u3011&#8221;, style: TextStyle(fontWeight: FontWeight.bold)),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const SizedBox(height: 4),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Text(widget.temple.description),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const SizedBox(height: 20),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _imageSection(&#8220;\u98a8\u666f\u5199\u771f&#8221;, _landscapeImage, () =&gt; _takePhoto(false)),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const SizedBox(height: 20),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _imageSection(&#8220;\u5fa1\u6731\u5370&#8221;, _goshuinImage, () =&gt; _takePhoto(true), isGoshuin: true),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const SizedBox(height: 20),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const Text(&#8220;\u3010\u53c2\u62dd\u30e1\u30e2\u3011&#8221;, style: TextStyle(fontWeight: FontWeight.bold)),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const SizedBox(height: 8),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TextField(controller: _memoController, maxLines: 3, decoration: const InputDecoration(border: OutlineInputBorder())),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const SizedBox(height: 8),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ElevatedButton(onPressed: _saveMemo, child: const Text(&#8220;\u30e1\u30e2\u3092\u4fdd\u5b58&#8221;)),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const Divider(height: 40),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Center(<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; child: ElevatedButton.icon(<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; onPressed: _toggleVisited,<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; icon: Icon(_isVisited ? Icons.check : Icons.add),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; label: Text(_isVisited ? &#8220;\u8a2a\u554f\u6e08\u307f&#8221; : &#8220;\u8a2a\u554f\u3092\u8a18\u9332\u3059\u308b&#8221;),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; style: ElevatedButton.styleFrom(backgroundColor: _isVisited ? Colors.teal[100] : null),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const SizedBox(height: 60),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ],<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ],<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; );<\/p>\n\n\n\n<p>&nbsp; }<\/p>\n\n\n\n<p>&nbsp; Widget _imageSection(String title, File? image, VoidCallback onAction, {bool isGoshuin = false}) {<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; return Column(<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; crossAxisAlignment: CrossAxisAlignment.start,<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; children: [<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Text(&#8220;\u3010$title\u3011&#8221;, style: const TextStyle(fontWeight: FontWeight.bold)),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const SizedBox(height: 8),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GestureDetector(<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; behavior: HitTestBehavior.opaque,<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; onTap: onAction,<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; child: image != null<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ? ClipRRect(borderRadius: BorderRadius.circular(10), child: Image.file(image, height: 180, width: double.infinity, fit: BoxFit.cover))<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Container(<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; height: 120,<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; width: double.infinity,<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; decoration: BoxDecoration(<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; color: isGoshuin ? Colors.red[50] : Colors.grey[200],<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; borderRadius: BorderRadius.circular(10),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; border: Border.all(color: Colors.grey[300]!),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; child: Column(<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mainAxisAlignment: MainAxisAlignment.center,<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; children: [<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Icon(Icons.camera_alt, color: isGoshuin ? Colors.red[300] : Colors.grey[600], size: 36),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const SizedBox(height: 4),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Text(&#8220;\u30bf\u30c3\u30d7\u3057\u3066$title\u3092\u8ffd\u52a0&#8221;, style: TextStyle(color: Colors.grey[700], fontSize: 13)),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ],<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const SizedBox(height: 4),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TextButton.icon(<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; onPressed: onAction,<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; icon: const Icon(Icons.add_a_photo, size: 18),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; label: Text(&#8220;$title\u3092\u8ffd\u52a0\u30fb\u5909\u66f4&#8221;),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ],<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; );<\/p>\n\n\n\n<p>&nbsp; }<\/p>\n\n\n\n<p>}<\/p>\n\n\n\n<p>class AppSettingsScreen extends StatelessWidget {<\/p>\n\n\n\n<p>&nbsp; const AppSettingsScreen({super.key});<\/p>\n\n\n\n<p>&nbsp; @override<\/p>\n\n\n\n<p>&nbsp; Widget build(BuildContext context) {<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; return Scaffold(<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; appBar: AppBar(title: const Text(&#8220;\u8a2d\u5b9a\u30fb\u30ac\u30a4\u30c9&#8221;), backgroundColor: Colors.teal[100]),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; body: ListView(<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; children: [<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ListTile(<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; leading: const Icon(Icons.help_center_outlined, color: Colors.teal),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; title: const Text(&#8220;\u30a2\u30d7\u30ea\u306e\u4f7f\u3044\u65b9\u30fb\u5de1\u793c\u30ac\u30a4\u30c9&#8221;),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; subtitle: const Text(&#8220;\u5404\u6a5f\u80fd\u306e\u8a73\u7d30\u3068\u53c2\u62dd\u306e\u5fc3\u5f97&#8221;),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; trailing: const Icon(Icons.arrow_forward_ios, size: 16),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; onTap: () =&gt; Navigator.push(context, MaterialPageRoute(builder: (_) =&gt; const AppGuidePage())),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const Divider(),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const ListTile(<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; leading: Icon(Icons.info_outline),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; title: Text(&#8220;\u30d0\u30fc\u30b8\u30e7\u30f3\u60c5\u5831&#8221;),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; subtitle: Text(&#8220;1.0.0&#8221;),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ],<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; );<\/p>\n\n\n\n<p>&nbsp; }<\/p>\n\n\n\n<p>}<\/p>\n\n\n\n<p>class AppGuidePage extends StatelessWidget {<\/p>\n\n\n\n<p>&nbsp; const AppGuidePage({super.key});<\/p>\n\n\n\n<p>&nbsp; @override<\/p>\n\n\n\n<p>&nbsp; Widget build(BuildContext context) {<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; return Scaffold(<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; appBar: AppBar(title: const Text(&#8220;\u30a2\u30d7\u30ea\u306e\u4f7f\u3044\u65b9&#8221;), backgroundColor: Colors.teal[100]),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; body: SingleChildScrollView(<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; padding: const EdgeInsets.all(24),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; child: Column(<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; crossAxisAlignment: CrossAxisAlignment.start,<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; children: [<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const Text(&#8220;\u56db\u56fd\u516b\u5341\u516b\u30f6\u6240 \u5de1\u793c\u306e\u65c5\u3078&#8221;, style: TextStyle(fontSize: 22, fontWeight: FontWeight.bold, color: Colors.teal)),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const SizedBox(height: 16),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const Text(&#8220;\u3053\u306e\u30a2\u30d7\u30ea\u306f\u3001\u5f18\u6cd5\u5927\u5e2b\u3086\u304b\u308a\u306e\u56db\u56fd\u516b\u5341\u516b\u30f6\u6240\u970a\u5834\u3092\u5de1\u308b\u7686\u69d8\u3092\u30b5\u30dd\u30fc\u30c8\u3059\u308b\u305f\u3081\u306b\u958b\u767a\u3055\u308c\u307e\u3057\u305f\u3002\\n\u5de1\u793c\u306e\u8db3\u8de1\u3092\u624b\u8efd\u306b\u8a18\u9332\u3057\u3001\u81ea\u5206\u3060\u3051\u306e\u30c7\u30b8\u30bf\u30eb\u7d0d\u7d4c\u5e33\u3068\u3057\u3066\u3054\u6d3b\u7528\u304f\u3060\u3055\u3044\u3002&#8221;, style: TextStyle(height: 1.6)),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const SizedBox(height: 24),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const Text(&#8220;\u3010\u4e3b\u306a\u6a5f\u80fd\u3011&#8221;, style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold)),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const SizedBox(height: 8),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const Text(&#8220;\u30fb\u672d\u6240\u4e00\u89a7\u3068\u73fe\u5728\u5730\u304b\u3089\u306e\u8ddd\u96e2\u8868\u793a\\n\u30fb\u5de1\u793c\u30de\u30c3\u30d7\u306b\u3088\u308b\u4f4d\u7f6e\u628a\u63e1\\n\u30fb\u53c2\u62dd\u8a18\u9332\u3068\u30e1\u30e2\u30fb\u5199\u771f\uff08\u98a8\u666f\u30fb\u5fa1\u6731\u5370\uff09\u306e\u4fdd\u5b58&#8221;),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const SizedBox(height: 40),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Center(child: ElevatedButton(onPressed: () =&gt; Navigator.pop(context), child: const Text(&#8220;\u623b\u308b&#8221;))),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ],<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ),<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp; );<\/p>\n\n\n\n<p>&nbsp; }<\/p>\n\n\n\n<p>}<\/p>\n\n\n\n<p><strong>\ud83d\udcbb<\/strong><strong> Info.plist <\/strong><strong>\u30d5\u30eb\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9<\/strong><\/p>\n\n\n\n<p>iOS\u30a2\u30d7\u30ea\u3092\u516c\u958b\u3059\u308b\u305f\u3081\u306b\u306f\u3001\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u3067\u3042\u308b Info.plist \u306b\u30ab\u30e1\u30e9\u3084\u4f4d\u7f6e\u60c5\u5831\u306a\u3069\u306e\u300c\u5229\u7528\u76ee\u7684\u300d\u3092\u65e5\u672c\u8a9e\u3067\u66f8\u304b\u306a\u3044\u3068\u5373\u5ea7\u306b\u30ea\u30b8\u30a7\u30af\u30c8\u3055\u308c\u307e\u3059\u3002\u4ee5\u4e0b\u306e\u30b3\u30fc\u30c9\u306f\u30d1\u30fc\u30df\u30c3\u30b7\u30e7\u30f3\u3001iPad\u5168\u753b\u9762\u5bfe\u5fdc\uff08\u9ed2\u5e2f\u9632\u6b62\uff09\u3001\u30ed\u30fc\u30ab\u30eb\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u8a31\u53ef\u3001AdMob\u8a2d\u5b9a\u3092\u3059\u3079\u3066\u7db2\u7f85\u3057\u305f\u5b8c\u5168\u7248\u3067\u3059\u3002<\/p>\n\n\n\n<p>XML<\/p>\n\n\n\n<p>&lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;UTF-8&#8243;?&gt;<\/p>\n\n\n\n<p>&lt;!DOCTYPE plist PUBLIC &#8220;-\/\/Apple\/\/DTD PLIST 1.0\/\/EN&#8221; &#8220;http:\/\/www.apple.com\/DTDs\/PropertyList-1.0.dtd&#8221;&gt;<\/p>\n\n\n\n<p>&lt;plist version=&#8221;1.0&#8243;&gt;<\/p>\n\n\n\n<p>&lt;dict&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &lt;key&gt;CFBundleDevelopmentRegion&lt;\/key&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &lt;string&gt;$(DEVELOPMENT_LANGUAGE)&lt;\/string&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &lt;key&gt;CFBundleDisplayName&lt;\/key&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &lt;string&gt;\u56db\u56fd\u5de1\u793c88&lt;\/string&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &lt;key&gt;CFBundleExecutable&lt;\/key&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &lt;string&gt;$(EXECUTABLE_NAME)&lt;\/string&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &lt;key&gt;CFBundleIdentifier&lt;\/key&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &lt;string&gt;$(PRODUCT_BUNDLE_IDENTIFIER)&lt;\/string&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &lt;key&gt;CFBundleInfoDictionaryVersion&lt;\/key&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &lt;string&gt;6.0&lt;\/string&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &lt;key&gt;CFBundleName&lt;\/key&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &lt;string&gt;shikoku88_app&lt;\/string&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &lt;key&gt;CFBundlePackageType&lt;\/key&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &lt;string&gt;APPL&lt;\/string&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &lt;key&gt;CFBundleShortVersionString&lt;\/key&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &lt;string&gt;$(FLUTTER_BUILD_NAME)&lt;\/string&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &lt;key&gt;CFBundleSignature&lt;\/key&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &lt;string&gt;????&lt;\/string&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &lt;key&gt;CFBundleVersion&lt;\/key&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &lt;string&gt;$(FLUTTER_BUILD_NUMBER)&lt;\/string&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &lt;key&gt;LSRequiresIPhoneOS&lt;\/key&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &lt;true\/&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &lt;key&gt;UILaunchStoryboardName&lt;\/key&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &lt;string&gt;LaunchScreen&lt;\/string&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &lt;key&gt;UIMainStoryboardFile&lt;\/key&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &lt;string&gt;Main&lt;\/string&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &lt;key&gt;UISupportedInterfaceOrientations&lt;\/key&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &lt;array&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;string&gt;UIInterfaceOrientationPortrait&lt;\/string&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;string&gt;UIInterfaceOrientationLandscapeLeft&lt;\/string&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;string&gt;UIInterfaceOrientationLandscapeRight&lt;\/string&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &lt;\/array&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &lt;key&gt;UISupportedInterfaceOrientations~ipad&lt;\/key&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &lt;array&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;string&gt;UIInterfaceOrientationPortrait&lt;\/string&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;string&gt;UIInterfaceOrientationPortraitUpsideDown&lt;\/string&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;string&gt;UIInterfaceOrientationLandscapeLeft&lt;\/string&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;string&gt;UIInterfaceOrientationLandscapeRight&lt;\/string&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &lt;\/array&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &lt;!&#8211; iPad\u3067\u306e\u9ed2\u5e2f\u30a8\u30e9\u30fc\u9632\u6b62 &#8211;&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &lt;key&gt;UIRequiresFullScreen&lt;\/key&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &lt;true\/&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &lt;key&gt;CADisableMinimumFrameDurationOnPhone&lt;\/key&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &lt;true\/&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &lt;key&gt;UIApplicationSupportsIndirectInputEvents&lt;\/key&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &lt;true\/&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &lt;!&#8211; \u5404\u7a2e\u30d1\u30fc\u30df\u30c3\u30b7\u30e7\u30f3\u306e\u76ee\u7684\u6587\u5b57\u5217\uff08\u5fc5\u9808\uff09 &#8211;&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &lt;key&gt;NSCameraUsageDescription&lt;\/key&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &lt;string&gt;\u5de1\u793c\u306e\u8a18\u9332\u3068\u3057\u3066\u5199\u771f\u3092\u64ae\u5f71\u3059\u308b\u305f\u3081\u306b\u30ab\u30e1\u30e9\u3092\u4f7f\u7528\u3057\u307e\u3059\u3002&lt;\/string&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &lt;key&gt;NSPhotoLibraryUsageDescription&lt;\/key&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &lt;string&gt;\u5de1\u793c\u306e\u8a18\u9332\u3068\u3057\u3066\u4fdd\u5b58\u3057\u305f\u5199\u771f\u3092\u9078\u629e\u3059\u308b\u305f\u3081\u306b\u5199\u771f\u30e9\u30a4\u30d6\u30e9\u30ea\u306b\u30a2\u30af\u30bb\u30b9\u3057\u307e\u3059\u3002&lt;\/string&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &lt;key&gt;NSMicrophoneUsageDescription&lt;\/key&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &lt;string&gt;\u52d5\u753b\u64ae\u5f71\u7528\u306b\u30de\u30a4\u30af\u306b\u30a2\u30af\u30bb\u30b9\u3057\u307e\u3059\u3002&lt;\/string&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &lt;key&gt;NSLocationWhenInUseUsageDescription&lt;\/key&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &lt;string&gt;\u73fe\u5728\u5730\u3092\u53d6\u5f97\u3057\u3001\u5404\u5bfa\u9662\u307e\u3067\u306e\u8ddd\u96e2\u3092\u8868\u793a\u3059\u308b\u305f\u3081\u306b\u4f4d\u7f6e\u60c5\u5831\u3092\u4f7f\u7528\u3057\u307e\u3059\u3002&lt;\/string&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &lt;key&gt;NSLocalNetworkUsageDescription&lt;\/key&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &lt;string&gt;\u30a2\u30d7\u30ea\u306e\u30c7\u30d0\u30c3\u30b0\u304a\u3088\u3073\u30c7\u30d0\u30a4\u30b9\u9593\u306e\u901a\u4fe1\u306e\u305f\u3081\u306b\u30ed\u30fc\u30ab\u30eb\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3092\u4f7f\u7528\u3057\u307e\u3059\u3002&lt;\/string&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &lt;key&gt;NSBonjourServices&lt;\/key&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &lt;array&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;string&gt;_dartobservatory._tcp&lt;\/string&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &lt;\/array&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &lt;key&gt;LSApplicationQueriesSchemes&lt;\/key&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &lt;array&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;string&gt;googlechromes&lt;\/string&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;string&gt;comgooglemaps&lt;\/string&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;string&gt;https&lt;\/string&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;string&gt;http&lt;\/string&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &lt;\/array&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &lt;!&#8211; AdMob\u30a2\u30d7\u30eaID &#8211;&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &lt;key&gt;GADApplicationIdentifier&lt;\/key&gt;<\/p>\n\n\n\n<p>&nbsp;&nbsp; &lt;string&gt;ca-app-pub-3940256099942544~1458002511&lt;\/string&gt;<\/p>\n\n\n\n<p>&lt;\/dict&gt;<\/p>\n\n\n\n<p>&lt;\/plist&gt;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E7%AC%AC4%E7%AB%A0%EF%BC%9A%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92%E6%88%90%E9%95%B7%E3%81%95%E3%81%9B%E3%82%8B%EF%BC%81%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA%E5%8C%96%E3%81%B8%E3%81%AE%E9%81%93%EF%BC%88%E5%BF%9C%E7%94%A8%E7%B7%A8%EF%BC%89\"><\/span><strong>\u7b2c4\u7ae0\uff1a\u30a2\u30d7\u30ea\u3092\u6210\u9577\u3055\u305b\u308b\uff01\u30b7\u30ea\u30fc\u30ba\u5316\u3078\u306e\u9053\uff08\u5fdc\u7528\u7de8\uff09<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>\u300c\u897f\u56fd\u4e09\u5341\u4e09\u6240\u300d\u306e\u30a2\u30d7\u30ea\u304c\u5b8c\u6210\u3059\u308c\u3070\u3001\u305d\u306e\u30b7\u30b9\u30c6\u30e0\uff08\u5730\u56f3\u8868\u793a\u3001\u5199\u771f\u4fdd\u5b58\u3001\u8ddd\u96e2\u8a08\u7b97\uff09\u306f\u4ed6\u306e\u5de1\u793c\u30a2\u30d7\u30ea\u306b\u3082100%\u4f7f\u3044\u56de\u3059\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u79c1\u306f\u3053\u308c\u3092\u300c\u95a2\u897f\u82b1\u306e\u5bfa\u4e8c\u5341\u4e94\u970a\u5834\u300d\u3084\u300c\u56db\u56fd\u516b\u5341\u516b\u30f6\u6240\u5de1\u793c\u300d\u3078\u3068\u6a2a\u5c55\u958b\uff08\u30b7\u30ea\u30fc\u30ba\u5316\uff09\u3057\u307e\u3057\u305f\u3002<\/p>\n\n\n\n<p><strong>1. <\/strong><strong>\u6a2a\u5c55\u958b\u3092\u6210\u529f\u3055\u305b\u308b\u300c\u4e00\u62ec\u7f6e\u63db\u300d\u306e\u30c6\u30af\u30cb\u30c3\u30af<\/strong><\/p>\n\n\n\n<p>\u30b3\u30fc\u30c9\u5185\u306e\u6587\u5b57\u3092\u4e00\u3064\u305a\u3064\u624b\u3067\u76f4\u3059\u306e\u306f\u5927\u5909\u3067\u3059\u3002Android Studio\u306e\u300c\u4e00\u62ec\u7f6e\u63db\uff08Replace in Files\uff09\u300d\u6a5f\u80fd\uff08Ctrl+Shift+R\uff09\u3092\u4f7f\u3048\u3070\u3001\u4e00\u77ac\u3067\u5b89\u5168\u306b\u66f8\u304d\u63db\u3048\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u30d1\u30bf\u30fc\u30f31\uff08\u30af\u30e9\u30b9\u540d\u3084\u30a2\u30d7\u30ea\u540d\uff09\uff1a<\/strong> Saigoku \u2794 Shikoku<\/li>\n\n\n\n<li><strong>\u30d1\u30bf\u30fc\u30f32\uff08\u5909\u6570\u540d\u3084\u30c7\u30fc\u30bf\u540d\uff09\uff1a<\/strong> saigoku \u2794 shikoku<\/li>\n\n\n\n<li><strong>\u30d1\u30bf\u30fc\u30f33\uff08\u65e5\u672c\u8a9e\u30c6\u30ad\u30b9\u30c8\uff09\uff1a<\/strong> \u897f\u56fd\u4e09\u5341\u4e09\u6240 \u2794 \u56db\u56fd\u516b\u5341\u516b\u30f6\u6240<\/li>\n<\/ul>\n\n\n\n<p><strong>2. <\/strong><strong>\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3092\u72ec\u7acb\u3055\u305b\u308b\u5fc5\u9808\u4f5c\u696d<\/strong><\/p>\n\n\n\n<p>\u5168\u304f\u5225\u306e\u30a2\u30d7\u30ea\u3068\u3057\u3066\u30b9\u30c8\u30a2\u306b\u516c\u958b\u3059\u308b\u306b\u306f\u3001\u4ee5\u4e0b\u306e\u5909\u66f4\u304c\u5fc5\u9808\u3067\u3059\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u30d1\u30c3\u30b1\u30fc\u30b8\u540d\u306e\u5909\u66f4\uff1a<\/strong> android\/app\/build.gradle \u5185\u306e applicationId \u3092\u3001com.wzero7.saigoku \u304b\u3089 com.wzero7.shikoku88 \u306a\u3069\u306b\u5909\u66f4\u3057\u307e\u3059\u3002\u3053\u308c\u3092\u884c\u308f\u306a\u3044\u3068\u300c\u540c\u3058\u30a2\u30d7\u30ea\u306e\u30a2\u30c3\u30d7\u30c7\u30fc\u30c8\u300d\u3068\u307f\u306a\u3055\u308c\u3066\u3057\u307e\u3044\u307e\u3059\u3002<\/li>\n\n\n\n<li><strong>\u30a2\u30a4\u30b3\u30f3\u3068\u30c6\u30fc\u30de\u306e\u5909\u66f4\uff1a<\/strong> \u82b1\u306e\u5bfa\u306a\u3089\u30d4\u30f3\u30af\u8272\u3001\u56db\u56fd\u306a\u3089\u7dd1\u8272\u306a\u3069\u3001\u8996\u899a\u7684\u306b\u5168\u304f\u5225\u306e\u30a2\u30d7\u30ea\u306b\u898b\u3048\u308b\u3088\u3046\u306b\u30c6\u30fc\u30de\u30ab\u30e9\u30fc\u3068\u30a2\u30a4\u30b3\u30f3\u753b\u50cf\uff08flutter_launcher_icons\u3092\u4f7f\u7528\uff09\u3092\u5dee\u3057\u66ff\u3048\u307e\u3059\u3002<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB%EF%BC%9A78%E6%AD%B3%E3%81%8B%E3%82%89%E3%81%AE%E6%8C%91%E6%88%A6%E3%82%92%E6%8C%AF%E3%82%8A%E8%BF%94%E3%81%A3%E3%81%A6\"><\/span><strong>\u304a\u308f\u308a\u306b\uff1a78\u6b73\u304b\u3089\u306e\u6311\u6226\u3092\u632f\u308a\u8fd4\u3063\u3066<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>\u958b\u767a\u306e\u9053\u306e\u308a\u306f\u6c7a\u3057\u3066\u5e73\u5766\u3067\u306f\u306a\u304f\u3001\u771f\u3063\u8d64\u306a\u30a8\u30e9\u30fc\u30e1\u30c3\u30bb\u30fc\u30b8\u306b\u5fc3\u304c\u6298\u308c\u305d\u3046\u306b\u306a\u308b\u3053\u3068\u3082\u3042\u308a\u307e\u3057\u305f\u3002\u3057\u304b\u3057\u3001\u30a8\u30e9\u30fc\u306f\u30d7\u30ed\u30b0\u30e9\u30e0\u304c\u300c\u3053\u3053\u3092\u76f4\u305b\u3070\u52d5\u304f\u3088\uff01\u300d\u3068\u6559\u3048\u3066\u304f\u308c\u308b\u300c\u9053\u3057\u308b\u3079\u300d\u3060\u3068\u6c17\u3065\u3044\u305f\u3068\u304d\u3001\u30d1\u30ba\u30eb\u3092\u89e3\u304f\u3088\u3046\u306a\u77e5\u7684\u306a\u559c\u3073\u306b\u5909\u308f\u308a\u307e\u3057\u305f\u3002<\/p>\n\n\n\n<p>\u81ea\u5206\u304c\u66f8\u3044\u305f\u30b3\u30fc\u30c9\u304c\u30b9\u30de\u30fc\u30c8\u30d5\u30a9\u30f3\u306e\u4e2d\u3067\u300c\u672c\u7269\u306e\u30a2\u30d7\u30ea\u300d\u3068\u3057\u3066\u52d5\u304d\u51fa\u3057\u305f\u3068\u304d\u306e\u611f\u52d5\u306f\u3001\u5e74\u9f62\u306b\u95a2\u4fc2\u306a\u304f\u30e2\u30ce\u3065\u304f\u308a\u306e\u539f\u70b9\u3060\u3068\u611f\u3058\u307e\u3059\u3002\u300c\u30d7\u30ed\u30b0\u30e9\u30df\u30f3\u30b0\u306f\u82e5\u8005\u306e\u3082\u306e\u300d\u3068\u3044\u3046\u5148\u5165\u89b3\u306f\u6368\u3066\u3066\u304f\u3060\u3055\u3044\u3002\u5c11\u3057\u306e\u597d\u5947\u5fc3\u304c\u3042\u308c\u3070\u3001\u4f55\u6b73\u304b\u3089\u3067\u3082\u65b0\u3057\u3044\u4e16\u754c\u306f\u958b\u3051\u307e\u3059\u3002\u672c\u66f8\u306e\u30d5\u30eb\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9\u304c\u3001\u7686\u69d8\u306e\u6311\u6226\u306e\u30d2\u30f3\u30c8\u306b\u306a\u308c\u3070\u5e78\u3044\u3067\u3059\u3002<\/p>\n\n\n\n<p><strong>\u4ed8\u9332\uff1aKindle\uff08\u96fb\u5b50\u66f8\u7c4d\uff09\u3067\u51fa\u7248\u3059\u308b\u305f\u3081\u306e\u5b8c\u5168\u30ac\u30a4\u30c9<\/strong><\/p>\n\n\n\n<p>\u9023\u8f09\u304c\u5b8c\u4e86\u3057\u305f\u3089\u3001\u305d\u308c\u3089\u306e\u539f\u7a3f\u3092\u4e00\u3064\u306b\u307e\u3068\u3081\u3066\u300cKindle\uff08Amazon\u306e\u96fb\u5b50\u66f8\u7c4d\uff09\u300d\u3068\u3057\u3066\u51fa\u7248\u3057\u307e\u3057\u3087\u3046\uff01<\/p>\n\n\n\n<p><strong>1. <\/strong><strong>\u539f\u7a3f\u3092\u300c\u672c\u300d\u306e\u5f62\u5f0f\u306b\u6574\u3048\u308b<\/strong><\/p>\n\n\n\n<p>Kindle\u7528\u306e\u539f\u7a3f\u306f Microsoft Word \u3067\u4f5c\u6210\u3059\u308b\u306e\u304c\u6700\u3082\u7c21\u5358\u3067\u3059\u304c\u3001\u4ee5\u4e0b\u306e\u8a2d\u5b9a\u3092\u884c\u308f\u306a\u3044\u3068\u30da\u30fc\u30b8\u6570\u304c\u6975\u7aef\u306b\u5c11\u306a\u304f\u306a\u3063\u3066\u3057\u307e\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u7528\u7d19\u30b5\u30a4\u30ba\u306e\u5909\u66f4\uff1a<\/strong> Word\u306e\u300c\u30ec\u30a4\u30a2\u30a6\u30c8\u300d\u30bf\u30d6\u304b\u3089\u3001\u7528\u7d19\u30b5\u30a4\u30ba\u3092A4\u304b\u3089 <strong>\u300cA5\u300d\u307e\u305f\u306f\u300cB6\u300d<\/strong> \u306b\u5909\u66f4\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/li>\n\n\n\n<li><strong>\u898b\u51fa\u3057\u306e\u8a2d\u5b9a\uff1a<\/strong> \u300c\u7b2c1\u7ae0\u300d\u306a\u3069\u306e\u6587\u5b57\u3092\u9078\u629e\u3057\u3001Word\u306e\u300c\u30db\u30fc\u30e0\u300d\u30bf\u30d6\u306b\u3042\u308b <strong>\u300c\u898b\u51fa\u30571\u300d\u300c\u898b\u51fa\u30572\u300d<\/strong> \u306e\u30b9\u30bf\u30a4\u30eb\u3092\u5fc5\u305a\u9069\u7528\u3057\u3066\u304f\u3060\u3055\u3044\u3002KDP\u304c\u3053\u308c\u3092\u8aad\u307f\u53d6\u308a\u3001\u81ea\u52d5\u3067\u76ee\u6b21\u3092\u4f5c\u3063\u3066\u304f\u308c\u307e\u3059\u3002<\/li>\n\n\n\n<li><strong>\u6bb5\u843d\u306e\u5b57\u4e0b\u3052\uff1a<\/strong> \u6587\u7ae0\u5168\u4f53\u3092\u9078\u629e\u3057\u3001\u300c\u6bb5\u843d\u300d\u8a2d\u5b9a\u304b\u3089\u30a4\u30f3\u30c7\u30f3\u30c8\u306e\u6700\u521d\u306e\u884c\u3092 <strong>\u300c\u5b57\u4e0b\u3052\uff081\u5b57\uff09\u300d<\/strong> \u306b\u3057\u307e\u3059\u3002\u30b9\u30da\u30fc\u30b9\u30ad\u30fc\u3092\u4f7f\u3046\u3068\u30b9\u30de\u30db\u3067\u30ec\u30a4\u30a2\u30a6\u30c8\u304c\u5d29\u308c\u307e\u3059\u3002<\/li>\n\n\n\n<li><strong>\u6539\u30da\u30fc\u30b8\u306e\u6d3b\u7528\uff1a<\/strong> \u7ae0\u304c\u5909\u308f\u308b\u6642\u306f\u3001\u30a8\u30f3\u30bf\u30fc\u30ad\u30fc\u3092\u4f55\u5ea6\u3082\u62bc\u3059\u306e\u3067\u306f\u306a\u304f <strong>\u300c\u6539\u30da\u30fc\u30b8\uff08Ctrl + Enter\uff09\u300d<\/strong> \u3092\u633f\u5165\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/li>\n\n\n\n<li><strong>\u753b\u50cf\u306e\u633f\u5165\uff1a<\/strong> \u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8\u753b\u50cf\u3092\u3075\u3093\u3060\u3093\u306b\u633f\u5165\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u753b\u50cf\u306f\u30da\u30fc\u30b8\u6570\u3092\u7a3c\u304e\u3001\u8aad\u8005\u306e\u7406\u89e3\u3092\u5927\u3044\u306b\u52a9\u3051\u307e\u3059\u3002<\/li>\n<\/ul>\n\n\n\n<p><strong>2. KDP<\/strong><strong>\uff08Kindle Direct Publishing\uff09\u3067\u306e\u51fa\u7248\u624b\u7d9a\u304d<\/strong><\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li><strong>\u8868\u7d19\u306e\u4f5c\u6210\uff1a<\/strong> Canva\u306a\u3069\u306e\u7121\u6599\u30c4\u30fc\u30eb\u3067\u3001\u7e26\u9577\uff08\u63a8\u5968 2560&#215;1600 px\uff09\u306e\u8868\u7d19\u753b\u50cf\uff08JPEG\uff09\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002<\/li>\n\n\n\n<li><strong>KDP<\/strong><strong>\u3078\u306e\u767b\u9332\uff1a<\/strong> Amazon KDP\u306b\u30a2\u30af\u30bb\u30b9\u3057\u3001\u8457\u8005\u60c5\u5831\u3084\u7a0e\u52d9\u60c5\u5831\u3092\u767b\u9332\u3057\u307e\u3059\u3002<\/li>\n\n\n\n<li><strong>\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3068\u4fa1\u683c\u8a2d\u5b9a\uff1a<\/strong> Word\u30d5\u30a1\u30a4\u30eb\u3068\u8868\u7d19\u753b\u50cf\u3092\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3057\u307e\u3059\u3002\u521d\u3081\u3066\u306e\u51fa\u7248\u306a\u3089\u3001Kindle Unlimited\u306e\u5bfe\u8c61\u306b\u306a\u308b\u300cKDP\u30bb\u30ec\u30af\u30c8\u300d\u306b\u767b\u9332\u3057\u3001\u30ed\u30a4\u30e4\u30ea\u30c6\u30a370%\uff08250\u5186\u301c\u306a\u3069\uff09\u3067\u8a2d\u5b9a\u3059\u308b\u306e\u304c\u304a\u3059\u3059\u3081\u3067\u3059\u3002<\/li>\n\n\n\n<li><strong>\u5be9\u67fb\u3068\u516c\u958b\uff1a<\/strong> \u5be9\u67fb\u5b8c\u4e86\u5f8c\u3001\u901a\u5e3824\u6642\u9593\u7a0b\u5ea6\u3067Amazon\u30b9\u30c8\u30a2\u306b\u3042\u306a\u305f\u306e\u672c\u304c\u4e26\u3073\u307e\u3059\uff01<\/li>\n<\/ol>\n<div class=\"veu_socialSet veu_socialSet-position-after veu_contentAddSection\"><script>window.twttr=(function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],t=window.twttr||{};if(d.getElementById(id))return t;js=d.createElement(s);js.id=id;js.src=\"https:\/\/platform.twitter.com\/widgets.js\";fjs.parentNode.insertBefore(js,fjs);t._e=[];t.ready=function(f){t._e.push(f);};return t;}(document,\"script\",\"twitter-wjs\"));<\/script><ul><li class=\"sb_facebook sb_icon\"><a class=\"sb_icon_inner\" href=\"\/\/www.facebook.com\/sharer.php?src=bm&u=https%3A%2F%2Fwww.7crystalsky.com%2F%3Fp%3D4351&amp;t=IT%E3%82%92%E6%A5%BD%E3%81%97%E3%82%80%E4%BC%9A\" target=\"_blank\" onclick=\"window.open(this.href,'FBwindow','width=650,height=450,menubar=no,toolbar=no,scrollbars=yes');return false;\"><span class=\"vk_icon_w_r_sns_fb icon_sns\"><\/span><span class=\"sns_txt\">Facebook<\/span><span class=\"veu_count_sns_fb\"><\/span><\/a><\/li><li class=\"sb_x_twitter sb_icon\"><a class=\"sb_icon_inner\" href=\"\/\/twitter.com\/intent\/tweet?url=https%3A%2F%2Fwww.7crystalsky.com%2F%3Fp%3D4351&amp;text=IT%E3%82%92%E6%A5%BD%E3%81%97%E3%82%80%E4%BC%9A\" target=\"_blank\" ><span class=\"vk_icon_w_r_sns_x_twitter icon_sns\"><\/span><span class=\"sns_txt\">X<\/span><\/a><\/li><\/ul><\/div><!-- [ \/.socialSet ] -->","protected":false},"excerpt":{"rendered":"<p>\u306f\u3058\u3081\u306b \u672c\u7a3f\u306f\u300178\u6b73\u3068\u3044\u3046\u5e74\u9f62\u3067\u30bc\u30ed\u304b\u3089\u30a2\u30d7\u30ea\u958b\u767a\u306b\u6311\u6226\u3057\u3001App Store\u304a\u3088\u3073Google Play Store\u306b\u3066\u300c\u897f\u56fd\u4e09\u5341\u4e09\u6240\u5de1\u793c\u30a2\u30d7\u30ea\u300d\u3092\u30ea\u30ea\u30fc\u30b9\u3057\u305f\u5b9f\u8df5\u7684\u306a\u8a18\u9332\u3067\u3059\u3002\u300c\u30b9\u30de\u30db\u3068\u30d1\u30bd\u30b3\u30f3\u3092\u697d\u3057\u3080\u4f1a\u300d\u3067\u306e\u6d3b [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"vkexunit_cta_each_option":"","footnotes":""},"categories":[53,63],"tags":[],"class_list":["post-4351","post","type-post","status-publish","format-standard","hentry","category-flutter","category-63"],"_links":{"self":[{"href":"https:\/\/www.7crystalsky.com\/index.php?rest_route=\/wp\/v2\/posts\/4351","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.7crystalsky.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.7crystalsky.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.7crystalsky.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.7crystalsky.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4351"}],"version-history":[{"count":1,"href":"https:\/\/www.7crystalsky.com\/index.php?rest_route=\/wp\/v2\/posts\/4351\/revisions"}],"predecessor-version":[{"id":4352,"href":"https:\/\/www.7crystalsky.com\/index.php?rest_route=\/wp\/v2\/posts\/4351\/revisions\/4352"}],"wp:attachment":[{"href":"https:\/\/www.7crystalsky.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4351"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.7crystalsky.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4351"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.7crystalsky.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4351"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}