flutter_flutter安装包 - CSDN
flutter 订阅
Flutter 是 Google 开源的 UI 工具包,帮助开发者通过一套代码库高效构建多平台精美应用,支持移动、Web、桌面和嵌入式平台。Flutter 开源、免费,拥有宽松的开源协议,适合商业项目。 展开全文
Flutter 是 Google 开源的 UI 工具包,帮助开发者通过一套代码库高效构建多平台精美应用,支持移动、Web、桌面和嵌入式平台。Flutter 开源、免费,拥有宽松的开源协议,适合商业项目。
信息
推出时间
2015年5月3日 [2]
外文名
Flutter [1]
Flutter框架概况
Flutter 是 Google 开源的 UI 工具包,帮助开发者通过一套代码库高效构建多平台精美应用,支持移动、Web、桌面和嵌入式平台 [3]  。Flutter 可以方便的加入现有的工程中。在全世界,Flutter 正在被越来越多的开发者和组织使用,并且 Flutter是完全免费、开源的。它也是构建未来的 Google Fuchsia 应用的主要方式。Flutter 组件采用现代响应式框架构建,这是从React中获得的灵感,中心思想是用组件(widget)构建你的UI。 组件描述了在给定其当前配置和状态时他们显示的样子。当组件状态改变,组件会重构它的描述(description),Flutter 会对比之前的描述, 以确定底层渲染树从当前状态转换到下一个状态所需要的最小更改。
收起全文
精华内容
参与话题
  • 从简到难,从浅入深,逐步带领大家了解Flutter,熟悉Flutter的组成部分,并且带领大家学习如何使用Flutter实现UI功能编写。通过对本视频的学习,你将会掌握Flutter常用组件和常用布局构建复杂布局、Flutter路由导航...
  • 谷歌——Flutter

    千次阅读 2018-08-10 08:47:51
    Flutter——谷歌开源的跨平台UI开发框架 Fluter特性介绍 Flutter官网介绍如下: Flutter is Google’s mobile UI framework for crafting high-quality native interfaces on iOS and Android in record time. ...

    Flutter——谷歌开源的跨平台UI开发框架

    Fluter特性介绍

    Flutter官网介绍如下:

    Flutter is Google’s mobile UI framework for crafting high-quality native interfaces on iOS and Android in record time. Flutter works with existing code, is used by developers and organizations around the world, and is free and open source.

    这个说明告诉我们:Flutter是一款UI框架,可以制作跨平台(Android、IOS)的,高速的本地界面(不是H5)。Flutter可以跟现有的代码一起工作,并且可以被世界各地开发者使用,因为他是免费的、开源的! 

    学习这个跨平台的UI框架,也许有一天你能成为一个Android、IOS双端开发者,或者成为谷歌新系统Fuchsia开发者!不管怎么样,会让你的技能池更加丰富,让你变的更强大!

    拥抱变化,才能把握机会!不学习就落后,落后就挨打!


    我们已经知道Flutter是什么了,那么它有哪些特点呢? 它能做什么呢?

    • Fast development(快速开发)

    Flutter’s hot reload helps you quickly and easily experiment, build UIs, add features, and fix bugs faster. Experience sub-second reload times, without losing state, on emulators, simulators, and hardware for iOS and Android.

    Flutter的热加载可以帮助你快速简单的尝试,构建UI,添加功能或者快速的修复BUG。你可以在任何具备IOS或Android的硬件的模拟器上体验不要一秒的重载时间,并且不会丢失任何状态! 
    这里写图片描述

    • Expressive, beautiful UIs(漂亮的UI)

    Delight your users with Flutter’s built-in beautiful Material Design and Cupertino (iOS-flavor) widgets, rich motion APIs, smooth natural scrolling, and platform awareness.

    你的用户会感到高兴,因为Flutter内置的Material Design设计和Cupertino (iOS-flavor)控件,拥有丰富的api,能平滑滚动,并能保留了平台的特性

    这里写图片描述 这里写图片描述

     

    •  
    • Modern, reactive framework(时髦而高效) 

     

    Easily compose your UI with Flutter’s modern reactive framework and rich set of platform, layout, and foundation widgets. Solve your tough UI challenges with powerful and flexible APIs for 2D, animation, gestures, effects, and more. 
    Flutter是个时髦而高效的UI框架,它有丰富的平台特性,布局,基础控件。它的2D,动画,手势,感应等强大的API,灵活使用,能解决你头疼的UI问题!

    
     
    1. //官方示例代码

    2. class CounterState extends State<Counter> {

    3. int counter = 0;

    4.  
    5. void increment() {

    6. // Tells the Flutter framework that state has changed,

    7. // so the framework can run build() and update the display.

    8. setState(() {

    9. counter++;

    10. });

    11. }

    12.  
    13. Widget build(BuildContext context) {

    14. // This method is rerun every time setState is called.

    15. // The Flutter framework has been optimized to make rerunning

    16. // build methods fast, so that you can just rebuild anything that

    17. // needs updating rather than having to individually change

    18. // instances of widgets.

    19. return new Row(

    20. children: <Widget>[

    21. new RaisedButton(

    22. onPressed: increment,

    23. child: new Text('Increment'),

    24. ),

    25. new Text('Count: $counter'),

    26. ],

    27. );

    28. }

    29. }

    • Unified app development

    Flutter has the tools and libraries to help you easily bring your ideas to life on iOS and Android. If you don’t have any mobile development experience, Flutter is an easy and fast way to build beautiful mobile apps. If you are an experienced iOS or Android developer, you can use Flutter for your views and leverage much of your existing Java/ObjC/Swift investment.

    Flutter 的工具和库,可以帮助你在IOS和Android上轻松实现生活上的想法。如果你没有任何移动开发经验,你可以学习Flutter来简单、快捷的构建漂亮的移动端应用程序。如果你是一个有经验的iOS和Android开发人员,您可以使用Flutter利用你现有的代码(Java,ObJC、Swift)进行开发!

    很厉害!为了让你好好使用这个框架,谷歌兼容了你现有的代码 

    想详细了解Flutter的特性你可以去官网逛逛 

    看了Fluter的特性之后,你是否对Flutter已经感兴趣?是否跃跃欲试!是的话请您继续看,我们开始配置环境!


    Fluter环境配置

    1、系统配置

    • Windows 7 及以上并且 64位
    • 除了Android Studio占用的空间,硬盘剩余空间必须大于40MB
    • Flutter依赖命令行工具,所以你必须有GIT环境,并且有GIT命令面板可以使用

    2、获取Flutter SDK

    打开你的GIT命令面板,输入:

    git clone -b beta https://github.com/flutter/flutter.git
    • 1

    通过镜像获取SDK 
    获取成功之后,需要配置环境变量,只需要把flutter\bin 加入到path路径当中即可(请复制完整的路径) 
    然后在CMD命令中输入

    flutter doctor
    • 1

    检查你的依赖是否已经下载成功。

    • 这个命令不能在第三方的命令控制面板(shell)比如GIT上输入,请使用电脑自带的CMD面板

    • 如果显示命令不存在,则说明环境没配置成功,需要重新配置或者重启计算机

    • 如果现实出错,别放弃,多试几次

    成功之后相关的依赖应该已经下载成功,环境配置也基本成功。Flutter支持的Android最低版本的手机是4.1,你也可通过命令查看手机是否支持

    3、设置你的手机

    • 打开手机的开发者模式,开启USB调试功能,把手机跟电脑连接

    • 输入在命令板上输入

    flutter devices
    • 1

    即可查看手机相关信息,即代表手机支持。

    • 模拟器也可以用这个命令,但是需要注意的是谷歌推荐 x86 或者 x86_64

    其实环境很好配置,下载flutter的SDK,然后加入到环境变量中即可

    以上操作已经完成,我们可以设置我们的IDE了

    设置Flutter IDE

    • 1、下载Android Studio 3.0或者更高版本,当然你也可以使用 IntelliJ:

      • IntelliJ IDEA Community, version 2017.1 or later. 
        IntelliJ IDEA Ultimate, version 2017.1 or later.
    • 下载Flutter 和Dart插件

    Flutter用于开发者的工作,比如编译调试等。Dart用于编码,解析 
    下载步骤:(1)打开Android Stsudio (2)打开插件设置(Preferences>Plugins) (3)选择Browse repositories,然后选择Flutter,点击下载(4)提示下载Dart的时候选择Yes(5)重启IDE

    Hellord

    创建一个新的Flutter的应用,运行,并学习如何用热重载进行更改。

    • 选择File>New Flutter Project
    • 选择项目类型为Fluter应用,下一步
    • 输入项目名称,并下一步
    • 点击finish
    • 等待Android Studio下载SDK,并创建项目

    * 一般创建的app是使用的Material组建*

    **在你的项目中,你的app的代码是lib/main.dart

    看看AndroidStudio的toolbar 
    看看AndroidStudio的toolbar,可以选择手机版本,手机型号,然后点击run,就可以把项目运行到手机上了

    然后可以试试Flutter的热重载能力:

    • 改变字符:
    
     
    1. 'You have pushed the button this many times:' to

    2. 'You have clicked the button this many times:'

    • 1
    • 2
    • 不要点击Stop,让你的app继续运行
    • 然后点击 Save All (cmd-s / ctrl-s),或者点击Reload按钮我们立刻就可以看到内容改变,非常方便高效

    基于以上,我们已经了解了Flutter是什么,它的特性,以及环境配置和简单的尝试

    下一次内容我们会分享如何构建一个Flutter APP

    当然你也可以访问官网查看学习资料进行学习:官网

    展开全文
  • flutter基础教程

    万人学习 2020-05-08 15:32:59
    Flutter基础入门视频教程,Flutter是谷歌的移动UI框架,可以快速在iOS和Android上构建高质量的原生用户界面。通过这门课程的学习使得大家掌握使用flutter来编写跨平台移动客户端应用。
  • 为大家学习Flutter,阿里操碎了心

    万次阅读 多人点赞 2019-02-17 00:35:32
    本文转载自公众号 鸿洋国内在实践Flutter以及对外分享方面,闲鱼可以说一直位于前列,不断输出了非常多的实践类文章,例如大家可以在羽雀的网站看到他们对外的Flutte...
        

    本文转载自公众号  鸿洋


    国内在实践Flutter以及对外分享方面,闲鱼可以说一直位于前列,不断输出了非常多的实践类文章,例如大家可以在羽雀的网站看到他们对外的Flutter技术文章:


    https://www.yuque.com/xytech/flutter


    640?wx_fmt=png


    此外,最近在逛github时,又发现了一个非常良心的项目,然后我就顺手装了一下apk。


    可以说真的为大家学习Flutter操碎了心:

    https://github.com/alibaba/flutter-go


    打开app的介绍:


    由“阿里拍卖”前端团队几位Flutter粉丝,用业余时间开发的一款,用于Flutter教学帮助的App,这里没有高大尚的概念,只有一个一个亲身经历的尝试,用最直观的方式展示Flutter官方Demo.


    大家都了解,学习Flutter一方面是新增Widget非常多,看几篇入门例子,可以牵扯出几十个没见过的Widget:


    640?wx_fmt=jpeg


    就像这样,这是我在看入门的几篇文章时,简单画的UML图,把一些陌生的类都标识出来。


    每个Widget所支持的属性都想搞明白还是比较费力的,刚好这个开源项目,就包含这样一个特点:


    • 详解常用的Widget多大140+个

    • 持续迭代追新官方版本(我说这几位大哥,你们可别离职了...)

    • 配套Demo详解Widget用法

    • 一站式搞定所有常用的Widget


    切换到组件Tab,就可以看到Widget的大类了:


    640?wx_fmt=png


    640?wx_fmt=png


    例如,我想看看Flutter的Tab说明与用法:


    640?wx_fmt=png


    下面展示的不是图,而是真正的组件用法,是可以交互的,也就是说,你可以在开源项目中找到其源码示例。


    例如,如果大家运行过Flutter的第一个demo,那么一定知道Scaffold这个类,这个类中属性可不少:


    640?wx_fmt=png


    好了,还有一个非常赞的功能:


    就是业界出现过非常多的Flutter的教程,例如我的老朋友张风捷特烈就写过一个系列,这个app还收集了大部分在网络上的Flutter文章:


    640?wx_fmt=png


    滑了半天才滑完,数量非常多...我要思考下要不要抓个包,也收录一波去wanandroid.com,供大家在PC端查看...


    好了,因为是开源项目,而且是团队形式对外的,所以一般情况下迭代已经对于issue的维护都比较好,大家有什么建议也可以直接以issue方式提供给开发团队。


    640?wx_fmt=png


    最后,真心感谢这类对外的分享,着实能为广大开发者省下不少时间!


    https://github.com/alibaba/flutter-go


    项目首页就有Android包下载地址。


    另外大家也可以复制这个链接到浏览器体验:

    http://www.wanandroid.com/blogimgs/927cbde1-6f10-4ff4-986c-446f35e13d63.apk


    此外,有些作者定了非常完善的学习规划,并且将产物在github上以仓库形式对外的,可以联系我,很乐意分享给大家!




    喜欢本文的朋友们,欢迎长按下图关注订阅号程序员小灰,收看更多精彩内容


    640?wx_fmt=jpeg

    展开全文
  • * flutter 中 Scaffold 使用精讲* flutter 中 Text 使用精讲* flutter 中 TextField 使用精讲* flutter 中 button 使用精讲* flutter 中 Row 使用精讲* flutter 中 Column 使用精讲* flutter 中 ...
  • Flutter Dart语法学习

    2020-07-22 18:36:42
    开发FlutterApp之前我们肯定要先了解Dart这门语言及语言的特性、语法等。最近看了大量的 Dart语言相关内容,本章会来简述。 目录 概念及优点 变量 函数 闭包 异步支持 概念及优点: Dart: Google及全球的其他...

    Dart

    开发FlutterApp之前我们肯定要先了解Dart这门语言及语言的特性、语法等。最近看了大量的

    Dart语言相关内容,本章会来简述。
    目录

    • 概念及优点
    • 变量
    • 函数
    • 闭包
    • 异步支持
    概念及优点:
    • Dart:
      Google及全球的其他开发者,使用 Dart 开发了一系列高质量、 关键的 iOS、Android 和 web 应用。 Dart 非常适合移动和 web 应用的开发。

    1.高效

    Dart 语法清晰简洁,工具简单而强大。 输入检测可帮助您尽早识别细微错误。 Dart 拥有久经考验的 核心库(core libraries) 和一个已经拥有数以千计的 packages 生态系统

    2.快速

    Dart 提供提前编译优化,以在移动设备和 web 上实现可预测的高性能和快速启动。

    3.可移植

    Dart 可以编译成 ARM 和 x86 代码,因此 Dart 移动应用程序可以在 iOS,Android 及 更高版本上实现本地运行。 对于 web 应用程序,Dart 可以转换为 JavaScript。

    4.易学

    Dart 是面向对象的编程语言,语法风格对于许多现有的开发人员来说都很熟悉。了解Java、JS语言 ,使用 Dart 也就很简单,也有Swift的一些特性。

    5.响应式

    Dart 可以便捷的进行响应式编程。由于快速对象分配和垃圾收集器的实现, 对于管理短期对象(比如 UI 小部件), Dart 更加高效。 Dart 可以通过 Future 和 Stream 的特性和API实现异步编程。

    变量
    • var
      自动推断类型(这点与OC、Java不同),接收任何类型的的变量,但是一旦赋值,类型就不能改变,即本来是字符串,之后就只能是字符串(这点与JS不同)。
    var a = "字符串";
    //主意:如果这样就会报错,类型在第一次指定后就不能改变
    a = 1;
    

    原因:Dart是强类型语言,任何变量都有各自的类型,编译时会根据首次赋值数据的类型来推断其类型,编译结束后其类型不能更改。JS是纯粹的弱类型脚本语言,var只是变量的声明。

    • dynamic

    dynamic与var一样都是关键词,声明的变量可以赋值任意类型对象。声明的变量可以在后期改变赋值类型。即本来是字符串,之后可以赋值为number等其他类型。

    dynamic a = "字符串";
    //不会报错
    a = 1;
    
    • Object

    Object与dynamic一样也是声明的变量可以赋值任意类型对象,声明的变量可以在后期改变赋值类型。

    Object b = "hello world";
    //不会报错
    b = 10;
    

    不同之处,dynamic声明的对象编译器会提供所有可能的组合,至少不会报错(但有可能运行时会因为找不到之前预制的组合,造成崩溃), 而Object声明的对象只能使用Object的属性与方法, 否则编译器会报错。

    dynamic a = "";
    Object b = "";
    //编译器不报错,不警告。
    print(a.length);
    //编译器会警告报错(Object没有length的getter方法):The getter 'length' is not defined for the class 'Object'
    print(b.length);
    

    注意:dynamic可以理解为id类型,任何类型都可以转换成id(dynamic)类型,可以用id(dynamic)去接,编译器不会报错,但是在运行时可能会产生错误出现崩溃现象。

    • final

    final 为运行时常量。

    final修饰的常量必须在声明的时候就进行初始化,而且在初始化之后值不可变

    final a = "名字";
    //会报错
    a = "性别";
    
    • const

    const 为编译时常量。
    const不仅仅可以声明常数变量,也可以声明常量值以及声明创建常量值的构造函数,任何变量都可以有一个常量值;

    final aList = const[];
    const bList = const[];
    var cList = const[];
    
    这里的aList和bList就是两个空的、不可变的列表集合,而cList则是空的、可变的列表集合;
    需要注意的是:cList可以重新赋值,可以改变,而aList和bList不可以重新赋值;
    
    • 函数
      Dart是面向对象的语言,所以即使是函数也是对象,并且有一个类型Function。这意味着函数可以赋值给变量或作为参数传递给其他函数,这是函数式编程的典型特征。

    1.函数声明

    返回类型  方法体  (参数1,  参数2, ...){
        方法体...
        return 返回值
    }
    
    String getPerson(String name, int age){
      return name + '${age}';
    }
    
    //如果返回类型不指定时,此时默认为dynamic。
    
    

    2.箭头函数

    对于只包含一个表达式的函数,可以使用简写语法。

    getPerson(name,  age) => name+ ', $age' ; 
    
    bool isNoble (int atomicNumber)=> _nobleGases [ atomicNumber ] != null ;
    

    3.函数作为变量(方法对象)、入参

    //函数作为变量
    var  method1 = (str){
    print(str)
    };
    method1("kakalala");
    
    //函数作为参数
    void execute(var callbackMethod){
    callbackMethod();
    }
    //两种
    execute(() => print("xxx"));
    execute(method1("kakalala"));
    

    4.可选参数(可选位置参数、可选命名参数)

    • 可选位置参数:[param1, param2, …],可以设置默认参数
      包装一组函数参数,用[]标记为可选的位置参数,并放在参数列表的最后面:
    getPerson(String name, [int age = 99, String gender = "御姐"]){
      print ("name = $name, age = $age, gender = $gender");
    }
    
    //getPerson() ;这种不传参是会报错的。
    getPerson(null) ;
    getPerson('不知火') ;
    getPerson('不知火', 100);
    getPerson('不知火', null,  "萝莉");
    
    

    控制台输出

    flutter: name = null, age = 99, gender = 御姐
    flutter: name = 不知火, age = 99, gender = 御姐
    flutter: name = 不知火, age = 100, gender = 御姐
    flutter: name = 不知火, age = null, gender = 萝莉
    

    注意:name参数是必须传入的,否则会报错。后边的可选位置参数如果不传会是null,传null还是会返回null。可选位置参数可以设置默认参数。

    • 可选命名参数:{param1, param2, …}
      在传入的时候,需要指定下对应的参数名,放在参数列表的最后面,用于指定命名参数。可以设置默认参数。
    getPerson(String name, {int age = 100, String gender = "狼狗"}){
      print("name = $name, age = $age, gender = $gender");
    }
    
    //getPerson() ;这种不传参是会报错的。
    getPerson(null) ;
    getPerson('烬天玉藻前') ;
    getPerson('烬天玉藻前', age: 99 );
    getPerson('烬天玉藻前', gender: "御姐" );
    getPerson('烬天玉藻前', age: 99, gender: "奶狗");
    

    控制台输出:

    flutter: name = null, age = 100, gender = 狼狗
    flutter: name = 烬天玉藻前, age = 100, gender = 狼狗
    flutter: name = 烬天玉藻前, age = 99, gender = 狼狗
    flutter: name = 烬天玉藻前, age = 100, gender = 御姐
    flutter: name = 烬天玉藻前, age = 99, gender = 奶狗
    

    注意:固定参数必须传入(那怕传个null),可选命名参数可以设置默认参数。

    • 默认参数值

    默认参数值即我们在方法的参数列表上面使用 “=” 号给入一个常量值,如果没有传入该值的时候,就使用我们给入的常量值。

    注意,不能同时使用可选的位置参数和可选的命名参数
    //这种是不可以的,错误事例。
    getPerson(String name, {int age = 100, String gender = "狼狗"}, [int age2 = 1002, String gender2 = "狼狗2"]){
     
    }
    
    闭包

    闭包是一个方法(对象),闭包定义在其它方法内部,能够访问外部方法的局部变量,并持有其状态。

    void main() {
    
        // 创建一个函数add1,返回加2
        Function add1 = addNum(2);
        
        // 创建一个函数add2,返回加4
        Function add2 = addNum(4);
    
        // 2 + 3 = 5
        print(add1(3));
        // 4 + 3 = 7
        print(add2(3));
    }
    
    // 返回一个函数对象,功能是返回累加的数字
    Function addNum(int addBy){
        return (int i) => addBy + I;
    }
    

    控制台输出:

    flutter: 5
    flutter: 7
    
    异步支持

    Dart代码运行在一个单线程,如果Dart代码阻塞了—例如,程序计算很长时间,或者等待I/O,整个程序就会冻结。

    Dart异步函数:Future、Stream,设置好耗时操作后返回,不会阻塞线程。

    async和await关键词支持了异步编程,允许写出和同步代码很像的异步代码。

    Future

    Future与JS中的Promise和Swift的RXSwift非常相似,其语法也是链式函数调用,该函数异步操作执行后,最终返回成功(执行成功的操作)、失败(捕获错误或者停止后续操作),失败和成功是对立的只会出现一种。

    注意:Future 的所有API的返回值都是一个Future对象,所以可以进行链式调用。

    • Future构造函数

    Future(FutureOr computation())
    computation 的返回值可以是普通值或者是Future对象,但是都是Future对象接收

     Future<num> future1 = Future(() {
      print('async call1');
      return 123;
    });
    //直接调用
    future1.then((data) {
      //执行成功会走到这里
      print(data);
    }, onError: (e) {
      print("onError: \$e");
    }).catchError((e) {
      //执行失败会走到这里
      print(e);
    }).whenComplete(() {
      //无论成功或失败都会走到这里
    });
    
    Future<Future> future2 = Future((){
        print('async call2');
        return future1;
    });
    
    //嵌套调用
    future2.then((value) => value).then((value) => {
       print('222---'+value.toString())
    });
    

    控制台打印

    Reloaded 1 of 499 libraries in 154ms.
    flutter: async call1
    flutter: 123
    flutter: async call2
    flutter: 222---123
    

    注意:computation函数体中的代码是被异步执行的,与JS中Promise构造函数的回调执行时机不一样,如需要被同步执行,则使用如下这个命名构造函数:

    Future.sync(FutureOr computation())

    //该段代码放到上边代码之后执行
    Future<num> future3 = Future.sync((){
        print('sync call');
        return 333;
    });
    
    future3.then((value) => {
       print('sync'+'$value')
    });
    

    控制台输出

    flutter: sync call
    flutter: sync333
    flutter: async call1
    flutter: 123
    flutter: async call2
    flutter: 222---123
    

    由此可见,future3(sync)方法会先执行,之后在执行之前的future1、future2.可见正常的future中的computation函数体中的代码是被异步执行的。

    • Future.then
      then中接收异步结果
    Future.delayed(new Duration(seconds: 2),(){
       return "延迟2s执行";
    }).then((data){
       print(data);
    });
    
    • Future.catchError

    捕获错误

    Future.delayed(new Duration(seconds: 2),(){
       //return "延迟2s执行";
       throw AssertionError("Error");  
    }).then((data){
       //执行成功会走到这里  
       print("success");
    }).catchError((e){
       //执行失败会走到这里  
       print(e);
    });
    

    在异步任务中抛出了一个异常,then的回调函数将不会被执行, catchError回调函数将被调用;并不是只有 catchError回调才能捕获错误,then方法还有一个可选参数onError(之前介绍结构体时已经提到),我们也可以它来捕获异常:

    Future.delayed(new Duration(seconds: 2), () {
        //return "延迟2s执行";
        throw AssertionError("Error");
    }).then((data) {
        print("success");
    }, onError: (e) {
        print(e);
    });
    
    • Future.whenComplete

    不管成功失败都要处理事件的场景,会调用此方法,比如在网络请求前弹出加载对话框,在请求结束后关闭对话框。这种场景,有两种方法,第一种是分别在then或catch中关闭一下对话框,第二种就是使用Future的whenComplete回调:

    Future.delayed(new Duration(seconds: 2),(){
       //return "延迟2s执行";
       throw AssertionError("Error");
    }).then((data){
       //执行成功会走到这里 
       print(data);
    }).catchError((e){
       //执行失败会走到这里   
       print(e);
    }).whenComplete((){
       //无论成功或失败都会走到这里
    });
    
    • Future.wait

    需要等待多个异步任务都执行结束后再统一进行一些操作(比如我们有一个界面,需要先分别从两个网络接口获取数据,获取成功后,我们需要将两个接口数据进行特定的处理后再显示到UI界面上)
    Future.wait就是做这件事的(类似RXswift的zip函数),它接受一个Future数组参数,只有数组中所有Future都执行成功后,才会触发then的成功回调,只要有一个Future执行失败,就会触发错误回调。

    Future<List<Future>> future4 = Future.wait([
     // 2秒后返回结果  
     Future.delayed(new Duration(seconds: 2), () {
       return "延迟2s执行";
     }),
     // 4秒后返回结果  
     Future.delayed(new Duration(seconds: 4), () {
       return " 延迟4s执行";
     })
    ])
    
    future4.then((value) => {
    print(value[0]+ value[1]);
    }).catchError((e){
     print(e);
    });
    

    控制台输出

    //等待4s输出
    flutter: 延迟2s执行 延迟4s执行
    
    • 回调地狱(Callback Hell)
      代码中有大量异步逻辑,并且出现大量异步任务依赖其它异步任务的结果时,必然会出现回调中套回调情况。我们需要使用async/await和Future.then来解决这种问题。
      使用场景:大量依赖的业务逻辑,登录流程逻辑等
      先来看下回调地狱例子:
    //先分别定义各个异步任务
    Future<String> future1(String str1){
        ...
    //第一个任务
    };
    Future<String> future2(String str2){
        ...
    //第二个任务
    };
    Future future3(String info){
        ...
        // 第三个任务
    };
    
    future1("str1").then((str2){
     //1返回数据,作为2的参数
     future2(str2).then((info){
        //2的返回数据,作为3的入参
        future3(info).then((){
           //获取3的返回数据
            ...
        });
      });
    })
    

    Future消除Callback Hell
    使用Future的链式机制,依次向下就避免了嵌套。跟JS的Promise完全一样。不足之处是还是有一层回调。

    future1("str1").then((str2){
          return future2(str2);
    }).then((info){
        return future3(info);
    }).then((e){
       //执行3接下来的操作 
    }).catchError((e){
      //错误处理  
      print(e);
    });
    

    async/await消除callback hell
    上边的方式虽然避免了嵌套,但是在每个方法还是有一层回调。我们可以使用async/await来实现像同步代码那样来执行异步任务而不使用回调的方式。

    task() async {
       try{
        String str2 = await future1("str1");
        String info = await future2(str2);
        await future3(info);
        //执行接下来的操作   
       } catch(e){
        //错误处理   
        print(e);   
       }  
    }
    
    • async/await
      async用来表示函数是异步的,定义的函数会返回一个Future对象,可以使用then方法添加回调函数

    await 后面是一个Future,表示等待该异步任务完成,异步完成后才会往下走;await必须出现在 async 函数内部。

    async/await将一个异步流用同步的代码表现出来。

    async/await只是一个语法糖,JS编译器或Dart解释器最终都会将其转化为一个JS的Promise和Dart的Future的调用链。

    Stream

    如果说Future是可以接收单个异步事件返回单个事件的成功失败,那么Stream就可以接收多个异步事件,并返回多个事件的成功失败,供使用者使用。
    使用场景:多次读取数据的异步任务场景,如网络内容下载、文件读写等
    该例子借助了其他地方的例子。

    Stream.fromFutures([
      // 1秒后返回结果
      Future.delayed(new Duration(seconds: 1), () {
        return "hello 1";
      }),
      // 抛出一个异常
      Future.delayed(new Duration(seconds: 2),(){
        throw AssertionError("Error");
      }),
      // 3秒后返回结果
      Future.delayed(new Duration(seconds: 3), () {
        return "hello 3";
      })
    ]).listen((data){
       print(data);
    }, onError: (e){
       print(e.message);
    },onDone: (){
    
    });
    

    控制台输出

    flutter: hello 1
    flutter: Error
    flutter: hello 3
    

    Future.wait是函数中存在多个延时操作,则以延时最长操作完成后统一返回,其他的延时操作等待最长的延时操作完成。

    async/await:处理多个异步操作,前后有依赖逻辑的,使用异步实现同步。

    Stream:统一监听该Stream中的多个异步延时操作返回,相当于之前的多个Future异步处理统一监听。

    • 其中Future和Stream只做了常用的方法和函数的介绍,更详细的会在之后依次给大家做下总结。

    到这里大概把Dart中经常使用的语法和属性方法介绍了一遍,有错误或者理解不到位的地方,可以提出,共同进步。

    Dart相比Java和JavaScript还是有许多优点有优势的,Dart既能进行服务端脚本、APP开发、web开发,但是生态目前不足,不过Flutter目前火热,相信生态之后会越来越好。

    展开全文
  • 参考资料:... 举个例子,我们想从Native端请求Flutter端的一个getFlutterName方法获取一个字符串。在Flutter端你需要给MethodChannel设置一个MethodCallHandler: platform.setMethodCallHandler...

    参考资料:https://blog.csdn.net/julystroy/article/details/87367520

     

    举个例子,我们想从Native端请求Flutter端的一个getFlutterName方法获取一个字符串。在Flutter端你需要给MethodChannel设置一个MethodCallHandler:

    platform.setMethodCallHandler(platformCallHandler);
    
    Future<dynamic> platformCallHandler(MethodCall call) async {
        switch (call.method) {
                case "getFlutterName":
                return "Flutter name flutter";
                break;
        }
    }

    Dart端:核心关键就是直接return 需要返回的数据即可!

     

    Java端:就是用CallBack的形式来接收返回的数据:

    mChannel.invokeMethod(RCMethodList.MethodCallBackGetUserInfo, userId, new Result() {
                @Override
                public void success(@Nullable Object arg) {
                    if (arg instanceof Map) {
                        Map map = (Map) arg;
                        String userId = (String) map.get("userId");
                        String name = (String) map.get("name");
                        String portraitUri = (String) map.get("portraitUrl");
                        UserInfo userInfo = new UserInfo(userId, name, Uri.parse(portraitUri));
                        flutterCallBack.success(userInfo);
                    }
                }
    
                @Override
                public void error(String s, @Nullable String s1, @Nullable Object o) {
                    flutterCallBack.error("获取用户信息失败:" + s, null);
                }
    
                @Override
                public void notImplemented() {
                    flutterCallBack.error("flutter 端没有实现getUserInfoByUserId接口", null);
                }
            });

     

    转载于:https://www.cnblogs.com/hbolin/p/11169020.html

    展开全文
  • flutter: 加载与运行Dart

    2019-07-20 00:01:57
    环境: flutter sdk v1.7.8+hotfix.3@stable 对应 flutter engine: 54ad777fd29b031b87c7a68a6637fb48c0932862 在建立异步线程与消息循环之后,自然就是运行应用脚本,也就是dart文件。这一部分感觉很庞大而且...
  • 在使用 Flutter 开发的过程中,我们可能需要进行数据的页面之间的传递、共享或者全局的一个事件、状态管理和监听。那么这节博客我们将介绍 Flutter 中实现数据共享与传递的方法,并配合实例进行详细讲解。 1.In...
  • 面试官:你有用过Flutter吗? Flutter架构是怎么样,为什么会比其他如ReactNative好心理分析:面试官所在的项目是用Flutter 开发的,或者正在转Flutter这种技术。如果你不会,面试官在第一眼会认为后面来应聘的人或许...
  • 2020我们为什么要掌握 Flutter

    千次阅读 2020-04-24 10:33:17
    移动开发技术手段从原始的原生应用开发,到 Google...不过这些方案或多或少都有一些局限性和缺点,于是 Google 推出了新的跨平台移动应用开发技术:Flutter。 为什么说 Flutter 将是未来的主流跨平台开发框架? Goog...
  • flutter的一些认识

    千次阅读 2018-06-04 16:57:18
    官方文档也大致看了两遍,写了几天的flutter,基本上对于flutter有了一些认识那么flutter 是什么:它是google的一套跨平台框架,使用dart语言,支持android,ios,貌似还支持html5,但html5 这块还没有去实践,就不...
  • 为什么说flutter是未来移动技术的发展趋势

    万次阅读 多人点赞 2018-07-02 21:16:11
    其实我也并不认为flutter一定是移动技术未来的发展趋势,但是可以确定的说,flutter的方向是没有问题的。即使它不会是成为下一个跨平台技术,也会有一个相似的技术来统治移动平台的发展.下面来阐述为什么flutter是一...
  • Flutter实战一Flutter聊天应用(汇总)

    万次阅读 2017-11-22 16:38:14
    纸聊这个应用程序使用Google的Flutter移动框架开发,是一个实时聊天应用程序,为了能专注于APP设计,应用程序的服务端使用Googler的Firebase平台。程序程序的名称为纸聊,意为像传递小纸条一样的简约聊天,登录后...
  • flutter devices 或其他flutter命令时,报错如下: Waiting for another flutter command to release the startup lock... 解决方案 关闭Android Studio 打开flutter安装目录/bin/cache 删除lockfile文件 此时可...
  • flutter配置国内镜像

    万次阅读 2019-01-15 16:31:20
    flutter工程首次运行时需要获取依赖包,此时需要使用全局vpn,或者使用国内镜像。 linux下配置全局环境变量 export PUB_HOSTED_URL=https://pub.flutter-io.cn export FLUTTER_STORAGE_BASE_URL=...
  • flutter Icons全部图标

    万次阅读 2019-02-24 10:46:00
    有的时候想使用图标却不知道有没有该图标,记录下网址: https://material.io/tools/icons/?icon=account_balance&amp;style=baseline
  • Flutter 延时执行

    万次阅读 2019-09-03 19:27:55
    // 延时1s执行返回 Future.delayed(Duration(seconds: 1), (){ Navigator.of(context).pop(); });
  • 运行flutter doctor 提示 Waiting for another flutter command to release the startup lock 查了一下github的flutter issue 找到了解决方法,如下: 1、打开flutter的安装目录/bin/...
  • Flutter图表库的使用

    万次阅读 2018-07-13 16:16:06
    Flutter图表库的使用 可以看前面的基础哦! 一,Flutter三天学习基础——-一天搞定项目 二,Flutter三天学会之后模仿美团界面 一,如下图: 版本:charts_flutter: “^0.3.0” 库里面封装了各种图标控件...
1 2 3 4 5 ... 20
收藏数 48,867
精华内容 19,546
关键字:

flutter