范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

每个flutter开发人员都要知道的16个dart技巧

  本文分享我在flutter编程中的重要技巧,学会了您的代码风格将得到很大提高。  1. 你知道吗,Dart 支持字符串乘法。
  下面的例子如何用字符串乘法打印圣诞树  void main() {   for (var i = 1; i <= 5; i++) {     print("" * i);   } } // Output: //  //  //  //  //
  是不是很酷?
  你可以用它来检查在 Text widget中文本的长度是否合适。  Text("You have pushed the button this many times:" * 5)2. 需要同时执行多个Future? 使用 Future.wait.
  Consider this mock API class that tells us the latest numbers of COVID cases:  // Mock API class class CovidAPI {   Future getCases() => Future.value(1000);   Future getRecovered() => Future.value(100);   Future getDeaths() => Future.value(10); }
  要同时执行这些future, 使用 Future.wait。参数需要  「futures」  的list并且会返回一个  「future」  的  「list」 :  final api = CovidAPI(); final values =await Future.wait([     api.getCases(),     api.getRecovered(),     api.getDeaths(), ]); print(values); // [1000, 100, 10]
  当Future是 「独立的」 并且不需要 「顺序」 执行时,这样做起来就很理想。  3. 可以在Dart的class中实现一个 "call"方法,这样我们就可以像调用方法一样调用类。
  下面是一个 PasswordValidator class:  class PasswordValidator {   bool call(String password) {     return password.length > 10;   } }
  我们定义了一个call 方法, 再定义一个类的实例就可以像使用函数一样使用它:  final validator = PasswordValidator(); // can use it like this: validator("test"); validator("test1234"); // no need to use it like this: validator.call("not-so-frozen-arctic");4. 需要调用回调方法,但前提是回调方法不为空?使用 "?.call()" 语法。
  在下面的列子中我们定义了一个widget,并且要在事件触发时调用onDragCompleted 回调:  class CustomDraggableextends StatelessWidget {   const CustomDraggable({Key key, this.onDragCompleted}) : super(key: key); final VoidCallback? onDragCompleted;     void _dragComplete() {     // TODO: Implement me   }   @override   Widget build(BuildContext context) {/*...*/} }
  为了调用回调函数,我们可能要写如下的代码:    void _dragComplete() {     if (onDragCompleted != null) {       onDragCompleted();     }   }
  但是我们可以使用如下的简单语法 (使用 ?.):    Future _dragComplete()async {     onDragCompleted?.call();   }5. 使用匿名函数和函数作为参数
  在Dart中, 函数是一等公民,并且能够作为其他函数的参数。
  下面演示了定义一个匿名函数,并且赋值给 sayHi 变量:  void main() {   final sayHi = (name) => "Hi, $name";   welcome(sayHi, "Andrea"); }   void welcome(String Function(String) greet, String name) {   print(greet(name));   print("Welcome to this course"); }
  将 sayHi 作为变量传给 welcome 方法的greet参数。
  String Function(String) 是 一个函数 「类型」  ,带有 String 参数 并且返回 String类型。 因为上面的匿名函数具有相同的  「signature」 , 所以能够直接作为参数传递。
  在list的 map, where, reduce 等操作时,这样的代码风格很常见。
  举个计算数的平方的例子:  int square(int value) {   // just a simple example   // could be a complex function with a lot of code   return value * value; }
  计算出数组的所有平方:  const values = [1, 2, 3];   values.map(square).toList();
  这里使用 square 作为参数,因为square的 signature是符合map 操作期望的。所以我们可以不使用下面的匿名函数:  values.map((value) => square(value)).toList();6. 可以将 collection-if 和 spreads 与列表、集合和map一起使用
  Collection-if and spreads 在我们写代码时非常有用。
  这些其实也可以和map一起使用。
  看下面的例子:  const addRatings = true; const restaurant = {   "name" : "Pizza Mario",   "cuisine": "Italian",   if (addRatings) ...{     "avgRating": 4.3,     "numRatings": 5,   } };
  我们定义了一个 restaurant 的map, 并且只有当 addRatings 是 true的时候才会添加 avgRating and numRatings 。 因为超过了一个key-value,所以需要使用 spread 操作符 (...)。  7. 如何以 null-safe的方法遍历整个map? 使用.entries:
  看下面的一个例子:  const timeSpent = {   "Blogging": 10.5,   "YouTube": 30.5,   "Courses": 75.2, };
  下面是循环遍历key-value:  for (var entry in timeSpent.entries) {   // do something with keys and values   print("${entry.key}: ${entry.value}"); }8. 使用命名构造函数 和 初始化列表使API更简洁.
  比如我们要定义一个温度的类。
  需要让我们的类支持 「两个」 摄氏和华氏两种命名构造函数:  class Temperature {   Temperature.celsius(this.celsius);   Temperature.fahrenheit(double fahrenheit)     : celsius = (fahrenheit - 32) / 1.8;   double celsius; }
  该类只需要一个变量来表示温度,并使用初始化列表将华氏温度转换为摄氏温度。
  我们在使用时就可以像下面这样:  final temp1 = Temperature.celsius(30); final temp2 = Temperature.fahrenheit(90);  9. Getters and setters
  在上面的 Temperature 类中, celsius 用来表示温度。
  但是有些用户可能喜欢华氏温度。
  我们可以很容易通过getters and setters实现, 定义 computed 变量(学过vue的是不是感觉很熟悉). 继续看下面的例子:  class Temperature {   Temperature.celsius(this.celsius);   Temperature.fahrenheit(double fahrenheit)     : celsius = (fahrenheit - 32) / 1.8;   double celsius;   double get fahrenheit     => celsius * 1.8 + 32;   set fahrenheit(double fahrenheit)     => celsius = (fahrenheit - 32) / 1.8; }
  这下我们使用华氏温度或者摄氏温度就很容易了:  final temp1 = Temperature.celsius(30); print(temp1.fahrenheit); final temp2 = Temperature.fahrenheit(90); temp2.celsius = 28;
  提示: 使用命名构造函数、getter 和 setter 来改进类的设计。  10. 未使用的参数使用下划线表示
  举一个常见的例子 ListView.builder:  class MyListView extends StatelessWidget {   @override   Widget build(BuildContext context) {     return ListView.builder(       itemBuilder: (context, index) => ListTile(         title: Text("all the same"),       ),       itemCount: 10,     );   } }
  上面的例子中我们没有使用itemBuilder的的参数 (context, index) 。因此我们可以使用下划线代替。  ListView.builder(   itemBuilder: (_, __) => ListTile(     title: Text("all the same"),   ),   itemCount: 10, )
  注意*: 这两个参数是不同的 (_ 和 __) ,它们是 「单独的标识符。」 *  11. 一个类只需要被初始化一次 (单例模式)? 使用带有私有构造函数的静态实例变量。
  The most important property of a singleton is that there can only be  「one instance」  of it in your entire program. This is useful to model things like a file system.  // file_system.dart class FileSystem {   FileSystem._();   static final instance = FileSystem._(); }
  要在 Dart 中创建单例,您可以声明一个命名构造函数并使用_语法将其设为私有。
  然后再定一个final类型的类静态实例。
  从此,只能通过instance变量访问这个类。  // some_other_file.dart final fs = FileSystem.instance; // do something with fs
  注意:如果不小心,单例可能会导致很多问题。在使用它们之前,请确保您了解它们的缺点。   12. 想要集合中的每一项都是唯一的? 使用Set而不是 List。
  Dart中最常见的集合是 List.
  list可以有重复的项, 有些时候我们想要元素是唯一的:  const citiesList = [   "London",   "Paris",   "Rome",   "London", ];
  这时候我们就需要使用 Set (注意我们使用了 final):  // set is final, compiles final citiesSet = {   "London",   "Paris",   "Rome",   "London", // Two elements in a set literal shouldn"t be equal };
  上面的代码将产生警告,因为 London 包含了两个. 如果把set定义为 const ,代码将产生错误,并且不能编译成功:  // set is const, doesn"t compile const citiesSet = {   "London",   "Paris",   "Rome",   "London", // Two elements in a constant set literal can"t be equal };
  我们使用set时,我们可以使用 union, difference, and intersectio等API  citiesSet.union({"Delhi", "Moscow"}); citiesSet.difference({"London", "Madrid"}); citiesSet.intersection({"London", "Berlin"});13. 怎么使用 try, on, catch, rethrow, finally
  当我们使用基于Future的API时,try 和 catch 是非常有用的。
  看看下面的例子:  Future printWeather() async {   try {     final api = WeatherApiClient();     final weather = await api.getWeather("London");     print(weather);   } on SocketException catch (_) {     print("Could not fetch data. Check your connection.");   } on WeatherApiException catch (e) {     print(e.message);   } catch (e, st) {     print("Error: $e Stack trace: $st");     rethrow;   } finally {     print("Done");   } }
  有以下几点需要主要:  可以添加多个on 来捕获不同类型的异常。  最后可以添加一个 catch 来捕获上面没有处理到的异常.  使用rethrow语句将当前异常抛出调用堆栈, 「同时保留堆栈追踪。」  使用finally在Future完成后运行一些代码,无论它是成功还是失败。
  使用Future相关的API时,一定要确保异常处理  14. Future的一些常用构造函数
  Future中有一些方便的构造函数:Future.delayed,Future.value和Future.error。
  我们可以使用Future.delayed 制造一定的延迟。第二个参数是一个(可选的)匿名函数,可以用它来完成一个值或抛出一个错误:  await Future.delayed(Duration(seconds: 2), () => "Latte");
  有时我们可以创建一个 Future 并立即返回,这在测试mock数据时非常有用:  await Future.value("Cappuccino"); await Future.error(Exception("Out of milk"));
  我们可以用Future.value一个值来表示成功完成,或者Future.error表示错误。  15. 常见的 Stream 构造函数
  Stream 类也带有一些方便的构造函数。以下是最常见的:  Stream.fromIterable([1, 2, 3]); Stream.value(10); Stream.empty(); Stream.error(Exception("something went wrong")); Stream.fromFuture(Future.delayed(Duration(seconds: 1), () => 42)); Stream.periodic(Duration(seconds: 1), (index) => index);使用 Stream.fromIterable 从list创建Stream。  使用 Stream.value 从一个单一值创建。  使用 Stream.empty 创建一个空的stream。  使用 Stream.error 包含错误值的stram。  使用 Stream.fromFuture 创建一个只包含一个值的stream,并且该值将在未来完成时可用。  使用 Stream.periodic 创建周期性的事件流。  16. Sync and Async Generators
  我们可以定义一个  「synchronous」  generator(同步生成器) 函数的返回类型定义为 Iterable:  Iterable count(int n) sync* {   for (var i = 1; i <= n; i++) {      yield i;   } }
  这里使用了 sync* 语法. 在函数内部,我们可以yield多个值. 这些值将在函数完成时作为一个 Iterable 返回.
  另外, 一个 「asynchronous」  generator 需要使用 Stream作为返回值  Stream countStream(int n)async* {   for (var i = 1; i <= n; i++) {      yield i;   } }
  这里使用 async* 语法. 在函数内部,我们可以 yield 多个返回值。
  在  「asynchronous」  generator中我们也可以使用Future相关的函数:  Stream countStream(int n)async* {   for (var i = 1; i <= n; i++) {     // dummy delay - this could be a network request     await Future.delayed(Duration(seconds: 1));     yield i;   } }最后
  希望大家喜欢我提供的这写小技巧,快来使用它们来改进 Flutter 应用程序中的代码。大家可以留言告诉我,你们最喜欢哪个小技巧!!

从辉煌到没落!戴尔如今身负3000亿巨债,叱咤风云成往事随着科技的发展,时代进步的速度越来越快,无论是产业还是人,如果没有跟上时代变化的步伐,那么就很容易被抛弃。而如今的戴尔就面临着这样的一个问题。曾经在电脑市场上叱诧风云的,作为全球最真小屏旗舰三星GalaxyS10e图文评测今年的S10e是三星少有的小屏青春版的市场策略,S10e相比S10和S10缺少了一颗摄像头,屏下指纹改成了侧边指纹,屏幕分辨率也仅有FHD,但颜色更加丰富了,一共有炭晶黑皓玉白沁柠2019Q1,海尔做了这5件影响世界中央空调的大事当今这个世界正在发生着日新月异的变化,节奏一旦变慢,我们就有可能与现实生活脱轨。在日新月异方面,海尔中央空调也是当仁不让。这不,2019年还未过半,他做的这5件事就已经在影响着世界人工智能!日媒称日本官员4月赴京寻求合作中国在尖端技术研发领域持续发力。据日本共同社报道,多名中日关系消息人士28日透露,日本政府官员拟于4月2日赴京,同中国展开首次有关尖端技术合作的对话。双方将在人工智能(AI)领域以官宣!教育部批准这35所学校新增人工智能专业,有没有你母校日前,教育部印发教育部关于公布2018年度普通高等学校本科专业备案和审批结果的通知(以下简称通知)。经申报公示审核等程序,根据普通高等学校专业设置与教学指导委员会评议结果,并征求有张忠谋最新采访直言美国造芯浪费且徒劳无功来源内容来自商周,谢谢。美国布鲁金斯学会在最新Podcast中,特别邀请全球最大的晶圆代工龙头台积电创办人张忠谋,大谈他上海到美国的生平创立台积电的契机,及美国半导体制造业的瓶颈。6G时代开启!美国掌握大量主动权,日本投资300亿押宝无论任何一个领域,想要发展就离不开资金投入。我国发展这70多年来,每一个领域中我们都投入了大量的资金,甚至是任何一个企业想要做大做强,也是要有足够的资本才行。比如华为,在应聘人才这为什么说微信读书是免费读书软件中的王者1微信读书,看名字就知道是腾讯旗下的产品,这是一款在线阅读APP(用平板阅读也很不错)于2015年8月份上线,是我使用率最高的APP之一。2微信读书的slogen是让阅读不再孤独,热搜!腾讯王者荣耀海报被指涉嫌抄袭,网易旗下手游隔空喊话,相关公司火速回应持续大笔回购股票,释放积极信号?点蓝字关注,不迷路王者荣耀冲上微博热搜榜首,啥情况?4月21日,网易旗下手游时空中的绘旅人官方微博发文喊话,指腾讯旗下王者荣耀抄袭其海报。随后,王者荣耀迅速冲上微博热搜榜首。截至发LeetCode刷题实战588设计内存文件系统算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面真正的全面屏iPhone,将于2024年问世苹果专业分析师郭明琪预测有预测提出,苹果将在2024年推出的iPhone上,将会采用屏下相机人脸识别功能。苹果专业分析师郭明琪通过推特传出了上述消息。郭明琪通过推特表示我认为真正的
为颜值买单Z世代最值得入手电脑数码好物尽在京东618Z世代作为数字技术时代的原住民,自打出生起,互联网和数码产品就是他们生活的一部分。在互联网影响下,从小就接触到各种新兴事物的Z世代,酷爱IP联名装备,喜欢潮流消费,同时更愿意为颜值小米Civi自拍效果有多强?知名数码博主晒自拍,痘痘神奇的消失了小米Civi的自拍效果到底有多强?知名数码博主Eva的科技生活在社交平台晒出了自己的自拍,从第一张照片来看额头上的痘痘非常明显,看看第二张用小米Civi自拍的效果(下图),上演了神拼多多百亿补贴是真是假!我们从数码产品苹果手机找答案。大家好我乔治朱首先我们以iPhone11为例,多平台对比。苹果一直以来都是手机行业标杆。当然价格也是独一份。天猫作为苹果官方开设的旗舰店是有保障平台。可以看到苹果官方128g版本定理光映像欣然发布K卡口全画幅单反数码相机的定焦镜头理光映像欣然发布K卡口全画幅单反数码相机的定焦镜头HDPENTAXDFA21F2。4EDLimitedDCWR本产品具有为追求体现镜头味道以及高质感铝制切割的外观等,作为具有广受好星际争霸人族单位兵营SCVSCV最早效力于日联邦塔桑尼安轨道平台的重建工作,而T280型SCV现已成为执行帝国建造和修复任务的骨干力量。由于能完成各类任务包括建造新建筑修复受损建筑和单位采集和运送天然人生就是选择一路选择,一路坚持今天在读者上看到一句对怀旧的解释不是那个时代有多好,而是那个时候,你年轻。确实,年轻时代的一切,都是记忆中的美好。想起了我的中学时代。我的中学时代是短暂的。小学毕业,以全乡第三名的大象席地而坐这是人生的垃圾场这是一个关于人生破灭重生的故事。然而重生的地点都不约而同的指向满洲里,寄托在大象之中。何为大象?为什么要席地而坐呢?大概每个人的心中都带着疑问而去寻找答案。故事的四个主角,在不同的一撕得VP刘焕然新时代新机遇,用战略重构包装竞争力(ChinaIT。com讯)在Z时代,快消市场衍生出了更丰富更加精细的消费场景和渠道以满足消费者的个性化的需求,不同的消费场景和渠道要有不同的包装逻辑,从色彩到造型,从体验到功能,不妙!英雄联盟手游商标被驳回,上线时间或延迟英雄联盟是由美国拳头游戏开发,中国大陆地区腾讯游戏代理运营的英雄对战类竞技网游。自2011年发行以来,吸引了亿万玩家,也形成了独特的电子竞技文化。年前就有消息称,英雄联盟要出手机端阿里钉钉推数字化人脉,项庄舞剑还是顺势而为?这年头,中小互联网创业公司最怕的就是BAT巨头做了和自己相同的项目,或者自己做的项目被巨头盯上了,以至于创业者经常被问到的就是假如BAT做了这样的事情,你该怎么办?这个给很多创业者腾讯这座大山正在慢慢的土崩瓦解相当长的一段时间内,腾讯是中国互联网企业中一个不可超越的高度,坐拥QQ和微信两个庞大的用户群,可以轻松的获得低成本的流量,是腾讯成为中国互联网的三大山之一,巨大的低成本的流量池,也