{"id":973,"date":"2024-05-09T22:50:42","date_gmt":"2024-05-09T14:50:42","guid":{"rendered":"https:\/\/gjweb.top\/?p=973"},"modified":"2024-05-10T20:09:52","modified_gmt":"2024-05-10T12:09:52","slug":"flutter%e5%af%b9%e6%8e%a5%e9%ab%98%e5%be%b7%e5%9c%b0%e5%9b%be%e5%ae%9a%e4%bd%8d%e5%8a%9f%e8%83%bd","status":"publish","type":"post","link":"https:\/\/gjweb.top\/?p=973","title":{"rendered":"flutter\u5bf9\u63a5\u9ad8\u5fb7\u5730\u56fe\u5b9a\u4f4d\u529f\u80fd"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">flutter \u547d\u4ee4\u884c\u65b9\u5f0f\u751f\u6210\u7b7e\u540d\u8bc1\u4e66<\/h2>\n\n\n\n<p>\u9700\u8981\u5bf9\u73b0\u6709 app \u8fdb\u884c\u6253\u5305\uff0c\u7136\u540e\u67e5\u770b\u5f53\u524d\u5305\u7684\u8bc1\u4e66\u4fe1\u606f<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">flutter build apk<br>keytool -printcert -jarfile app-debug.apk<\/pre>\n\n\n\n<p>\u67e5\u770b\u8bc1\u4e66\u793a\u4f8b<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/gjweb.top\/wp-content\/uploads\/2024\/05\/01-1024x519.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"519\" data-original=\"https:\/\/gjweb.top\/wp-content\/uploads\/2024\/05\/01-1024x519.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-974\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<p>\u751f\u6210\u65b0\u7684\u7b7e\u540d\u8bc1\u4e66<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">keytool -genkey -v -keystore test.keystore  -alias demo01 -keyalg RSA -validity 4000<\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/gjweb.top\/wp-content\/uploads\/2024\/05\/02-1024x356.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"356\" data-original=\"https:\/\/gjweb.top\/wp-content\/uploads\/2024\/05\/02-1024x356.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-975\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">flutter 3.0 \u67e5\u770b\u5b89\u5353\u9879\u76ee\u5305\u540d<\/h2>\n\n\n\n<p>\u8def\u5f84 <code>project\\android\\app\\build.gradle<\/code><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">...<br>android {<br> &nbsp;  namespace \"com.example.demo01\"<br> &nbsp;  ...<br>}<br>...<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u9ad8\u5fb7\u5f00\u653e\u5e73\u53f0\u7533\u8bf7Key<\/h2>\n\n\n\n<p>\u6839\u636e\u4e0a\u9762\u7684\u67e5\u8be2\u7ed3\u679c\u586b\u5199\u5230\u5bf9\u5e94\u7684\u8868\u5355\u63d0\u4ea4\u540e\u5f97\u5230 Key<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/gjweb.top\/wp-content\/uploads\/2024\/05\/03.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"769\" height=\"759\" data-original=\"https:\/\/gjweb.top\/wp-content\/uploads\/2024\/05\/03.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-976\"  sizes=\"auto, (max-width: 769px) 100vw, 769px\" \/><\/div><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u914d\u7f6e flutter \u5b89\u5353\u6587\u4ef6<\/h2>\n\n\n\n<p>\u914d\u7f6e <code>project\\android\\app\\src\\main\\AndroidManifest.xml<\/code> \u6dfb\u52a0\u6743\u9650<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">&lt;manifest xmlns:android=\"http:\/\/schemas.android.com\/apk\/res\/android\"&gt;<br> &nbsp;  +++++<br> &nbsp; &nbsp;&lt;!--\u8bbf\u95ee\u7f51\u7edc--&gt;<br> &nbsp; &nbsp;&lt;uses-permission android:name=\"android.permission.INTERNET\" \/&gt;<br> &nbsp; &nbsp;&lt;!--\u7c97\u7565\u5b9a\u4f4d--&gt;<br> &nbsp; &nbsp;&lt;uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\" \/&gt;<br> &nbsp; &nbsp;&lt;!--\u7cbe\u786e\u5b9a\u4f4d--&gt;<br> &nbsp; &nbsp;&lt;uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\" \/&gt;<br> &nbsp; &nbsp;&lt;!--\u7533\u8bf7\u8c03\u7528 A-GPS \u6a21\u5757--&gt;<br> &nbsp; &nbsp;&lt;uses-permission android:name=\"android.permission.ACCESS_LOCATION_EXTRA_COMMANDS\" \/&gt;<br> &nbsp; &nbsp;&lt;!--\u7528\u4e8e\u83b7\u53d6\u8fd0\u8425\u5546\u4fe1\u606f\uff0c\u7528\u4e8e\u652f\u6301\u63d0\u4f9b\u8fd0\u8425\u5546\u4fe1\u606f\u76f8\u5173\u7684\u63a5\u53e3--&gt;<br> &nbsp; &nbsp;&lt;uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\" \/&gt;<br> &nbsp; &nbsp;&lt;!--\u7528\u4e8e\u8bbf\u95ee wifi \u7f51\u7edc\u4fe1\u606f\uff0cwifi \u4fe1\u606f\u4f1a\u7528\u4e8e\u8fdb\u884c\u7f51\u7edc\u5b9a\u4f4d--&gt;<br> &nbsp; &nbsp;&lt;uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\" \/&gt;<br> &nbsp; &nbsp;&lt;!--\u7528\u4e8e\u83b7\u53d6 wifi \u7684\u83b7\u53d6\u6743\u9650\uff0cwifi \u4fe1\u606f\u4f1a\u7528\u6765\u8fdb\u884c\u7f51\u7edc\u5b9a\u4f4d--&gt;<br> &nbsp; &nbsp;&lt;uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\" \/&gt;<br> &nbsp; &nbsp;&lt;!--\u7528\u4e8e\u8bfb\u53d6\u624b\u673a\u5f53\u524d\u7684\u72b6\u6001--&gt;<br> &nbsp; &nbsp;&lt;uses-permission android:name=\"android.permission.READ_PHONE_STATE\" \/&gt;<br> &nbsp; &nbsp;&lt;!--\u7528\u4e8e\u5199\u5165\u7f13\u5b58\u6570\u636e\u5230\u6269\u5c55\u5b58\u50a8\u5361--&gt;<br> &nbsp; &nbsp;&lt;uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\" \/&gt;<br> &nbsp;  +++++<br> &nbsp;  ....<br>&lt;\/manifest&gt; &nbsp; &nbsp;<\/pre>\n\n\n\n<p>\u914d\u7f6e <code>project\\android\\app\\build.gradle<\/code> \u6587\u4ef6<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">android {<br>    ...<br>    +++<br>    signingConfigs {<br> &nbsp; &nbsp; &nbsp;  release {\/\/\u53d1\u5e03\u7248\u672c\u7684\u7b7e\u540d\u914d\u7f6e<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  storeFile file('test.keystore')<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  keyAlias \"demo01\" \/\/ \u548c\u8bc1\u4e66\u7684\u522b\u540d\u5bf9\u5e94<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  storePassword \"gongjian\"  \/\/ \u548c\u7b7e\u540d\u79c1\u94a5\u4e00\u81f4<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  keyPassword \"gongjian\" \/\/ \u548c\u7b7e\u540d\u79c1\u94a5\u4e00\u81f4<br> &nbsp; &nbsp; &nbsp;  }<br> &nbsp; &nbsp; &nbsp;  debug {\/\/\u8c03\u8bd5\u7248\u672c\u7684\u7b7e\u540d\u914d\u7f6e<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  storeFile file('test.keystore')<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  keyAlias \"demo01\" \/\/ \u548c\u8bc1\u4e66\u7684\u522b\u540d\u5bf9\u5e94<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  storePassword \"gongjian\"  \/\/ \u548c\u7b7e\u540d\u79c1\u94a5\u4e00\u81f4<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  keyPassword \"gongjian\" \/\/ \u548c\u7b7e\u540d\u79c1\u94a5\u4e00\u81f4<br> &nbsp; &nbsp; &nbsp;  }<br> &nbsp;  }<br> &nbsp;  buildTypes {<br> &nbsp; &nbsp; &nbsp;  release {<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  \/\/ TODO: Add your own signing config for the release build.<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  \/\/ Signing with the debug keys for now, so `flutter run --release` works.<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  signingConfig signingConfigs.debug<br> &nbsp; &nbsp; &nbsp;  }<br> &nbsp; &nbsp; &nbsp;  debug {<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  \/\/ TODO: Add your own signing config for the release build. <br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  \/\/ Signing with the debug keys for now, so `flutter run --release` works. <br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  signingConfig signingConfigs.debug<br> &nbsp; &nbsp; &nbsp;  }<br> &nbsp;  }<br>    +++<br>}<br>\u200b<br>dependencies {<br> &nbsp;  implementation('com.amap.api:location:5.2.0')<br>}<br><\/pre>\n\n\n\n<p><strong>\u6ce8\u610f\u9700\u8981\u5c06\u8bc1\u4e66\u590d\u5236\u5230<\/strong> <code>project\\android\\app<\/code> <strong>\u76ee\u5f55\u4e0b<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/gjweb.top\/wp-content\/uploads\/2024\/05\/01-1.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"245\" height=\"213\" data-original=\"https:\/\/gjweb.top\/wp-content\/uploads\/2024\/05\/01-1.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-980\"\/><\/div><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u5b89\u88c5\u9ad8\u5fb7\u5730\u56fe\u5b98\u65b9\u4f9d\u8d56\u8c03\u7528\u5b9a\u4f4dAPI<\/h2>\n\n\n\n<pre class=\"wp-block-preformatted\">amap_flutter_location: ^3.0.0<br>permission_handler: ^11.3.1<\/pre>\n\n\n\n<p>\u5728 <code>main.dart<\/code> \u4e2d\u4f7f\u7528<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">import 'dart:convert';<br>\u200b<br>import 'package:flutter\/material.dart';<br>import 'dart:async';<br>import 'dart:io';<br>import 'package:flutter\/material.dart';<br>import 'package:amap_flutter_location\/amap_flutter_location.dart';<br>import 'package:amap_flutter_location\/amap_location_option.dart';<br>import 'package:permission_handler\/permission_handler.dart';<br>\u200b<br>\u200b<br>class PageComponent extends StatefulWidget {<br> \u00a0const PageComponent({super.key});<br>\u200b<br> \u00a0@override<br> \u00a0State&lt;PageComponent> createState() => _PageComponentState();<br>}<br>\u200b<br>class _PageComponentState extends State&lt;PageComponent> {<br> \u00a0\/**\u83b7\u53d6\u6570\u636e *\/<br> \u00a0Map&lt;String, Object>? _locationResult;<br> \u00a0\/**\u76d1\u542c\u5b9a\u4f4d *\/<br> \u00a0StreamSubscription&lt;Map&lt;String, Object>>? _locationListener;<br> \u00a0\/**\u5b9e\u4f8b\u5316\u63d2\u4ef6 *\/<br> \u00a0AMapFlutterLocation _locationPlugin = new AMapFlutterLocation();<br>\u200b<br> \u00a0@override<br> \u00a0void initState() {<br> \u00a0 \u00a0super.initState();<br> \u00a0 \u00a0\/\/\/ \u52a8\u6001\u7533\u8bf7\u5b9a\u4f4d\u6743\u9650<br> \u00a0 \u00a0requestPermission();<br> \u00a0 \u00a0\/\/\/ [hasShow] \u9690\u79c1\u6743\u653f\u7b56\u662f\u5426\u5f39\u7a97\u5c55\u793a\u544a\u77e5\u7528\u6237<br> \u00a0 \u00a0AMapFlutterLocation.updatePrivacyShow(true, true);<br> \u00a0 \u00a0\/\/\/ [hasAgree] \u9690\u79c1\u6743\u653f\u7b56\u662f\u5426\u5df2\u7ecf\u53d6\u5f97\u7528\u6237\u540c\u610f<br> \u00a0 \u00a0AMapFlutterLocation.updatePrivacyAgree(true);<br> \u00a0 \u00a0AMapFlutterLocation.setApiKey(\"\u5b89\u5353\u7684key\", \"ios\u7684key\");<br> \u00a0 \u00a0\/\/\/\u6ce8\u518c\u5b9a\u4f4d\u7ed3\u679c\u76d1\u542c<br> \u00a0 \u00a0_locationListener = _locationPlugin.onLocationChanged().listen((Map&lt;String, Object> result) {<br> \u00a0 \u00a0 \u00a0setState(() {<br> \u00a0 \u00a0 \u00a0 \u00a0_locationResult = result;<br> \u00a0 \u00a0  });<br> \u00a0 \u00a0 \u00a0print(\"\u5b9a\u4f4d\u5f00\u542f\u6210\u529f ${json.encode(result)}\");<br> \u00a0  });<br>  }<br>\u200b<br> \u00a0\/\/\/ \u52a8\u6001\u7533\u8bf7\u5b9a\u4f4d\u6743\u9650<br> \u00a0void requestPermission() async {<br> \u00a0 \u00a0\/\/ \u7533\u8bf7\u6743\u9650<br> \u00a0 \u00a0bool hasLocationPermission = await requestLocationPermission();<br> \u00a0 \u00a0if (hasLocationPermission) {<br> \u00a0 \u00a0 \u00a0print(\"\u5b9a\u4f4d\u6743\u9650\u7533\u8bf7\u901a\u8fc7\");<br> \u00a0  } else {<br> \u00a0 \u00a0 \u00a0print(\"\u5b9a\u4f4d\u6743\u9650\u7533\u8bf7\u4e0d\u901a\u8fc7\");<br> \u00a0  }<br>  }<br> \u00a0\/\/ \u7533\u8bf7\u5b9a\u4f4d\u6743\u9650<br> \u00a0\/\/\/ \u6388\u4e88\u5b9a\u4f4d\u6743\u9650\u8fd4\u56detrue\uff0c \u5426\u5219\u8fd4\u56defalse<br> \u00a0Future&lt;bool> requestLocationPermission() async {<br> \u00a0 \u00a0\/\/\u83b7\u53d6\u5f53\u524d\u7684\u6743\u9650<br> \u00a0 \u00a0var status = await Permission.location.status;<br> \u00a0 \u00a0if (status == PermissionStatus.granted) {<br> \u00a0 \u00a0 \u00a0\/\/\u5df2\u7ecf\u6388\u6743<br> \u00a0 \u00a0 \u00a0return true;<br> \u00a0  } else {<br> \u00a0 \u00a0 \u00a0\/\/\u672a\u6388\u6743\u5219\u53d1\u8d77\u4e00\u6b21\u7533\u8bf7<br> \u00a0 \u00a0 \u00a0status = await Permission.location.request();<br> \u00a0 \u00a0 \u00a0if (status == PermissionStatus.granted) {<br> \u00a0 \u00a0 \u00a0 \u00a0return true;<br> \u00a0 \u00a0  } else {<br> \u00a0 \u00a0 \u00a0 \u00a0return false;<br> \u00a0 \u00a0  }<br> \u00a0  }<br>  }<br>\u200b<br> \u00a0\/\/ \u5f00\u542f\u5b9a\u4f4d<br> \u00a0void _startLocation() {<br> \u00a0 \u00a0\/\/\/\u5f00\u59cb\u5b9a\u4f4d\u4e4b\u524d\u8bbe\u7f6e\u5b9a\u4f4d\u53c2\u6570<br> \u00a0 \u00a0\/\/ _setLocationOption();<br> \u00a0 \u00a0_locationPlugin.startLocation();<br>  }<br>\u200b<br> \u00a0\/\/ \u505c\u6b62\u5b9a\u4f4d<br> \u00a0void _stopLocation() {<br> \u00a0 \u00a0_locationPlugin.stopLocation();<br>  }<br>\u200b<br> \u00a0@override<br> \u00a0Widget build(BuildContext context) {<br> \u00a0 \u00a0return Scaffold(<br> \u00a0 \u00a0 \u00a0appBar: AppBar(title: const Text(\"PageComponent\u9875\u9762\")),<br> \u00a0 \u00a0 \u00a0body:Container(<br> \u00a0 \u00a0 \u00a0 \u00a0child: Column(<br> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0children: [<br> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0ElevatedButton(onPressed: (){_startLocation();}, child: Text(\"\u5f00\u542f\u5b9a\u4f4d\")),<br> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0ElevatedButton(onPressed: (){_stopLocation();}, child: Text(\"\u5173\u95ed\u5b9a\u4f4d\")),<br> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0Text(\"\u5b9a\u4f4d\u7ed3\u679c\uff1a${_locationResult.toString()}\"),<br> \u00a0 \u00a0 \u00a0 \u00a0  ],<br> \u00a0 \u00a0 \u00a0  ),<br> \u00a0 \u00a0  )<br> \u00a0  );<br>  }<br>}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>\u8fd0\u884c\u793a\u4f8b<\/strong><\/h3>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/gjweb.top\/wp-content\/uploads\/2024\/05\/04.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"551\" height=\"981\" data-original=\"https:\/\/gjweb.top\/wp-content\/uploads\/2024\/05\/04.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-977\"  sizes=\"auto, (max-width: 551px) 100vw, 551px\" \/><\/div><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>flutter \u547d\u4ee4\u884c\u65b9\u5f0f\u751f\u6210\u7b7e\u540d\u8bc1\u4e66 \u9700\u8981\u5bf9\u73b0\u6709 app \u8fdb\u884c\u6253\u5305\uff0c\u7136\u540e\u67e5\u770b\u5f53\u524d\u5305\u7684\u8bc1\u4e66\u4fe1\u606f flutter [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[63],"tags":[],"class_list":["post-973","post","type-post","status-publish","format-standard","hentry","category-flutter"],"_links":{"self":[{"href":"https:\/\/gjweb.top\/index.php?rest_route=\/wp\/v2\/posts\/973","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gjweb.top\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/gjweb.top\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/gjweb.top\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/gjweb.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=973"}],"version-history":[{"count":3,"href":"https:\/\/gjweb.top\/index.php?rest_route=\/wp\/v2\/posts\/973\/revisions"}],"predecessor-version":[{"id":986,"href":"https:\/\/gjweb.top\/index.php?rest_route=\/wp\/v2\/posts\/973\/revisions\/986"}],"wp:attachment":[{"href":"https:\/\/gjweb.top\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=973"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/gjweb.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=973"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/gjweb.top\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=973"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}