解决:因为您正在使用的Java版本不受Gradle版本的支持,要么改java版本号要么改gradle版本
参考链接https://www.5axxw.com/questions/content/c4w11t
解决:该错误涉及到三方库permission_handler,
1.先把项目中引用库的版本号改为any
dependencies:
permission_handler: any
2.执行命令 flutter pub get
3.打开pubspec.lock文件,搜索permission_handler库的引用版本号如:
4.可以看到版本号实际引用的是9.0.2,那就把any改为^9.0.0就可以了
指示您的数组索引是从即0到7,但您正在尝试访问不存在的第8个索引的值
解决:flutteractivity导包不对
import io.flutter.embedding.android.FlutterActivity;
//import io.flutter.app.FlutterActivity;
public class MainActivity extends FlutterActivity {
}
比如,一加手机输入的运行频率为120hz,而显示屏的运行频率为90hz。滚动时,这种不匹配会导致性能下降,google团队通过以下的方法来解决此问题。
void main() {
GestureBinding.instance.resamplingEnabled = true;
run(MyApp());
}
修改前代码:
Scrollable(
axisDirection: AxisDirection.down,
viewportBuilder: (context, offset) {
return CustomScrollView(
scrollDirection: Axis.horizontal,
slivers: [
SliverFixedExtentList(
itemExtent: 100,
delegate: SliverChildBuilderDelegate(
(context, column) => ListTile(
title: Text('ddfds$column'),
),
childCount: 10,
),
)
]);
},
);
修改后代码:
Scrollable(
axisDirection: AxisDirection.down,
viewportBuilder: (context, offset) {
return NotificationListener(
// Suppress OverscrollNotification events that escape from the inner scrollable
onNotification: (notification) =>
notification.metrics.axisDirection != AxisDirection.down,
child: CustomScrollView(
scrollDirection: Axis.horizontal,
slivers: [
SliverFixedExtentList(
itemExtent: 100,
delegate: SliverChildBuilderDelegate(
(context, column) => ListTile(
title: Text('ddfds$column'),
),
childCount: 10,
),
)
]),
);
},
);
版本升级之后,爆了一堆莫名其妙的错误
1,删除项目中.idea
文件夹,build
文件夹,pubspec-lock
文件
2,运行命令 flutter pub get
G:\loansuper\loansuper\build\shared_preferences_android and C:\Users\*****\AppData\Local\Pub\Cache\hosted\pub.flutter-io.cn\shared_preferences_android-2.0.12\android.
原因:在Flutter中,Text组件是属于Material风格的,这就要求我们的根组件最好也是Material风格的,否则UI展示可能会有一些问题。刚刚提到的启动页,根组件直接使用的层叠布局Stack,而Stack就不属于Material风格,当Stack内部嵌套Text的时候就会出现文字下方带有两条黄色下划线的现象。
这个问题主要有两种方式解决:
1.修改根节点的组件类型为Scaffold或者Material
Scaffold(body: content,);
Material(child: content);
2.针对出现问题的Text组件,修改其style下的decoration属性为TextDecoration.none
child: Text(
"WENT",
style:TextStyle(color: Colors.white, decoration: TextDecoration.none),),
AGP 7.0.0-alpha02起需要使用Java 11
https://developers-jp.googleblog.com/2020/12/announcing-android-gradle-plugin.html
当Java版本不正确时,Gradle的sync阶段回报错如下:
需要注意gradle的Java版本并非AndroidStudio工程依赖的Java版本。
以Mac版本为例:AndroidStudio > Preferences... > Gradle
Execution failed for task ':app:processDebugMainManifest'.
> Manifest merger failed : android:exported needs to be explicitly specified for . Apps targeting Android 12 and higher are required to specify an explicit value for `android:exported` when the corresponding component has an intent filter defined. See https://developer.android.com/guide/topics/manifest/activity-element#exported for details.
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
解决:根据错误提示,targetSdkVersion大于等于SDK 21(也就是Android 12)时,如果有的Activity配置了Intent-filter,必须也同时配置exported属性,否则编译失败。
将Manifest中有配置Intent-filter的Activity加上android:exported属性
解决方案1:autoplay 设置为false,loop 也设置为false 就好了 需要自动轮播 用swiperController在生命周期里控制自动播放就行
解决方案2:给Swiper指定index之后 初始化时就不会乱滚了
Text想要展示一行,显示不下展示省略号,通常使用overflow: TextOverflow.ellipsis,
1.缺陷: 会将长字母或者数字串整体显示省略
例子: 分组YD-YXTJA-2102217-001113123123123123123,可能会显示成:分组YD-…
解决方案:将每个字符串之间插入零宽空格(推荐方式二写法)
方式一:
String breakWord(String word) {
if (word == null || word.isEmpty) {
return word;
}
String breakWord = ' ';
word.runes.forEach((element) {
breakWord += String.fromCharCode(element);
breakWord += '\u200B';
});
return breakWord;
}
调用
Text(
breakWord("YD-YXTJA-2102217-001113123123123123123"),
maxLines: 1,
overflow: TextOverflow.ellipsis,
)
方式二:
extension StringEllipsisExtensions on String? {
String get ellipsis {
return Characters(this ?? "")
.replaceAll(Characters(''), Characters('\u{200B}'))
.toString();
}
}
调用
Text(
"YD-YXTJA-2102217-001113123123123123123".ellipsis,
maxLines: 1,
overflow: TextOverflow.ellipsis,
)
2.Text 的 TextOverflow.ellipsis 不生效
有时候我们为 Text
设置 ellipsis ,却发现并没有生效,而是出现如下图左边提示 overflowed
的警告。
其实大部分时候,这是 Text
内部的 RenderParagraph
在判断 final bool didOverflowWidth = size.width < textSize.width;
时, size.width 和 textSize.width 是相等导致的。
所以你需要给 Text
设置一个 Container
之类的去约束它的大小,或者是 Row
中通过 Expanded
+ Container
去约束你的 Text
,如果不知道于应该多大,可以通过 LayoutBuilder
设置。
Another exception was thrown: The provided ScrollController is currently attached to more than one ScrollPosition.
解决: 给用到滚动的组件都建一个 controller, 就好了,如:
late ScrollController _pageScrollerController;
@override
void initState() {
super.initState();
_pageScrollerController = ScrollController();
realTimeBloc = RealTimeBloc();
}
@override
void dispose() {
realTimeBloc.close();
_pageScrollerController .dispose();
super.dispose();
}
ListView.builder(
controller: _pageScrollerController ,
shrinkWrap: true, //范围内进行包裹(内容多高ListView就多高)
physics: NeverScrollableScrollPhysics(),
itemCount: state.rechargemodel?.rechargeInfo?.length,
itemBuilder: (context, index) {
return _tableRechargeRowData(state.rechargemodel?.rechargeInfo?[index]);
},
),
背景:严格来说,这不是Flutter
范畴问题,但是确实是我在写Flutter
插件时遇到的,实际上是一个Android
问题,以此文做一个小小的备忘。最近在更新Fluwx[1],正好对分享文件的功能进行重构,然后需要对该功能进行测试,然后在Android
上会抛个异常:
java.io.FileNotFoundException: This file can not be opened as a file descriptor; it is probably compressed
然而我并没有压缩啊,以前分享asset
图片明明没问题啊!!!
重现:先看看我们是怎么引入的文件,在pubspec.yaml
中如下:
assets:
- assets/doc/fluwx.docx
讲道理,在iOS上可以正常分享,这基本可以断定不是Flutter
本身引起的问题。这就奇怪了,同样的方式引入图片都不会出现这样的问题,怎么我引入word
就会有这样的问题?
分析:首先,我们要知道Flutter
会打把assets
下的文件打包到Android
中的assets
中,具体为app/assets/flutter_assets/
。到这里,问题已经有眉目了。在apk
打包过程中,aapt
会选择性地对assets
下的文件进行压缩。下面摘抄的Package.cpp
的代码揭示了哪些格式的文件默认不会被压缩:
/* these formats are already compressed, or don't compress well */
static const char* kNoCompressExt[] = {
".jpg", ".jpeg", ".png", ".gif",
".wav", ".mp2", ".mp3", ".ogg", ".aac",
".mpg", ".mpeg", ".mid", ".midi", ".smf", ".jet",
".rtttl", ".imy", ".xmf", ".mp4", ".m4a",
".m4v", ".3gp", ".3gpp", ".3g2", ".3gpp2",
".amr", ".awb", ".wma", ".wmv"
};
解决:知道原因就很好解决了, 告诉aapt
不要压缩他。在你的Gradle
文件(android/app/build.gradle)中添加如下代码:
android {
aaptOptions {
noCompress "docx"
}
}
引用:Fluwx: https://github.com/OpenFlutter/fluwx
shrinkWrap: true, //解决无限高度问题
physics:NeverScrollableScrollPhysics(),//禁用滑动事件
可滑动控件都有这两个属性,给子滑动部件设置上这两个参数,即可办到子ListView跟随父ListView滑动
源码:
void clear() {
value = const TextEditingValue(selection: TextSelection.collapsed(offset: 0));
}
解决:再调用clear()方法后手动调用onChanged方法
如:
onTap: () {
widget.controller.clear();
widget.onChanged('');
}
一般情况下,实现字数统计方法如下:
TextField(
onChanged: (value){
setState(() {
_textFieldValue = value;
});
},
decoration: InputDecoration(
counterText: '${_textFieldValue.length}/32'
),
),
大部分情况下是没有问题的,但是在 IOS 简体拼音输入法下有问题(可能其他输入法也有类似的问题),效果如下:
中文输入法统计正在编辑中文的过程中会统计英文,假如限制5个中文,当输入4个中文后,最后一个中文输入2个及以上英文时,会触发最大字数限制,这当然不是我们想要的效果。
下面说下如何修复这个问题,关键是 TextField 中 「controller.value.composing」 这个属性,官方文档说明:The range of text that is still being composed.仍在编写的文本范围。
就是上面GIF中出现下划线的部分,字数统计计算:
TextEditingController _controller = TextEditingController();
int _wordLength = 0;
/// 计算字数,不算正在编辑的文字
void _computeWordCount() {
var valueLength = _controller.value.text.length;
var composingLength =
_controller.value.composing.end - _controller.value.composing.start;
setState(() {
_wordLength = valueLength - composingLength;
});
}
TextField(
controller: _controller,
onChanged: (value){
_computeWordCount();
},
decoration: InputDecoration(
counterText: '$_wordLength/32'
),
),
(注:目前方法1暂时可以居中)
解决方法1:
decoration: InputDecoration(
isCollapsed: true,
border: InputBorder.none,
)
解决方法2:
decoration: InputDecoration(
contentPadding: EdgeInsets.zero,
border: OutlineInputBorder(borderSide: BorderSide.none),
)
解决方法3:
设置contentPadding,它需要设置的值是根据 TextField的高度 和 文字高度共同决定的,公式是:( TextField的高度 - 文字高度)/2
我们需要计算出文字的高度:
///value: 文本内容;fontSize : 文字的大小;fontWeight:文字权重;maxWidth:文本框的最大宽度;maxLines:文本支持最大多少行 ;locale:当前手机语言;textScaleFactor:手机系统可以设置字体大小(默认1.0)
static double calculateTextHeight(fontSize,
{String value = '',
FontWeight fontWeight,
double maxWidth = double.infinity,
int maxLines = 1,
double textScaleFactor = 1.0 //字体缩放大小
}) {
TextPainter painter = TextPainter(
///AUTO:华为手机如果不指定locale的时候,该方法算出来的文字高度是比系统计算偏小的。
locale: WidgetsBinding.instance.window.locale,
maxLines: maxLines,
textDirection: TextDirection.ltr,
textScaleFactor: textScaleFactor,
text: TextSpan(
text: value,
style: TextStyle(
fontWeight: fontWeight,
fontSize: fontSize,
)));
painter.layout(maxWidth: maxWidth);
///文字的宽度:painter.width
return painter.height;
}
设置 contentPadding:
///(textfield高度 - 文字高度 / 2)
contentPadding: EdgeInsets.symmetric(
horizontal: 12,
vertical: ( TextField的高度 - 文字高度)/2,
InputDecoration
中,加入一个 constraints
约束即可TextField(
decoration: InputDecoration(
constraints: BoxConstraints(maxHeight: 35),
//略...
添加之前:
添加之后:
原理相关参考:Flutter 布局探索 | 如何分析尺寸和约束
ListView头部有一段空白区域,是因为当ListView没有和AppBar一起使用时,头部会有一个padding,为了去掉padding,可以使用MediaQuery.removePadding
Widget _listView(BuildContext context){
return MediaQuery.removePadding(
removeTop: true,
context: context,
child: ListView.builder(
itemCount: 10,
itemBuilder: (context,index){
return _item(context,index);
},
),
);
}
控件超出了屏幕尺寸。表现为应用并没有闪退,只是UI显示会与预期不符
解决方案:
####### 问题:
经过排查后发现是Expanded、Flexible等组件,在“Container、Padding、Stack”组件中导致的。
####### 方案:
保持:Expanded、Flexible只在Row、Column等组件内,不在其他组件内使用。
In iOS 14+, debug mode Flutter apps can only be launched from Flutter tooling, IDEs with Flutter plugins
or from Xcode.
Alternatively, build in profile or release modes to enable launching from the home screen.
译文:
在iOS 14+中,调试模式的Flutter应用只能从Flutter工具中启动,如具有Flutter插件的IDE(Android Studio、VSCode) 或使用Xcode。
或者,构建时使用配置文件或发布模式以便使apps能够从主屏幕启动。
手机截图:
解决方案:
使用flutter的release模式,终端输入:flutter run --release
解决podfile文件中添加:
参考:Automatically assigning platform `iOS` with version `8.0` on target `Runner`_Fighting宁的博客-CSDN博客
# Uncomment this line to define a global platform for your project
platform :ios, '9.0'
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '9.0'
end
end
end
参考:Flutter 升级 2.0 填坑指导,带你原地起飞_CSDN资讯-CSDN博客
1.shadowThemeOnly相关
../../../../../Downloads/flutter/.pub-cache/git/flutter-cupertino-date-picker-eb3a837589e0477b2cb99dad03e9e4fb69fb6dde/lib/src/date_picker.dart:103:34: Error: No named parameter with the name 'shadowThemeOnly'.
theme: Theme.of(context, shadowThemeOnly: true),
^^^^^^^^^^^^^^^
../../../../../Downloads/flutter/packages/flutter/lib/src/material/theme.dart:107:20: Context: Found this candidate, but the arguments don't match.
static ThemeData of(BuildContext context) {
原因:新版 flutter shadowThemeOnly 主题被移除
解决:注释掉flutter_cupertino_date_picker第三方包调用 shadowThemeOnly 的代码
2.resizeToAvoidBottomPadding被删除,用resizeToAvoidBottomInset代替
原因是 组件还没有构建完毕,就要更新数据,所以:
解决方法1.在进行加载一页面时延时加载:
Future.delayed(Duration(milliseconds: 200)).then((e) {
setState(() {
list.add("1");
});
});
推荐解决方法2:通过addPostFrameCallback可以做一些安全的操作,在有些时候是很有用的,它会在当前Frame绘制完后进行回调,并只会回调一次,如果要再次监听需要再设置
WidgetsBinding.instance.addPostFrameCallback((callback) {undefined
initData();
});
参考:http://t.csdn.cn/shcOi