<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Flutter on Dapeng Zhang</title><link>https://zhangdapeng.dev/tags/flutter/</link><description>Recent content in Flutter on Dapeng Zhang</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Tue, 05 Aug 2025 09:48:37 +0000</lastBuildDate><atom:link href="https://zhangdapeng.dev/tags/flutter/index.xml" rel="self" type="application/rss+xml"/><item><title>学习Flutter必须知道的资源</title><link>https://zhangdapeng.dev/p/xue-xi-flutter-bi-xu-zhi-dao-de-zi-yuan/</link><pubDate>Tue, 05 Aug 2025 09:48:37 +0000</pubDate><guid>https://zhangdapeng.dev/p/xue-xi-flutter-bi-xu-zhi-dao-de-zi-yuan/</guid><description>&lt;p&gt;flutter 社区&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://flutter.dev/community" target="_blank" rel="noopener"
 &gt;https://flutter.dev/community&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;flutter 文档&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://flutter.dev/docs" target="_blank" rel="noopener"
 &gt;https://flutter.dev/docs&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Flutter新版本发布 - 1.20 Release: Flutter&amp;#039;s biggest release yet!</title><link>https://zhangdapeng.dev/p/flutter-xin-ban-ben-fa-bu-120-release-flutter039s-biggest-release-yet/</link><pubDate>Tue, 05 Aug 2025 09:48:15 +0000</pubDate><guid>https://zhangdapeng.dev/p/flutter-xin-ban-ben-fa-bu-120-release-flutter039s-biggest-release-yet/</guid><description>&lt;p&gt;1.20 Release: Flutter&amp;rsquo;s biggest release yet! Performance improvements, mobile autofill, a new widget, and more!&lt;/p&gt;
&lt;h1 id="announcing-flutter-120"&gt;Announcing Flutter 1.20
&lt;/h1&gt;&lt;h2 id="performance-improvements-mobile-autofill-a-new-widget-and-more"&gt;Performance improvements, mobile autofill, a new widget and more!
&lt;/h2&gt;&lt;p&gt;时间：Aug 5, 2020&lt;/p&gt;
&lt;p&gt;作者：Chris Sells&lt;/p&gt;
&lt;p&gt;原文链接点击&lt;a class="link" href="https://medium.com/flutter/announcing-flutter-1-20-2aaf68c89c75" target="_blank" rel="noopener"
 &gt;这里&lt;/a&gt;&lt;/p&gt;</description></item><item><title>VS Code开发Flutter App - 创建无限滚动ListView</title><link>https://zhangdapeng.dev/p/vs-code-kai-fa-flutter-app-chuang-jian-wu-xian-gun-dong-listview/</link><pubDate>Fri, 01 Aug 2025 10:32:10 +0000</pubDate><guid>https://zhangdapeng.dev/p/vs-code-kai-fa-flutter-app-chuang-jian-wu-xian-gun-dong-listview/</guid><description>&lt;p&gt;本次分享将展开RandomWordsState以生成并显示单词对的列表。当用户滚动时，ListView小部件中显示的列表会无限增长。ListView的构建器工厂构造函数允许您根据需要懒惰地构建列表视图。&lt;/p&gt;
&lt;h2 id="第一步将_suggestions列表添加到randomwordsstate类以保存建议的单词对另外添加一个biggerfont变量来使字体更大"&gt;第一步、将_suggestions列表添加到RandomWordsState类以保存建议的单词对。另外，添加一个biggerFont变量来使字体更大。
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;**Tips** 带有下划线前缀的标识符在Dart语言中会被强制进行隐私处理&lt;/strong&gt;。添加的代码如下&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-dart" data-lang="dart"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;RandomWordsState&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;extends&lt;/span&gt; State&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;RandomWords&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; _suggestions &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;WordPair&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;[]; &lt;span style="color:#75715e"&gt;// 新加
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; _biggerFont &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; TextStyle(fontSize: &lt;span style="color:#ae81ff"&gt;18.0&lt;/span&gt;); &lt;span style="color:#75715e"&gt;// 新加
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;override
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Widget build(BuildContext context) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; wordPair &lt;span style="color:#f92672"&gt;=&lt;/span&gt; WordPair.random();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; Text(wordPair.asCamelCase);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;下一步添加一个_buildSuggestions()方法到RandomwordsState类中，这个方法创建ListView，用来显示建议单词对.&lt;/p&gt;
&lt;p&gt;ListView类提供了一个构建器属性itemBuilder，它是一个工厂构建器和指定为匿名函数的回调函数。&lt;br&gt;
两个参数传递给函数 - BuildContext和行迭代器i。&lt;br&gt;
迭代器从0开始，每次调用函数时递增，对于每个建议的单词配对一次。&lt;br&gt;
此模型允许建议的列表在用户滚动时无限增长。&lt;/p&gt;
&lt;h2 id="第二步添加完整的_buildsuggestions方法到randomwordsstate类中"&gt;第二步、添加完整的_buildSuggestions()方法到RandomwordsState类中
&lt;/h2&gt;&lt;p&gt;代码如下&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-dart" data-lang="dart"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;RandomWordsState&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;extends&lt;/span&gt; State&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;RandomWords&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; _suggestions &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;WordPair&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;[];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; _biggerFont &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; TextStyle(fontSize: &lt;span style="color:#ae81ff"&gt;18.0&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Widget _buildSuggestions() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; ListView.builder(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; padding: &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; EdgeInsets.all(&lt;span style="color:#ae81ff"&gt;16.0&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; itemBuilder: (context, i) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (i.isOdd) &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; Divider();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; index &lt;span style="color:#f92672"&gt;=&lt;/span&gt; i &lt;span style="color:#f92672"&gt;~/&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (index &lt;span style="color:#f92672"&gt;&amp;gt;=&lt;/span&gt; _suggestions.length) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _suggestions.addAll(generateWordPairs().take(&lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; _buildRow(_suggestions[index]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;override
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Widget build(BuildContext context) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; wordPair &lt;span style="color:#f92672"&gt;=&lt;/span&gt; WordPair.random();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; Text(wordPair.asCamelCase);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;_buildSuggestions()函数每个单词对调用一次_buildRow()。此函数在ListTile中显示每个新对，可以在下一步中使行更具吸引力。&lt;/p&gt;
&lt;h2 id="第三步添加_buildrow-到randomwordsstate类中"&gt;第三步、添加_buildRow() 到RandomWordsState类中
&lt;/h2&gt;&lt;p&gt;完整代码如下&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-dart" data-lang="dart"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;RandomWordsState&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;extends&lt;/span&gt; State&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;RandomWords&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; _suggestions &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;WordPair&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;[];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; _biggerFont &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; TextStyle(fontSize: &lt;span style="color:#ae81ff"&gt;18.0&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Widget _buildSuggestions() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; ListView.builder(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; padding: &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; EdgeInsets.all(&lt;span style="color:#ae81ff"&gt;16.0&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; itemBuilder: (context, i) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (i.isOdd) &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; Divider();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; index &lt;span style="color:#f92672"&gt;=&lt;/span&gt; i &lt;span style="color:#f92672"&gt;~/&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (index &lt;span style="color:#f92672"&gt;&amp;gt;=&lt;/span&gt; _suggestions.length) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _suggestions.addAll(generateWordPairs().take(&lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; _buildRow(_suggestions[index]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Widget _buildRow(WordPair wordPair) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; ListTile(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; title: Text(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; wordPair.asPascalCase,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; style: _biggerFont,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;override
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Widget build(BuildContext context) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; wordPair &lt;span style="color:#f92672"&gt;=&lt;/span&gt; WordPair.random();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; Text(wordPair.asCamelCase);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="第四步更新randomwordsstate的构建方法以使用_buildsuggestions而不是直接调用单词生成库脚手架实现了基本的material-design视觉布局"&gt;第四步、更新RandomWordsState的构建方法以使用_buildSuggestions()，而不是直接调用单词生成库。（脚手架实现了基本的Material Design视觉布局）
&lt;/h2&gt;&lt;p&gt;完整代码如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-dart" data-lang="dart"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;RandomWordsState&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;extends&lt;/span&gt; State&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;RandomWords&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; _suggestions &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;WordPair&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;[];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; _biggerFont &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; TextStyle(fontSize: &lt;span style="color:#ae81ff"&gt;18.0&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Widget _buildSuggestions() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; ListView.builder(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; padding: &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; EdgeInsets.all(&lt;span style="color:#ae81ff"&gt;16.0&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; itemBuilder: (context, i) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (i.isOdd) &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; Divider();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; index &lt;span style="color:#f92672"&gt;=&lt;/span&gt; i &lt;span style="color:#f92672"&gt;~/&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (index &lt;span style="color:#f92672"&gt;&amp;gt;=&lt;/span&gt; _suggestions.length) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _suggestions.addAll(generateWordPairs().take(&lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; _buildRow(_suggestions[index]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Widget _buildRow(WordPair wordPair) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; ListTile(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; title: Text(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; wordPair.asPascalCase,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; style: _biggerFont,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;override
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Widget build(BuildContext context) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; Scaffold(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; appBar: AppBar(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; title: Text(&lt;span style="color:#e6db74"&gt;&amp;#39;启动一个生成器&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; body: _buildSuggestions(),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="第五步更新myapp的构建方法更改标题并将home更改为randomwords小部件"&gt;第五步、更新MyApp的构建方法，更改标题，并将home更改为RandomWords小部件
&lt;/h2&gt;&lt;p&gt;使用下面突出显示的构建方法替换原始方法：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-dart" data-lang="dart"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;MyApp&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;extends&lt;/span&gt; StatelessWidget {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;override
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Widget build(BuildContext context) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; MaterialApp(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; title: &lt;span style="color:#e6db74"&gt;&amp;#39;启动一个生成器 - Gowhich&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; home: RandomWords(),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="第六步重启应用"&gt;第六步、重启应用
&lt;/h2&gt;&lt;p&gt;无论你滚动多远，你都应该看到一个单词配对列表。如下图&lt;/p&gt;
&lt;p&gt;{% img &lt;a class="link" href="https://res.cloudinary.com/dy5dvcuc1/image/upload/v1536274634/xiaorongmao/xrm_web_23_1.png" target="_blank" rel="noopener"
 &gt;https://res.cloudinary.com/dy5dvcuc1/image/upload/v1536274634/xiaorongmao/xrm_web_23_1.png&lt;/a&gt; &amp;quot;&amp;quot; %}&lt;/p&gt;</description></item><item><title>VS Code开发Flutter App - 添加有状态小部件篇</title><link>https://zhangdapeng.dev/p/vs-code-kai-fa-flutter-app-tian-jia-you-zhuang-tai-xiao-bu-jian-pian/</link><pubDate>Fri, 01 Aug 2025 10:31:52 +0000</pubDate><guid>https://zhangdapeng.dev/p/vs-code-kai-fa-flutter-app-tian-jia-you-zhuang-tai-xiao-bu-jian-pian/</guid><description>&lt;p&gt;无状态小部件是不可变的，这意味着它们的属性不能改变 - 所有值都是最终的。&lt;/p&gt;
&lt;p&gt;有状态窗口小部件维护可能在窗口小部件生命周期内发生更改的状态。&lt;br&gt;
实现有状态窗口小部件至少需要两个类：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;一个StatefulWidget类，它创建一个2)State类的实例。&lt;br&gt;
&lt;code&gt;StatefulWidget&lt;/code&gt;类本身是不可变的，但State类在窗口小部件的生命周期内持久存在。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;在此步骤中，将添加一个有状态窗口小部件&lt;code&gt;RandomWords&lt;/code&gt;，它创建其State类，RandomWordsState。然后，我们将使用&lt;code&gt;RandomWords&lt;/code&gt;作为现有MyApp无状态组件&lt;/p&gt;
&lt;h3 id="创建一个最小的状态类"&gt;创建一个最小的状态类。
&lt;/h3&gt;&lt;p&gt;将以下内容添加到main.dart的底部：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-dart" data-lang="dart"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;RandomWordsState&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;extends&lt;/span&gt; State&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;RandomWords&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;注意声明&lt;code&gt;State&amp;lt;RandomWords&amp;gt;&lt;/code&gt;。&lt;br&gt;
这表明我们正在使用专门用于RandomWords的通用State类。&lt;br&gt;
应用程序的大多数逻辑和状态都驻留在这里 - 它维护RandomWords小部件的状态。&lt;br&gt;
当用户通过切换图标从列表中添加或删除它们时，此类保存生成的单词对，这些单词对随着用户滚动而无限增长，并且最喜欢的单词对（在第2部分中）。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;RandomWordsState&lt;/code&gt;依赖于RandomWords类。接下来会添加它。&lt;/p&gt;
&lt;h3 id="将有状态的randomwords小部件添加到maindart除了创建state类之外randomwords小部件几乎没有其他功能"&gt;将有状态的&lt;code&gt;RandomWords&lt;/code&gt;小部件添加到main.dart。除了创建State类之外，RandomWords小部件几乎没有其他功能：
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-dart" data-lang="dart"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;RandomWords&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;extends&lt;/span&gt; StatefulWidget {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;override
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; RandomWordsState createState() &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; RandomWordsState();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;添加状态类后，IDE会抱怨该类缺少构建方法。&lt;br&gt;
接下来，将添加一个基本构建方法，通过将单词生成代码从MyApp移动到RandomWordsState来生成单词对。&lt;/p&gt;
&lt;h3 id="将build方法添加到randomwordsstate"&gt;将build()方法添加到RandomWordsState：
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-dart" data-lang="dart"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;RandomWordsState&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;extends&lt;/span&gt; State&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;RandomWords&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;override
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Widget build(BuildContext context) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; wordPair &lt;span style="color:#f92672"&gt;=&lt;/span&gt; WordPair.random();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; Text(wordPair.asCamelCase);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="从myapp中删除单词生成代码"&gt;从MyApp中删除单词生成代码：
&lt;/h3&gt;&lt;p&gt;删除MyApp中的如下代码&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-dart" data-lang="dart"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; wordPair &lt;span style="color:#f92672"&gt;=&lt;/span&gt; WordPair.random();
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;同时将如下代码&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-dart" data-lang="dart"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;child: Text(wordPair.asCamelCase),
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;替换为&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-dart" data-lang="dart"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;child: RandomWords(),
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="重启应用"&gt;重启应用。
&lt;/h3&gt;&lt;p&gt;应用程序应该像以前一样运行，每次热重新加载或保存应用程序时都会显示一个单词配对。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;**Tips**&lt;/strong&gt;&lt;br&gt;
如果您在热重新加载时看到以下警告，请考虑重新启动应用程序：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Reloading…
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Some program elements were changed during reload but did not run when the view was reassembled; you may need to restart the app &lt;span style="color:#f92672"&gt;(&lt;/span&gt;by pressing “R”&lt;span style="color:#f92672"&gt;)&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; the changes to have an effect.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这可能是误报，但重新启动可确保您的更改反映在应用程序的UI中。&lt;/p&gt;</description></item><item><title>VS Code开发Flutter App - External Package篇</title><link>https://zhangdapeng.dev/p/vs-code-kai-fa-flutter-app-external-package-pian/</link><pubDate>Fri, 01 Aug 2025 10:31:46 +0000</pubDate><guid>https://zhangdapeng.dev/p/vs-code-kai-fa-flutter-app-external-package-pian/</guid><description>&lt;p&gt;本次分享将使用名为english_words的开源软件包，其中包含几千个最常用的英语单词和一些实用程序函数。可以在pub.dartlang.org上找到english_words包以及许多其他开源软件包。&lt;/p&gt;
&lt;h2 id="添加外部包"&gt;添加外部包
&lt;/h2&gt;&lt;p&gt;pubspec文件管理Flutter应用程序的资产和依赖项。&lt;br&gt;
打开VS Code，然后打开pubspec.yaml，在pubspec.yaml中，将english_words(3.1.0或更高版本)添加到依赖项列表中。&lt;br&gt;
添加下面突出显示的行：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;dependencies&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;flutter&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;sdk&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;flutter&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;cupertino_icons&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;^0.1.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;english_words&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;^3.1.0&lt;/span&gt; &lt;span style="color:#75715e"&gt;# 新加的一行&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="安装外部包"&gt;安装外部包
&lt;/h2&gt;&lt;p&gt;在VS Code中添加完此行后，会在输出窗口中看到如下输出，代表程序在更新并添加新的包&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;flutter_myapp&lt;span style="color:#f92672"&gt;]&lt;/span&gt; flutter packages get
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Running &lt;span style="color:#e6db74"&gt;&amp;#34;flutter packages get&amp;#34;&lt;/span&gt; in flutter_myapp...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;执行包也可以自动生成pubspec.lock文件，其中包含项目中所有包的列表及其版本号。&lt;/p&gt;
&lt;h2 id="使用外部包"&gt;使用外部包
&lt;/h2&gt;&lt;p&gt;打开&lt;code&gt;lib/main.dart&lt;/code&gt;文件, 导入新的包，代码如下:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-dart" data-lang="dart"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;package:english_words/english_words.dart&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在您键入时，VS Code会为您提供导入库的建议。&lt;br&gt;
然后它将导入字符串呈灰色，让您知道导入的库未使用（到目前为止）。&lt;/p&gt;
&lt;h2 id="修改代码"&gt;修改代码
&lt;/h2&gt;&lt;p&gt;使用英语单词包生成文本而不是使用字符串&amp;quot;Hello World&amp;quot;。&lt;br&gt;
进行以下更改：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-dart" data-lang="dart"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;package:flutter/material.dart&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;package:english_words/english_words.dart&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; main() &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; runApp(&lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; MyApp());
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;MyApp&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;extends&lt;/span&gt; StatelessWidget {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;override
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Widget build(BuildContext context) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; wordPair &lt;span style="color:#f92672"&gt;=&lt;/span&gt; WordPair.random(); &lt;span style="color:#75715e"&gt;// 新加代码
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; MaterialApp(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; title: &lt;span style="color:#e6db74"&gt;&amp;#39;Welcome to Flutter - Gowhich&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; home: Scaffold(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; appBar: AppBar(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; title: Text(&lt;span style="color:#e6db74"&gt;&amp;#39;Welcome to Flutter - Gowhich&amp;#39;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; body: Center(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; child: Text(wordPair.asCamelCase), &lt;span style="color:#75715e"&gt;// 新加代码
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;{% img &lt;a class="link" href="https://res.cloudinary.com/dy5dvcuc1/image/upload/v1535639188/xiaorongmao/xrm_web_16_1.png" target="_blank" rel="noopener"
 &gt;https://res.cloudinary.com/dy5dvcuc1/image/upload/v1535639188/xiaorongmao/xrm_web_16_1.png&lt;/a&gt; &amp;quot;&amp;quot; %}&lt;/p&gt;
&lt;p&gt;如果应用程序正在运行，请使用hot reload功能更新正在运行的应用程序。&lt;br&gt;
每次进行hot reload操作或保存项目时，应该在正在运行的应用程序中看到一个随机选择的不同单词对。&lt;br&gt;
这是因为单词配对是在构建方法中生成的，该方法在每次MaterialApp需要渲染时运行，或者在Flutter Inspector中切换平台时运行。&lt;/p&gt;</description></item><item><title>VS Code开发Flutter App - 配置篇</title><link>https://zhangdapeng.dev/p/vs-code-kai-fa-flutter-app-pei-zhi-pian/</link><pubDate>Fri, 01 Aug 2025 10:31:43 +0000</pubDate><guid>https://zhangdapeng.dev/p/vs-code-kai-fa-flutter-app-pei-zhi-pian/</guid><description>&lt;p&gt;VS Code开发Flutter App - 配置篇&lt;/p&gt;
&lt;h2 id="配置"&gt;配置
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;VS Code&lt;/strong&gt; - 具有Flutter运行和调试支持的轻量级编辑器&lt;/p&gt;
&lt;h3 id="安装-vs-code"&gt;安装 VS Code
&lt;/h3&gt;&lt;p&gt;&lt;a class="link" href="https://code.visualstudio.com/" target="_blank" rel="noopener"
 &gt;VS Code&lt;/a&gt;, 下载最新稳定版本&lt;/p&gt;
&lt;h3 id="安装flutter插件"&gt;安装Flutter插件
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;启动VS Code&lt;/li&gt;
&lt;li&gt;调用 View&amp;gt;Command Palette&lt;/li&gt;
&lt;li&gt;输入&amp;quot;install&amp;quot;，然后选择&amp;quot;Extensions：Install Extension&amp;quot;操作&lt;/li&gt;
&lt;li&gt;在搜索框中输入flutter，在列表中选择&amp;quot;Flutter&amp;quot;，然后单击&amp;quot;Install&amp;quot;&lt;/li&gt;
&lt;li&gt;选择&amp;quot;OK&amp;quot;以重新加载VS Code&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="使用flutter-doctor验证您的设置"&gt;使用Flutter Doctor验证您的设置
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;调用 View&amp;gt;Command Palette&lt;/li&gt;
&lt;li&gt;输入&amp;quot;doctor&amp;quot;，然后选择&amp;quot;Flutter：Run Flutter Doctor&amp;quot;操作&lt;/li&gt;
&lt;li&gt;查看&amp;quot;OUTPUT&amp;quot;窗口中的输出的信息，查看是否存在其他问题&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;做完以上几步，如果没有任何问题，就可以继续开发了，如果遇到问题，可以加群或者下面留言交流&lt;/p&gt;
&lt;h2 id="创建一个新的-flutter-app"&gt;创建一个新的 Flutter App
&lt;/h2&gt;&lt;p&gt;本次分享只是一个创建Flutter应用程序的分享。本次分享不需要具备太多技能，只要熟悉面向对象的代码和基本编程概念（如变量，循环和条件），下面的一些分享基本上你也可以完成。而且不需要以前有使用过Dart或移动编程的经验。&lt;/p&gt;
&lt;h3 id="创建新应用"&gt;创建新应用
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;启动 VS Code&lt;/li&gt;
&lt;li&gt;调用 View &amp;gt; Command Palette&lt;/li&gt;
&lt;li&gt;输入 &amp;ldquo;flutter&amp;rdquo;, 然后选择 &amp;ldquo;Flutter: New Project&amp;quot;操作&lt;/li&gt;
&lt;li&gt;输入一个项目名称，例如&amp;quot;flutter_myapp&amp;rdquo;, 然后按回车键&lt;/li&gt;
&lt;li&gt;为新项目目录创建或者选择一个父文件夹&lt;/li&gt;
&lt;li&gt;等待项目创建完成main.dart文件会出现&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Tips&lt;/strong&gt; 这里我在创建的时候遇到一个问题，就是创建是失败了，原因是因为很多Flutter要求的没有正常处理完。主要是在执行&amp;quot;flutter doctor&amp;quot;的时候有一些提示没有解决完，所以建议大家在操作的时候，尽量将&amp;quot;flutter doctor&amp;quot;的提示处理完。&lt;/p&gt;
&lt;h3 id="运行app"&gt;运行App
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;启动模拟器&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;运行之前先执行&lt;code&gt;open -a Simulator&lt;/code&gt;启动一个模拟器，我是在mac下执行的，如果你是在linux或者window下执行，建议也提前启动一个模拟器。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;调用 Debug &amp;gt; Start Debugging 或者按 F5&lt;/li&gt;
&lt;li&gt;等待App运行 - Debug命令行窗口会被打印出进度&lt;/li&gt;
&lt;li&gt;如果一切正常，应用程序构建完成后，将在设备上看到启动应用程序&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;&lt;img alt="小绒毛的足迹" class="gallery-image" data-flex-basis="123px" data-flex-grow="51" height="1212" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://res.cloudinary.com/dy5dvcuc1/image/upload/v1535554170/xiaorongmao/xrm_web_15_1.png" width="624"&gt;&lt;/p&gt;
&lt;h3 id="尝试hot-reload"&gt;尝试hot reload
&lt;/h3&gt;&lt;p&gt;Flutter提供快速开发周期和hot reload，能够重新加载实时运行的应用程序的代码，而无需重新启动或丢失应用程序状态。&lt;br&gt;
只需更改源代码，告诉IDE或命令行工具您要热重新加载，并查看模拟器，模拟器或设备中的更改。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;打开lib/main.dart&lt;/li&gt;
&lt;li&gt;修改字符串&amp;rsquo;You have pushed the button this many times:&amp;rsquo; 改为&amp;rsquo;You have clicked the button this many times:'&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Important&lt;/strong&gt;: 不要按停止按钮；让应用保持运行状态&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;保存更改: 调用 File &amp;gt; Save All, 或者点击R按钮来更新&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;你将立刻看到更新的字符串在运行的App上&lt;/p&gt;
&lt;p&gt;这一点我非常喜欢，以前开发app，每次改完都要重新启动一次，而且android或者ios重新编译一次耗时很久，电脑性能不好的话，还真的就只能干等着。&lt;/p&gt;
&lt;h3 id="更新libmaindart"&gt;更新lib/main.dart
&lt;/h3&gt;&lt;p&gt;删除lib/main.dart中的所有代码。替换为以下代码，在屏幕中央显示&amp;quot;Hello World&amp;quot;。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-dart" data-lang="dart"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;package:flutter/material.dart&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; main() &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; runApp(&lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; MyApp());
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;MyApp&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;extends&lt;/span&gt; StatelessWidget {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;override
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Widget build(BuildContext context) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; MaterialApp(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; title: &lt;span style="color:#e6db74"&gt;&amp;#39;Welcome to Flutter - Gowhich&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; home: Scaffold(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; appBar: AppBar(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; title: Text(&lt;span style="color:#e6db74"&gt;&amp;#39;Welcome to Flutter - Gowhich&amp;#39;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; body: Center(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; child: Text(&lt;span style="color:#e6db74"&gt;&amp;#34;Holle Flutter - Gowhich&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img alt="小绒毛的足迹" class="gallery-image" data-flex-basis="123px" data-flex-grow="51" height="1212" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://res.cloudinary.com/dy5dvcuc1/image/upload/v1535554170/xiaorongmao/xrm_web_15_2.png" width="624"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;总结&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;此示例创建一个Material应用程序。Material是一种视觉设计语言，是移动和Web上的标准语言。Flutter提供了丰富的Material小部件。&lt;/li&gt;
&lt;li&gt;main方法指定fat arrow(=&amp;gt;)表示法。对单行函数或方法使用(=&amp;gt;)表示法。&lt;/li&gt;
&lt;li&gt;该应用程序扩展了StatelessWidget，使应用程序本身成为一个小部件。在Flutter中，几乎所有东西都是一个小部件，包括对齐，填充和布局。&lt;/li&gt;
&lt;li&gt;Material库中的&amp;quot;Scaffold&amp;quot;窗口小部件提供默认的应用栏、标题和包含主屏幕窗口小部件树的主体属性。小部件子树可能非常复杂。&lt;/li&gt;
&lt;li&gt;小部件的主要工作是提供build()方法，该方法描述如何根据其他较低级别的小部件显示小部件。&lt;/li&gt;
&lt;li&gt;此示例的正文包含一个包含Text子窗口小部件的Center窗口小部件。&amp;ldquo;Center&amp;quot;窗口小部件将其窗口小部件子树与屏幕中心对齐。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;今天的分享就到这里。&lt;/p&gt;</description></item><item><title>Flutter入门之安装Flutter</title><link>https://zhangdapeng.dev/p/flutter-ru-men-zhi-an-zhuang-flutter/</link><pubDate>Fri, 01 Aug 2025 09:22:22 +0000</pubDate><guid>https://zhangdapeng.dev/p/flutter-ru-men-zhi-an-zhuang-flutter/</guid><description>&lt;p&gt;最近Flutter很火的样子，了解了一下，据说是比ReactNative方便开发，今天分享下如何安装&lt;/p&gt;
&lt;h2 id="1安装flutter"&gt;1、安装Flutter
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;系统要求&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;要安装和运行Flutter，您的开发环境必须满足以下最低要求：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Operating Systems: macOS (64-bit)&lt;/li&gt;
&lt;li&gt;Disk Space: 700 MB (does not include disk space for IDE/tools).&lt;/li&gt;
&lt;li&gt;Tools: Flutter取决于您的环境中可用的这些命令行工具.bash, mkdir, rm, git, curl, unzip, which&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;国内安装流程&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;export PUB_HOSTED_URL&lt;span style="color:#f92672"&gt;=&lt;/span&gt;https://pub.flutter-io.cn
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;export FLUTTER_STORAGE_BASE_URL&lt;span style="color:#f92672"&gt;=&lt;/span&gt;https://storage.flutter-io.cn
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git clone -b master https://github.com/flutter/flutter.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;export PATH&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$PWD&lt;span style="color:#e6db74"&gt;/flutter/bin:&lt;/span&gt;$PATH&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd ./flutter
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;运行以下命令以查看是否需要安装任何依赖项才能完成设置：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;flutter doctor
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;安装过程中会遇到类似下面的问题&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Because flutter_tools depends on file_testing 2.0.3 which doesn&lt;span style="color:#e6db74"&gt;&amp;#39;t match any versions, version solving failed.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;Error: Unable to &amp;#39;&lt;/span&gt;pub upgrade&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;#39;&lt;/span&gt; flutter tool. Retrying in five seconds... &lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;9&lt;/span&gt; tries left&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;要解决这个问题，多数是网络问题，设置下代理就好了，如下&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;export https_proxy&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;proxyserver&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;设置后再次执行&lt;code&gt;flutter doctor&lt;/code&gt;如果代理没有问题就可以正常安装了，执行完的结果类似如下&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ flutter doctor 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Building flutter tool...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ╔════════════════════════════════════════════════════════════════════════════╗
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ║ Welcome to Flutter! - https://flutter.io ║
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ║ ║
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ║ The Flutter tool anonymously reports feature usage statistics and crash ║
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ║ reports to Google in order to help Google contribute improvements to ║
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ║ Flutter over time. ║
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ║ ║
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ║ Read about data we send with crash reports: ║
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ║ https://github.com/flutter/flutter/wiki/Flutter-CLI-crash-reporting ║
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ║ ║
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ║ See Google&lt;span style="color:#e6db74"&gt;&amp;#39;s privacy policy: ║
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; ║ https://www.google.com/intl/en/policies/privacy/ ║
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; ║ ║
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; ║ Use &amp;#34;flutter config --no-analytics&amp;#34; to disable analytics and crash ║
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; ║ reporting. ║
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; ╚════════════════════════════════════════════════════════════════════════════╝
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;Flutter assets will be downloaded from https://storage.flutter-io.cn. Make sure you trust this source!
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;Downloading Material fonts... 5.1s
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;Downloading package sky_engine... 4.5s
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;Downloading common tools... 20.8s
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;Downloading darwin-x64 tools... 77.2s
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;Downloading android-arm-profile/darwin-x64 tools... 6.6s
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;Downloading android-arm-release/darwin-x64 tools... 5.3s
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;Downloading android-arm64-profile/darwin-x64 tools... 5.5s
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;Downloading android-arm64-release/darwin-x64 tools... 6.6s
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;Downloading android-x86 tools... 23.6s
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;Downloading android-x64 tools... 15.0s
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;Downloading android-arm tools... 9.4s
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;Downloading android-arm-profile tools... 6.9s
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;Downloading android-arm-release tools... 12.8s
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;Downloading android-arm64 tools... 7.3s
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;Downloading android-arm64-profile tools... 7.8s
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;Downloading android-arm64-release tools... 5.7s
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;Downloading android-arm-dynamic-profile tools... 7.4s
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;Downloading android-arm-dynamic-release tools... 5.4s
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;Downloading android-arm64-dynamic-profile tools... 6.8s
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;Downloading android-arm64-dynamic-release tools... 6.2s
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;Downloading ios tools... 15.1s
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;Downloading ios-profile tools... 38.4s
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;Downloading ios-release tools... 14.4s
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;Downloading Gradle Wrapper... 1.4s
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;Doctor summary (to see all details, run flutter doctor -v):
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;[✓] Flutter (Channel master, v0.5.9-pre.83, on Mac OS X 10.12.6 16G1314, locale zh-Hans-CN)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;[✗] Android toolchain - develop for Android devices
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; ✗ Unable to locate Android SDK.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; Install Android Studio from: https://developer.android.com/studio/index.html
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; On first launch it will assist you in installing the Android SDK components.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; (or visit https://flutter.io/setup/#android-setup for detailed instructions).
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; If Android SDK has been installed to a custom location, set $ANDROID_HOME to that location.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;[!] iOS toolchain - develop for iOS devices (Xcode 9.0)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; ✗ libimobiledevice and ideviceinstaller are not installed. To install, run:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; brew install --HEAD libimobiledevice
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; brew install ideviceinstaller
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; ✗ ios-deploy not installed. To install:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; brew install ios-deploy
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; ! CocoaPods out of date (1.5.0 is recommended).
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; CocoaPods is used to retrieve the iOS platform side&amp;#39;&lt;/span&gt;s plugin code that responds to your plugin usage on the Dart side.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Without resolving iOS dependencies with CocoaPods, plugins will not work on iOS.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; For more info, see https://flutter.io/platform-plugins
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; To upgrade:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; brew upgrade cocoapods
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pod setup
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;✗&lt;span style="color:#f92672"&gt;]&lt;/span&gt; Android Studio &lt;span style="color:#f92672"&gt;(&lt;/span&gt;not installed&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;!&lt;span style="color:#f92672"&gt;]&lt;/span&gt; IntelliJ IDEA Ultimate Edition &lt;span style="color:#f92672"&gt;(&lt;/span&gt;version 2017.3.5&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ✗ Flutter plugin not installed; this adds Flutter specific functionality.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ✗ Dart plugin not installed; this adds Dart specific functionality.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;!&lt;span style="color:#f92672"&gt;]&lt;/span&gt; VS Code &lt;span style="color:#f92672"&gt;(&lt;/span&gt;version 1.26.1&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;!&lt;span style="color:#f92672"&gt;]&lt;/span&gt; Connected devices
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ! No devices available
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;! Doctor found issues in &lt;span style="color:#ae81ff"&gt;6&lt;/span&gt; categories.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;将Flutter永久添加到您的路径&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;为了在任何终端会话中都能运行flutter命令。&lt;br&gt;
通常，只需在打开新窗口时执行的文件中添加一行。&lt;br&gt;
例如：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;确定放置Flutter SDK的目录。您将在步骤3中使用此功能。&lt;/li&gt;
&lt;li&gt;打开（或创建）$HOME/.bash_profile或者$HOME~/.zshrc。您的计算机上的文件路径和文件名可能不同。&lt;/li&gt;
&lt;li&gt;添加以下行并将[PATH_TO_FLUTTER_GIT_DIRECTORY]更改为克隆Flutter的git repo的路径：&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;export PATH&lt;span style="color:#f92672"&gt;=[&lt;/span&gt;PATH_TO_FLUTTER_GIT_DIRECTORY&lt;span style="color:#f92672"&gt;]&lt;/span&gt;/flutter/bin:$PATH
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;运行&lt;code&gt;source $HOME/.bash_profile&lt;/code&gt;或&lt;code&gt;source $HOME/.zshrc&lt;/code&gt;刷新当前窗口.&lt;br&gt;
通过运行验证flutter/bin目录现在位于PATH中，如下&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo $PATH
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果输出有如下内容说明配置成功&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/xxx/xxx/flutter/bin:/xxx/xxx/xxxx/otherpath
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item></channel></rss>