Code前端首页关于Code前端联系我们

Flutter开发实践三:打包与填坑

terry 2年前 (2023-09-23) 阅读数 63 #移动小程序

1.打包

首先我们看一下结果,如下表,这是Flutter与React Native、IOS的纵向和横向对比和 Android

项目IOSAndroid
GSYGithubAppFlutterFlutter开发实战三: 打包与填坑篇Flutter开发实战三: 打包与填坑篇
GSYGithubAppRNFlutter开发实战三: 打包与填坑篇Flutter开发实战三: 打包与填坑篇

从上表我们可以看到:❀比apk更小的部分:Flutter使用斯基亚,搭载Android系统。

  • 横向对比React Native,虽然项目不完全一样,但大部分功能相同,Flutter的Apk其实更小。这里有更多细节。 rn 的 ipa 数据包大小较小。这其实是因为 javascriptcore 已经内置在 ios 中了。
  • 如果您对以上内容感兴趣,可以查看《移动端跨平台开发的深度解析》。 ? versi onCodeversi 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后,问题依然存在,终于过山了。 )。

  • Issue#18305其实解决了这个问题吧,是因为Pod项目没有引入:
  • 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真机部分中的

    2. 细节

    这里主要讲一些小细节

    1. AppBar

    AppBar 是 Fl​​utter 中常用的 widget,AppBar 不仅仅可以用作标题栏, 领先应用栏中下面的和也是有用的功能。

    • AppBar 的 bottom 默认支持 TabBar。 ,这是常见的 上面Tab的效果其实是因为TabBar实现了PreferredSizeWidgetFlutter开发实战三: 打包与填坑篇

      的red。所以,只要你的控件实现了 preferredSize,它就只能在 lower AppBar 中使用。例如,下图中的搜索栏是 TabView 中的页面,并在 AppBar 中使用。

    Flutter开发实战三: 打包与填坑篇
    • leading:一般为左侧按钮,不设置则正常,是抽屉图标或后退按钮。
    • flexibleSpace:位于底部前导之间。

    2. 按钮

    Flutter 中的按钮,如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);
    复制代码

    如果添加Flex,如下图,可控pad按钮。出口。 ?例如,活动任务 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❀ 是 Flutter开发实战三: 打包与填坑篇

    ,其中 方法设置器value

    的值被覆盖 加载后,如果发生更改,将会触发 notifyListeners 方法。在TextEditingController中,通过调用addListener,监听数据变化,从而更新UI。

    当然还有更简单粗暴的设置值的方法:传入对象类A对象,使用对象变量A.b将控件绑定到控件上,通过setState({A.b = b2})

    4。 GlobalKey

    在 Flutter 中,要主动更改子控件状态,还可以使用GlobalKey。例如,您必须主动调用RefreshIndicator来显示刷新状态,如下代码所示。 ?影响。

    下面的代码会通过StoreProvider打开商店,然后根据主题将商店中的themeData绑定到MaterialApp StoreFlutter开发实战三: 打包与填坑篇

    ,然后在rest Widget 使用 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();
                  },
                });
          }),
        );
      }
    }
    复制代码
    Flutter开发实战三: 打包与填坑篇

    6。热加载和打包

    Flutter 处于 JIT 模式,AOT 处于调试和发布模式。在DEBUG中,支持Hotload,非常流畅。 。但请注意:如果在开发过程中安装了新的第三方包,并且新的第三方包包含原始代码,则必须停止并重新运行。在文件

    pubspec.yaml中有一个包装依赖项目录,其中^表示大于或等于,通常是和升级。都是Get函数下载包。但是:当包更新时,upgrade 将更新文件 pubspec.lock 下的包版本

    3。问题处理

    • 等待另一个flutter命令释放初始锁:如果遇到这个问题:
      1、打开flutter的安装目录/bin/cache/ 
      2、删除lockfile文件 
      3、重启AndroidStudio
    复制代码
    • yellow-line-in-text-widgets-in-flutter:在showDialog中,Scaffold没有被使用默认。这会导致文本出现黄色溢出线提示。您可以使用Material包来处理它。
    • TabBar + TabView + KeepAlive 问题可以通过 TabBar + PageView 解决。详情请参见第 2 章。 ?商业转载请联系作者获取授权。非商业转载请注明出处。

    版权声明

    本文仅代表作者观点,不代表Code前端网立场。
    本文系作者Code前端网发表,如需转载,请注明页面地址。

    发表评论:

    ◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

    热门