精华内容
下载资源
问答
  • 1、Flutter优点 A、混合开发中,最接近原生开发的框架; B、性能强大,流畅; C、优秀的路由设计; D、优秀的动画设计; E、简单易学,Dart语言更具优势; F、跨多种平台,减少开发成本;支持插件,可以访问原生系统...

    1、Flutter优点
    A、混合开发中,最接近原生开发的框架;
    B、性能强大,流畅;
    C、优秀的路由设计;
    D、优秀的动画设计;
    E、简单易学,Dart语言更具优势;
    F、跨多种平台,减少开发成本;支持插件,可以访问原生系统的调用。

    在这里插入图片描述

    2、Flutter缺点
    A、脱离不开原生,开发人员需要具备原生(Android、iOS)基础开发能力;
    B、适配问题,开发工具版本升级后,修改量大;
    C、原生集成第三方SDK后,兼容性适配是个令人头痛的问题;
    D、代码可读性较差,对代码质量和管理要求较高;
    E、Widget的类型难以选择,糟糕的UI控件API;
    F、Flutter packages和Dart packages上第三方sdk繁杂,适配性差,不可乱用;
    G、目前几乎没有第三方开发者平台开发Flutter能力的SDK,需要原生去集成;
    H、打包后,apk/ipa要大很多。

    准备工作

    0.首先你需要准备一个梯子,

    1.一个安卓模拟器

    1.1 如果你又准备使用模拟器又曾经装过windows版的docker 请务必关了 Hyper-V ,还不明白你就你就点击这个

    1.2 如果你关了 Hyper-V 还是蓝屏的话,请打开 Windows Defender — 设备安全性 — 关闭内存完整性

    2.如果你使用真机开发,请打开你的手机 -> 设置 -> 点击版本号 -> 开发者模式

    获取Flutter SDK

    ​ 点击这里跳转到Flutter官网下载SDK,笔者选择了Stable channel (Windows) 也就是 稳定版 ,作为初学者也没有必要使用Beta版本 点击最新的稳定版下载就OK了。要提一句的是:下载的Flutter开发环境的是免安装的,我将其解压到了 D:\flutter下,它最后的地址是D:\flutter\flutter。

    配置环境变量

    在环境变量中的Path中添加路径你的路径\flutter\bin
    如果你梯子猛,你不需要 读3和4
    去用户变量增加PUB_HOSTED_URL 地址为https://pub.flutter-io.cn
    增加变量FLUTTER_STORAGE_BASE_URL地址为https://storage.flutter-io.cn

    展开全文
  • 选择了Flutter开发app

    2020-05-17 22:55:34
    继上一次选了uniapp开发app之后,最近需要做一个app,这次选择谷歌的Flutter。 为什么不继续使用uniapp开发app?见之前的博文。选择了uniapp开发app 正文开始: 环境: 开发工具:idea或者Android Studio(本来...

    背景:

    继上一次选了uniapp开发app之后,最近需要做一个app,这次选择谷歌的Flutter。

    为什么不继续使用uniapp开发app?见之前的博文。选择了uniapp开发app

    正文开始:

    环境:

    开发工具:idea或者Android Studio(本来就是一家公司的产品)。

    flutter环境配置:

    下载最新的flutter,配置环境变量。目前最近版本为:1.17

    项目结构:

    开发的页面放到lib目录下,当然支持建子文件夹分类存放。

    路由:

    route navigator

    网络请求:

    dio

    flutter不支持自动转换json,需要借助json_annotation间接实现。

    实现步骤:

    1、手动写json数据文件。

    2、使用JsonSerializableGenerator工具自动生成。

    状态管理:

    provider

    本地缓存:

    shared_preferences

    图表展示:

    暂未确定,有flutter_charts和echarts的开源工具包,但目前看都不太满意,待解决问题。

    疑问:

    手机端图表需不需要类似于网页版图表的tooltip?移动设备尺寸固定,显示了也看不清楚,待确认问题。

    国际化:

    flutter_localizations

    打包发布:

    flutter build apk 

    上架市场:

    待更新。

    每个过程的细节会在项目开发的过程逐步更新。

    展开全文
  • Flutter开发App简介

    千次阅读 2020-05-16 19:21:26
    简介 今天给大家介绍的是Dart2和Flutter ...Flutter是google推出的跨平台开发框架, 类似于React-native. 不过相比于React-native, 它的性能更优势. 支持IOS,Android •谷歌的开源移动UI框架 •支持iOS..

    简介

    今天给大家介绍的是Dart2Flutter

    Dartgoogle推出的一种新的脚本语言, 希望能替代JS,

    然而JS也在迭代升级, 生命力很旺盛,

    目前, Dart还没能替代JS.

    现在最新的Dart2, 据说相比1改变很多.

    所以我直接介绍dart2.

    Fluttergoogle推出的跨平台开发框架, 类似于React-native.

    不过相比于React-native, 它的性能更有优势.

     

    支持IOS, Android

    •谷歌的开源移动UI框架
    •支持iOS App和Android App
    •调试时支持热重载
    •内置Material Design, Cupertino
    •简易的包管理
    •接近原生的性能
                          
    Flutter 是谷歌大力推进的开源项目, 据说更新迭代很快 , 我在学习的这段时间确实遇到有几次更新提醒 . 同时支持ios android.,调试时支持热重载.  网站描述调试过程中如果崩溃了 , 还可以修复崩溃点继续热重载 . 这一点 react-native 还没做到 .
    Flutter 提供了两套组件库 Material Design是google主推的设计, 而Cupetino是apple主推的设计.
    自动化包安装是在代码的配置里写上要引用的包和版本号 IDE就可以轻松的将正确的包同步到本地. 相比npm管理包更轻松. 不过这个过程的进度信息比较少.  从官方的介绍看, 性能比ReactNative更接近原生的 app.
     

    环境搭建

     

    1. 下载Flutter SDK, 解压到C盘.

    是一个zip包, 解压到C盘, 因为担心权限问题, 要求不要放到program Files.

    https://flutter.io/sdk-archive/#windows

    2. 将c:/flutter/bin添加到环境变量path

    3. 添加两个环境变量的添加是为避免国内访问不到有些地址,

    export PUB_HOSTED_URL=https://pub.flutter-io.cn

    export FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn                                            

    4. 升级和检查

    flutter doctor

    flutter upgrade

    5. 设置编辑器

    vscode Extensions: Install  Flutter

    6. android studio安装

    7. android studio安装flutter插件

    8. android studio配置虚拟安卓设备.

    Dart语言

     

    Dart类似于JS, 可以应用于web, server等应用场景, flutter框架下也支持了移动端开发.

    1.  需要main入口才能运行.

    2. Raw字符串, 不会发生转义

    3. 多行字符串, 考虑到代码上加的空格也会体现出来, 所以如果用这种方法, 又不想要这些空格, 会破坏代码的整体美观.

    4. 字符串中嵌入变量, 相比JS有些简化

    5. Future相比Promise简便一点. 并且它可以加一个Duration来完成timeout的工作.

    6.  async/wait可以应用场景可以更自由. 比如for循环

    还有一些没在这里演示, 比如类型继承, class extend, 类型安全等跟ts就比较像了.

    最大的优点是具备JS的大部分优点, 所以容易上手. 又去掉了JS的大部分缺点, 比如隐式转换.

    创建Flutter App

    1. 创建Flutter工程

         vscode命令也可以, 在命令行中输入flutter new, 填入名字, angular-cli类似, 就能生产一堆代码.

    2. Vscode打开工程, 左侧可以看到android, ios各自产生的相应的工程, lib/main.dart就是业务层代码了.

        其它的大部分可以不用管, 不过这里有一个pubspec.yaml是一个包管理文件, 类似与package.json.

    3.  找到lib/main.dart

         写上这些代码
    4.  F5运行, 选择虚拟设备, 将会看到虚拟设备显示出实现的界面. (调试支持热重载)

    这个例子中, 首先是main()的入口 调用 runApp创建app对象运行起来.

    App对象从statelessWidget创建. 所谓statelesswidget就是属性不可变的widget意思.

    widget是所有控件的基类.

    Widget最基本的方法就是buildsetState

    类似于Reactrender.

    这里@override表示extend出来的子对象覆盖widgetbuild方法.

    flutter里绝大部分的可见或不可见的界面元素都是widget, 整个页面, 路由的页面, 容器, , , 甚至是padding.

    MaterialAppmaterial组件之一, 提供整体的属性的定义.

    比如整体的风格, 颜色, 名称

    Scaffold提供默认的导航栏, 标题, body等属性的定义.

    Appbar标题栏

    Text控件

    Center是一个布局控件, 可以把子对象摆在中间, 像有图所示.

    这里的名称加冒号的传参方式, 前面解释了,

    是可选参的传递方式,不限定传参顺序.

     
     

    StateFulWidget状态控件

     

    这个例子要演示的是StateFulWidgetStateLessWidget的不同.

    这里引入了一个能产生随机单词的外部包.

    这里的外部包引用只需要在yaml填入包名称和版本号,

    然后触发flutter: get package命令就会完成包引用和更新.

    这里需要注意的是, 缩进的多少会影响语义.

    这里可以看到, StatefulWidgetoverride createState 函数

    返回一个new 的对象state<RamdomWords>模板参数又引用了前面这个类型,

    这个写法有点奇怪, 有一种循环引用的错觉. 不过实际上并不是循环引用.

    然后再在这个state<>override 一个build方法.

    state有变化时, 会触发build, 也可以手动触发.

    这里里面放入一个listView listTile构成一个列表.

    每次滚动到底部, 都会触发itemBuilder传入新的i.

    到了这里我们对FlutterDart就有了一个初步的了解了.

    接下来看一下Flutter的架构.

     

    Navigator导航

     

    Routeflutter中通过navigator来管理.

    支持两种方式来做路由, 一种是stack push pop,

    另一种就是常见的路径和页面映射.

    这里演示的是第一种, 因为手机最常见的情况是跳转, 然后返回.

    navigtorpush, pop, 操作widget对象来完成页面的跳转.

    这种widget叫做MaterialPageRoute.

    这里有一个navigator的例子, 实现的效果, 就是

    点击右上角的按钮之后, 跳转到收藏页面,

    点击返回又可以回到主页面.

    代码实现是在右上角增加一个按钮的onPress事件触发

    这个navigator.of是从当前的context也就是这个materialAppnavigator.

    然后push一个MaterialPageRoute

    Builder方法里返回一个Scofold页面就行了.

    这里可以看到context包含app的环境信息或对象

    MaterialApp的的routes属性可以设置路由路径和页面之间的映射关系.

    new MaterialApp(
    
    routes: <String, WidgetBuilder> {
    
         '/a': (BuildContext context) => new MyPage(title: 'page A'),
    
         '/b': (BuildContext context) => new MyPage(title: 'page B'),
    
    }

    除此以外, route还可以嵌套, 也就是说, app这一层是根路由,

    而根路由里面的page还可以嵌入子路由, navigator.of访问context

    按照就近原则获取当前的路由进行操作.

     
     
     

    Icons.xxx图标

     

    官方的图标库集成了内部的接口, 方便直接加载, 基于矢量. 操作便捷, Icons.xxx就可以加载这个图标.

    但是, 如果没有自己想要的图标还是需要通过图片加载的方式.
     
     
     

    Layout布局

     

    这里是对布局的演示,

    Flutter的布局有一个特点, 就是它不用负责告诉它的父节点, 自己要显示在哪里.

    主要是每种容器通过row, colum, list, card, gridview等容器来管着子节点的显示,

    然后再容器的属性可配置主轴, 纵轴的对齐方式, padding, margin, border.

    childrenchild嵌入子节点. 理解起来还是比较简单的.

    另外, 对于全局的风格, materialApp中也有属性进行定义.

    Animation动画

     Animation:

            1. 按时间阶段输出.value

            2. 监听状态(forward, backward, completed, dismissed)

        AnimationController:

            1. .forward, .backward控制向前向后

            2. 设置变化的时长

        CurvedAnimation:

            1. 曲线变化(fastOutSlowIn, bounceIn, elasticInOut, 可自定义)

            2. AnimationControllerCurves组合出一个Animation对象

        Tween(Animatable):

            1. 设置Animation值变化范围

            2. .evaluate(Animation)通过Animation可计算当前值

            3. .animate(AnimationController)可以返回一个Animation

    Pubspec.yaml环境配置文件

    Pubspec.yaml文件, 配置包,类似于node.js的package.json文件.

    前面提到配置的包在这里有修改的话,

    会可以自动触发更新

    相比npm install在编写代码再去输入命令要更便捷一点.

    命令也支持.

    然而这个国外的源可能被封禁, 所以经常get失败,

    谷歌说提供了一个国内的源, 但是实际使用的时候, 发现效果也是很差.

    另外还可以配置图片, 自定义字体, 本地语言等.

    GestureDetector手势检测

    •onTapDown :                     指针已经在特定位置与屏幕接触
    •onTapUp :                           指针停止在特定位置与屏幕接触
    •onTap tap:                          事件触发
    •onTapCancel :                    先前指针触发的onTapDown不会在触发tap事件
    •onDoubleTap :                   用户快速连续两次在同一位置轻敲屏幕.
    •onLongPress :                    指针在相同位置长时间保持与屏幕接触
    •onVerticalDragStart :        指针已经与屏幕接触并可能开始垂直移动
    •onVerticalDragUpdate :    指针与屏幕接触并已沿垂直方向移动.
    •onVerticalDragEnd :          与屏幕接触并垂直移动的指针不再与屏幕接触
    •onHorizontalDragStart :    指针已经接触到屏幕并可能开始水平移动
    •onHorizontalDragUpdate:  指针与屏幕接触并已沿水平方向移动
    •onHorizontalDragEnd :      与屏幕接触并水平移动的指针不再与屏幕接触

     

    大多数控件有onPress事件, 但是手机上的手势行为很多

    因此并没有让每一个控件支持所有手势的属性,

    所以如果想要获得哪些手势就需要使用GetureDetector

    GetureDetector本身也是一种widget把它和其它控件重叠放在一起,

    或者把其它控件作为GetureDetector的子控件.

    它就可以检测到这个控件上发生的手势动作.

    这里列举了可支持的手势动作.

     

    Inspector

    调试上除了传统的断点单步调试, 也一样支持inspector和性能分析

    不过提供的inspector支持不在vscode., 而是intelliJ,

    可以查看节点层次和节点属性, 只不过不能直接在inspetor里面修改属性.

    android studio是基于intelliJIDE, 所以也是支持的.

     

    Platform-Specific

    Flutter 与平台之间通过通信

    每个API都有一个独立的路径, 获得路径对应的methodchannel对象

    然后通过.invokeMethod(funcName)来访问接口.

    这里为防止阻塞使用了async await.

    已有的这些访问API的路径包含

    如果开发发现还不够, 可以自己在native开发这一层

    添加自定义的API路径和native api之间的映射.

    而数据的返回有两种形式, 一种从result.success, result.error阻塞式返回.

    另一种是通过event.

     

    Achitecture架构

    Flutter的框架从上到下分三个大层:

    FrameWork主要包含UI组件(MaterialCupertino widgets)也包含:

         widgets, Animation, getstures

    Engine主要是指Dart的引擎, 还包括

         Event, pipeline, 服务协议, 渲染等.

    Embedder主要是native层的一些接口和线程, 事件, 包管理等.

    根据介绍Flutter相比React最大的优势在于,

    在上层就完成了render, 避免了diff变化的层层传递. 所以性能更好.

     
     
     

    Publish打包发布

    打包和发布, 在各自的平台有一些不同的操作流程.

     
    本文参考:
    展开全文
  • Flutter开发 APP版本更新

    千次阅读 2019-04-11 20:52:00
     FlutterAPP打开后检测到新版本后,可以直接到应用市场去下载新的APK,也可以使用flutter_downloader从服务器下载。因为我们的应用是上架到Google Play,当用户点击下载的按钮,直接跳转到Google Play官网去下载...

    前言:

          Flutter的APP打开后检测到有新版本后,可以直接到应用市场去下载新的APK,也可以使用flutter_downloader从服务器下载。因为我们的应用是上架到Google Play,当用户点击下载的按钮,直接跳转到Google Play官网去下载APK即可。下面我简单总结一下在Flutter中实现“版本更新”的功能。

    思路:

    1.第一次打开APP时执行"版本更新"的网络请求;

    2.比较服务器的版本号跟当前的版本号,来判断要不要升级APP应用程序;

    3.弹出“版本更新”对话框。

    实现的步骤:

    1.配置AndroidMenifest.xml文件

     <uses-permission android:name="android.permission.INTERNET"/>
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

    2.在pubspec.yaml添加sdk

    dependencies:
      ...
      cupertino_icons: ^0.1.0
      package_info: ^0.3.2+1

    3.导包

    import 'package:package_info/package_info.dart';

    4.第一次打开APP时执行"版本更新"的网络请求

    class UpdatePagerState extends State<UpdaterPage> {
      var _serviceVersionCode;
    
      @override
      void initState() {
        super.initState();
        _getNewVersionAPP();
      }
    
      //执行版本更新的网络请求
      _getNewVersionAPP() async {
        String url = IHttpService.getNewVersionApp;
        DioUtil.getInstance().get(context, url).then((response) {
          if (response != null) {
            setState(() {
              var data = response.data;
              _serviceVersionCode = data["versionCode"];
              _checkVersionCode();
            });
          }
        });
      }
    
    }
    

    5.比较服务器的版本号跟当前的版本号,来判断要不要升级APP应用程序

    void _checkVersionCode() {
        PackageInfo.fromPlatform().then((PackageInfo packageInfo) {
          var currentVersionCode = packageInfo.version;//获取当前的版本号
          //如果获取服务器的版本号比当前应用程序的版本号还高,那么提示升级
          if (serviceVersionCode > currentVersionCode) {
            _showNewVersionAppDialog();//弹出"版本更新"的对话框
          }
       });
    }
    

    6.弹出“版本更新”对话框

     Future<void> _showNewVersionAppDialog() async {
        return showDialog<void>(
            context: context,
            barrierDismissible: false,
            builder: (BuildContext context) {
              return AlertDialog(
                title: new Row(
                  children: <Widget>[
                    new Image.asset("images/ic_launcher_icon.png",
                        height: 35.0, width: 35.0),
                    new Padding(
                        padding: const EdgeInsets.fromLTRB(30.0, 0.0, 10.0, 0.0),
                        child: new Text("项目名称",
                            style: dialogButtonTextStyle))
                  ],
                ),
                content: new Text(
                    '版本更新',
                    style: dialogTextStyle),
                actions: <Widget>[
                  new FlatButton(
                    child: new Text('Later', style: dialogButtonTextStyle),
                    onPressed: () {
                      Navigator.of(context).pop();
                    },
                  ),
                  new FlatButton(
                    child: new Text('DownLoad', style: dialogButtonTextStyle),
                    onPressed: () {
    //                  launch("https://play.google.com/store/apps/details?id=项目包名");
                      _launchGooglePlay();//到Google Play官网去下载APK
                      Navigator.of(context).pop();              
                    },
                  )
                ],
              );
            });
      }
    

    7.到Google Play官网去下载APK

       _launchGooglePlay() async{
           String url = "https://play.google.com/store/apps/details?id=项目包名";
           if (await canLaunch(url)) {
             await launch(url);
           } else {
             throw 'Could not launch $url';
        }
      }

    8.完整的代码

    class UpdaterPage extends StatefulWidget {
      final Widget child;
    
      const UpdaterPage(this.child);
    
      @override
      UpdatePagerState createState() => UpdatePagerState();
    }
    
    class UpdatePagerState extends State<UpdaterPage> {
      var _serviceVersionCode;
    
      @override
      void initState() {
        super.initState();
        _getNewVersionAPP();
      }
    
      //执行版本更新的网络请求
      _getNewVersionAPP() async {
        String url = IHttpService.getNewVersionApp;
        DioUtil.getInstance().get(context, url).then((response) {
          if (response != null) {
            setState(() {
              var data = response.data;
              _serviceVersionCode = data["versionCode"];
              _checkVersionCode();
            });
          }
        });
      }
    
      //检查版本更新的版本号
      _checkVersionCode() async {
        PackageInfo packageInfo = await PackageInfo.fromPlatform();
        String _currentVersionCode = packageInfo.version;
        int currentVersionCode = int.parse(_currentVersionCode);
        if (_serviceVersionCode > currentVersionCode) {
          _showNewVersionAppDialog();
        }
      }
    
     //弹出"版本更新"对话框
      _showNewVersionAppDialog() async {
        return showDialog<void>(
            context: context,
            barrierDismissible: false,
            builder: (BuildContext context) {
              return AlertDialog(
                title: new Row(
                  children: <Widget>[
                    new Image.asset("images/ic_launcher_icon.png",
                        height: 35.0, width: 35.0),
                    new Padding(
                        padding: const EdgeInsets.fromLTRB(30.0, 0.0, 10.0, 0.0),
                        child: new Text(Strings.new_version_title,
                            style: dialogButtonTextStyle))
                  ],
                ),
                content: new Text(Strings.new_version_dialog_content,
                    style: dialogTextStyle),
                actions: <Widget>[
                  new FlatButton(
                    child: new Text(Strings.new_version_button_later,
                        style: dialogButtonTextStyle),
                    onPressed: () {
                      Navigator.of(context).pop();
                    },
                  ),
                  new FlatButton(
                    child: new Text(Strings.new_version_button_download,
                        style: dialogButtonTextStyle),
                    onPressed: () {
    //                launch("https://play.google.com/store/apps/details?id=项目包名");
                      _launchGooglePlay();
                      Navigator.of(context).pop();
                    },
                  )
                ],
              );
            });
      }
    
      _launchGooglePlay() async{
           String url = "https://play.google.com/store/apps/details?id=项目包名";
           if (await canLaunch(url)) {
             await launch(url);
           } else {
             throw 'Could not launch $url';
        }
      }
    
      @override
      Widget build(BuildContext context) => widget.child;
    }
    

    9.在首页调用”版本更新”的类

    class IndexPage extends StatefulWidget {
      @override
      IndexPageState createState() => IndexPageState();
    }
     
    class IndexPageState extends State<IndexPage>{
      @override
      Widget build(BuildContext context) {
         return UpdaterPage(Scaffold( //调用UpdaterPage
          appBar: _buildAppBar(),
          body: getScreen()
        ));
      }
    }

    10.总结

          当有新版本需要升级时,客户端会"版本更新"弹出对话框,用户点击下载的按钮直接跳转到Google Play官网去下载APK就可以。APP版本更新的功能已经实现,欢迎大家围观。如果有什么疑问的话,可以留言联系我哦!

     

    转载于:https://my.oschina.net/wupeilin/blog/3035732

    展开全文
  • 采用flutter开发社交app

    2019-08-10 05:00:12
    主要用于研究flutter常用packages,涉及到,app版本升级,权限获取,扫码,图片选择,图片上传,图片压缩,图片裁剪,图片缓存,数据缓存,http通讯
  • 使用flutter开发app,idea找不到device

    千次阅读 2019-04-04 21:42:26
    在idea中使用flutter开发app的时候,使用数据线链接安卓手机,但是在idea中找不到链接的硬件设备,如下图: 遇到这种问题该如何解决? 方法一:一般这个问题是没有正确安装android sdk,很多人以为下载了...
  • flutter_app 现有功能 1,登录 2,注册 3,欢迎页 4,启动广告页 5,首页 6,螺栓页 7,二维码 8,瀑布流 9,基本组件demo模块 10,会员首页 11,设置页面 使用的第三方库 # 图标库 cupertino_icons: ^0.1.2 #应用...
  • flutter开发APP时icon图标使用

    千次阅读 2019-04-02 16:56:07
    链接:https://material.io/tools/icons/?style=baseline
  • Flutter Food APP的设计Flutter FoodApp设计挑战此仓库为您提供了惊人的Flutter Food App UI设计! 如果您喜欢设计,请加星号支持我! :red_heart:Star:red_heart:支持该项目的仓库或:grinning_face_with_smiling_...
  • 利用Flutter开发的漂亮天气App
  • 使用Flutter开发的工作看板App
  • 一个基于Flutter开发的移动App
  • flutter app开发教程合集.zip
  • 餐厅 Restyaboard移动应用程序。 地位 已完成的项目 从用户获取Restyaboard实例URL 在Web视图中加载用户提供的Restyaboard实例 用户可以更改Restyaboard实例URL ... 要获得Flutter入门方面的帮助,请查看我们的在线。
  • Movieapp是一个基于tmdb采用flutter开发的电影App
  • flutter社交App

    千次阅读 2019-05-18 16:33:16
    flutter社交App flutter 社交app Updated 3 minutes ago 主要用于研究flutter常用packages,涉及到,app版本升级,权限获取,扫码,图片选择,图片上传,图片压缩,图片裁剪,图片缓存,数据缓存,http通讯,发送...
  • 也试过将Flutter启动页设置成其他图片,因为图片变了,所以切换时不会感到什么闪屏。就是图片相同,切换起来就会感觉闪一下。 网上说到用precacheImage,提前加载图片,但是我使用了没效果。怀疑是不是...
  • 使用Flutter开发的常见的App启动页
  • 主要给大家介绍了关于如何使用Flutter开发一款电影APP的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Flutter具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
  • AndroidStudio在安卓模拟器运行flutterApp
  • fuel_helper_flutter_app 一个新的Flutter项目。 入门 该项目是Flutter应用程序的起点。 如果这是您的第一个Flutter项目,那么一些资源可以帮助您入门: 要获得Flutter入门方面的帮助,请查看我们的,其中提供了...
  • 差异点: 在Android中,View是屏幕上显示的所有内容的基础, 按钮、工具栏、输入框等一切都是View。 iOS构建UI的过程中将大量使用view对象。...然而,与View相比,Widget一些不同之处。 首先,Widg...
  • Flutter淘宝App,支持iOS、Android
  • 一个利用Flutter开发的一些示例App集合
  • 所以,在这里记录分享出来,也希望 Flutter 生态越来越好 (flutter开发App效率真的很高,开发体验也是很好的 ????)。 以下博文会分为3个部分概述: 项目结构分析 项目功能详细概述(所用知识点) 小技巧积累总结 ...
  • 如果配置过Flutter命令行环境,先命令行设置...比Android,iOS多一个Windows文件目录,同时测试机Windows可选,点run就可以运行。 如果点run按钮之后报 Unable to find suitable Visual Studio toolchain. Please
  • grpc_flutter_appflutter使用gRPC的demo。跨平台开发框架flutter使用gRPC的例子。
  • 使用Dart和Flutter制作的Dictionary App。 Dictionary App使用Dart和Flutter制作的Dictionary App。 可以在此处找到所使用的API。在项目中使用了以下Dart和Flutter软件包。 导入'dart:convert'; 导入'dart:io'; ...
  • 一个使用 Flutter 开发的一款漫画阅读 App, 相应的微信小程序地址 . Getting Started # clone project git clone git@github.com:cixiu/flutter_manhuatai.git # cd project root directory cd flutter_manhuatai # ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 20,471
精华内容 8,188
关键字:

flutter开发的app有哪些