Flutter开发实践三:打包与填坑
1.打包
首先我们看一下结果,如下表,这是Flutter与React Native、IOS的纵向和横向对比和 Android 。
项目 | IOS | Android |
---|---|---|
GSYGithubAppFlutter | ||
GSYGithubAppRN |
从上表我们可以看到:❀比apk更小的部分:Flutter使用斯基亚
,搭载Android系统。
javascriptcore
已经内置在 ios 中了。 versi onCode
,versi onName
以及签名信息,最后使用flutter build app❀完成编译。烧写成功的包位于build/app/outputs/apk/release
。 2。 IOS打包与真机操作
在IOS打包中,笔者经历了一波波折。这里我主要说一下我遇到的问题。
首先需要一个苹果开发者账号,然后创建证书,创建AppId,创建配置文件,最后在文件info.plist
中输入相关信息。更多详情请参见官方教程《发布的IOS版APP》。
但是由于笔者使用了shared_preferences
等第三方插件包,所以在执行❀打开过程中总是出现以下问题通过Android Studio在IOS模拟器中显示No Problem,说明这不是第三方包的问题。通过查找问题,我们发现在IOS上运行Archive
之前,需要先运行flutter build release
,如下图。该命令执行后,Pod执行目录会发生变化,并创建打包所需的文件。 。 (正常运行时ps会自动改变)![Flutter开发实战三: 打包与填坑篇]()
但是实际运行flutter build release
后,问题依然存在,终于过山了。 )。
open ios/Runner.xcodeproj
I checked Runner/Pods is empty in Xcode sidebar.
drop Pods/Pods.xcodeproj into Runner/Pods.
"Valid architectures" to only "arm64" (I removed armv7 armv7s)
复制代码
终于打包成功了,累了(///▽///)。同时,如果想直接在真机上调试Flutter,可以参考:《Flutter基础—开发环境与入门》IOS真机部分中的。 这里主要讲一些小细节 AppBar 是 Flutter 中常用的 widget,AppBar 不仅仅可以用作标题栏, 领先应用栏中下面的和 的red。所以,只要你的控件实现了 Flutter 中的按钮,如 如果添加Flex,如下图,可控pad按钮。出口。 ?例如,活动任务 实际上, ,其中 方法设置器value 当然还有更简单粗暴的设置值的方法:传入对象类A对象,使用对象变量A.b将控件绑定到控件上,通过setState({A.b = b2}) 。 在 Flutter 中,要主动更改子控件状态,还可以使用 下面的代码会通过 ,然后在rest Widget 使用 Flutter 处于 JIT 模式,AOT 处于调试和发布模式。在DEBUG中,支持Hotload,非常流畅。 。但请注意:如果在开发过程中安装了新的第三方包,并且新的第三方包包含原始代码,则必须停止并重新运行。在文件 2. 细节
1. AppBar
也是有用的功能。
的值被覆盖 加载后,如果发生更改,将会触发 bottom
默认支持 TabBar。
,这是常见的 上面Tab的效果其实是因为TabBar
实现了PreferredSizeWidget
的preferredSize
,它就只能在 lower
AppBar 中使用。例如,下图中的搜索栏是 TabView 中的页面,并在 AppBar 中使用。 leading
:一般为左侧按钮,不设置则正常,是抽屉图标或后退按钮。 flexibleSpace
:位于底部
和前导
之间。 2. 按钮
FlatButton
默认是否有边框和最小尺寸。所以如果你想要没有padding、margin、border、默认尺寸等的按钮效果,一种方法是:///
new RawMaterialButton(
materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
padding: padding ?? const EdgeInsets.all(0.0),
constraints: const BoxConstraints(minWidth: 0.0, minHeight: 0.0),
child: child,
onPressed: onPressed);
复制代码
TextField
,如以下代码所示:
final TextEditingController controller = new TextEditingController();
@override
void didChangeDependencies() {
super.didChangeDependencies();
///通过给 controller 的 value 新创建一个 TextEditingValue
controller.value = new TextEditingValue(text: "给输入框填入参数");
}
@override
Widget build(BuildContext context) {
return new TextField(
///controller
controller: controller,
onChanged: onChanged,
obscureText: obscureText,
decoration: new InputDecoration(
hintText: hintText,
icon: iconData == null ? null : new Icon(iconData),
),
);
}
复制代码
TextEditingValue
❀ 是 notifyListeners
方法。在TextEditingController
中,通过调用addListener
,监听数据变化,从而更新UI。 4。 GlobalKey
GlobalKey
。例如,您必须主动调用RefreshIndicator
来显示刷新状态,如下代码所示。 ?影响。StoreProvider
打开商店,然后根据主题将商店中的themeData绑定到MaterialApp Store
Theme.of(context)
设置需要的颜色,最后在任意位置调用 store.dispatch
实时更改主题。效果如下图所示。 class FlutterReduxApp extends StatelessWidget {
final store = new Store<GSYState>(
appReducer,
initialState: new GSYState(
themeData: new ThemeData(
primarySwatch: GSYColors.primarySwatch,
),
),
);
FlutterReduxApp({Key key}) : super(key: key);
@override
Widget build(BuildContext context) {
/// 通过 StoreProvider 应用 store
return new StoreProvider(
store: store,
///通过 StoreBuilder 获取 themeData
child: new StoreBuilder<GSYState>(builder: (context, store) {
return new MaterialApp(
theme: store.state.themeData,
routes: {
HomePage.sName: (context) {
return HomePage();
},
});
}),
);
}
}
复制代码
6。热加载和打包
pubspec.yaml
中有一个包装依赖项目录,其中^
表示大于或等于,通常是
和升级。都是Get函数下载包。但是:当包更新时,upgrade 将更新文件
pubspec.lock
下的包版本 。 3。问题处理
等待另一个flutter命令释放初始锁
:如果遇到这个问题: 1、打开flutter的安装目录/bin/cache/
2、删除lockfile文件
3、重启AndroidStudio
复制代码
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。