問題: setState是從新渲染和以前有區別的widget,有時候會遇到一些flutter識別不出來widget已經改變的狀況
場景描述: 解決問題的場景是:一個StatefulWidget A裏面使用了另外一個StatefulWidget B時,更新B時區別未識別
解決辦法: 將B移入A,即一個界面變成一個StatefulWidgetandroid
問題: Scaffold.of() called with a context that does not contain a Scaffold. No Scaffold ancestor could be found starting from the context that was passed to Scaffold.of(). This usually happens when the context provided is from the same StatefulWidget as that whose build function actually creates the Scaffold widget being sought. There are several ways to avoid this problem. The simplest is to use a Builder to get a context that is 「under」 the Scaffold. For an example of this, please see the documentation for Scaffold.of(): .
解決辦法:
方法一: 將報錯的widget從原來的類移出來,從新寫一個StatelessWidget或者StatefulWidget的類,其中build函數將原widget放入Scaffold中來寫。若是進一步有報錯講h<infinity,即高度無限,將Scaffold放入一個有高度限制的Container便可。
方法二: 使用GlobalKey,下面以SnackBar做爲例子git
class _MyHomePageState extends State<MyHomePage> {
final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>();
@override
Widget build(BuildContext context) {
return Scaffold(
key: _scaffoldKey,
複製代碼
_scaffoldKey.currentState.showSnackBar(
SnackBar(
content: Text('Assign a GlobalKey to the Scaffold'),
duration: Duration(seconds: 3),
));
複製代碼
報錯:github
FAILURE: Build failed with an exception.
* What went wrong:
> no meothd jcenter found for root build.gradle
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
BUILD FAILED
複製代碼
build.gradle文件:bash
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.2.1'
}
}
allprojects {
repositories {
google()
jcenter()
}
}
rootProject.buildDir = '../build'
subprojects {
project.buildDir = "${rootProject.buildDir}/${project.name}"
}
subprojects {
project.evaluationDependsOn(':app')
}
task clean(type: Delete) {
delete rootProject.buildDir
}
複製代碼
場景描述: 從新安裝AS以後構建項目時報的錯
解決方案: 使用新安裝的AS從新建立一個flutter項目,而後將裏面對應的build.gradle內容拷貝過來替換。在本例中,替換的內容爲:app
buildscript {
ext.kotlin_version = '1.2.71'
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.2.1'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
allprojects {
repositories {
google()
jcenter()
}
}
rootProject.buildDir = '../build'
subprojects {
project.buildDir = "${rootProject.buildDir}/${project.name}"
}
subprojects {
project.evaluationDependsOn(':app')
}
task clean(type: Delete) {
delete rootProject.buildDir
}
複製代碼
第一步,先要生成簽名的apk,方式是,打開flutter的android module,build成功後,按照下圖點擊,記住jks文件密碼和位置 less
第二步,打開終端,欲獲得調試版本的SHA1,運行(注意須要安裝了jdk)異步
cd C:\Users\18056\.android
keytool -list -v -keystore debug.keystore
複製代碼
欲獲得發佈版本的SHA1,運行ide
keytool -list -v -keystore (第一步生成的jks文件地址)
複製代碼
SHA1顯示以下 函數
問題: TextField控件輸入內容後,點擊屏幕其它地方,內容被清空
場景:封裝全部信息輸入框爲一個類,控制器所有在構建函數時新建
解決: 將TextEditingController放在類外便可佈局
很好的ui設計模板:
裏面精美界面多,並且有三篇填坑文章 github.com/simplezhli/…
區分margin,padding,aligment:
margin:與同級控件之間的位置關係
padding:與父控件之間位置關係
aligment:子控件與本身的位置關係
不要想着statelessWidget有方法實現setState
以前嘗試過有狀態類監聽無狀態類變量判斷是否setState,後面發現存在異步問題,此方法不可行
問題: gradle contains unsupport kotlin plugins
場景:flutter 打開android module,build時候
解決: 緣由是IDE的kotlin version和build gradle中的kotlin version不一致,as的解決辦法是file-->settings-->languagexx-->查看IDE的kotlin版本,而後打開project下面的build gradle,將kotlin version修改爲一致的
問題: flutter 調試的時候和release版本的起始頁不一致
解決: 在使用AS debug的時候,本身指定了起始頁,即main函數入口,可是release版本的入口就是main.dart文件
問題: debug版本顯示的界面和release版本顯示界面不一致
解決: google以後發現是由於有一些變量聲明在類外,release編譯的時候會自動忽視這些聲明,應當寫在類內
問題: debug版本顯示的界面和release版本顯示界面不一致
解決: google以後發現是由於有一些變量聲明在類外,release編譯的時候會自動忽視這些聲明,應當寫在類內,
問題: 更新了iconfont.tff文件,也從新packages get了,可是圖標獲取不到 解決: 中止代碼運行,flutter clean以後再次運行,若是是assets加了一個圖片則不須要
問題: column中的widgets沒法居中對齊 解決: widgets中取消使用stack佈局便可,再添加
crossAxisAlignment: CrossAxisAlignment.center,
複製代碼