开发中总结的dart相关的技巧,面试灵魂三问

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Web前端全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024c (备注前端)
img

正文

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函数,该函数接受一个Function参数并使用它来迎接用户。

String Function(String)是一个函数类型,它接受一个String参数并返回一个String. 因为上面的匿名函数具有相同的签名,它可以直接作为参数传递,也可以通过变量传递sayHi


使用功能等运营商时,这种编码风格是常见的mapwherereduce

例如,这是一个计算数字平方的简单函数:

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作为参数传递,因为它的签名正是 map 操作符所期望的。这意味着我们不需要用匿名函数扩展它:

values.map((value) => square(value)).toList();

6. 您可以使用 collection-if 和 spreads 与lists, sets AND maps


当您将 UI 作为代码编写时,Collection-if 和 spreads 非常有用。

但是您知道您也可以将它们与maps一起使用吗?

考虑这个例子:

const addRatings = true;

const restaurant = {

‘name’ : ‘Pizza Mario’,

‘cuisine’: ‘Italian’,

if (addRatings) …{

‘avgRating’: 4.3,

‘numRatings’: 5,

}

};

这里我们声明一个restaurantmaps,只添加avgRatingnumRatings键值对,如果addRatingstrue。因为我们要添加多个键值对,所以我们需要使用扩展运算符 ( ...)。

7. 需要以空安全的方式遍历map吗?使用.entries


假设你有map:

const timeSpent = <String, double>{

‘Blogging’: 10.5,

‘YouTube’: 30.5,

‘Courses’: 75.2,

};

以下是如何编写循环以使用所有键值对运行一些代码:

for (var entry in timeSpent.entries) {

// do something with keys and values

print(‘${entry.key}: ${entry.value}’);

}

通过迭代entries变量,您可以以空安全的方式访问所有键值对。

这比这更简洁,更不容易出错:

for (var key in timeSpent.keys) {

final value = timeSpent[key]!;

print(‘$key: $value’);

}

上面的代码!在读取值时需要使用断言运算符 ( ),因为 Dart 不能保证给定键的值存在。

8. 使用命名构造函数和初始化列表以获得更符合人体工程学的 API。


假设您要声明一个表示温度值的类。

你可以让你的类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. getter 和 setter


Temperature上面的类中,celsius被声明为存储变量。

但是用户可能更喜欢以华氏度获取设置温度。

这可以使用 getter 和 setter 轻松完成,它们允许您定义计算变量。这是更新的课程:

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. 对未使用的函数参数使用下划线


在 Flutter 中,我们经常使用带有函数参数的小部件。一个常见的例子是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,

);

}

}

在这种情况下,我们不使用(context, index)的参数itemBuilder。所以我们可以用下划线代替它们:

ListView.builder(

itemBuilder: (_, __) => ListTile(

title: Text(‘all the same’),

),

itemCount: 10,

)

注意:这两个参数是不同的 (___),因为它们是单独的标识符

11. 需要一个只能实例化一次的类(又名单例)?使用带有私有构造函数的静态实例变量。


单例最重要的特性是整个程序中只能有一个它的实例。这对于建模文件系统之类的东西很有用。

// file_system.dart

class FileSystem {

FileSystem._();

static final instance = FileSystem._();

}

要在 Dart 中创建单例,您可以声明一个命名构造函数并使用_语法将其设为私有。

然后,您可以使用它来创建类的一个静态最终实例。

因此,其他文件中的任何代码都只能通过instance变量访问此类:

// some_other_file.dart

final fs = FileSystem.instance;

// do something with fs

注意:如果您不小心,final可能会导致许多问题。在使用它们之前,请确保您了解它们的缺点。

12. 需要收集独特的set?使用集合而不是列表。


Dart 中最常用的集合类型是List.

但是列表可以有重复的项目,有时这不是我们想要的:

const citiesList = [

‘London’,

‘Paris’,

‘Rome’,

‘London’,

];

我们可以Set在需要一组唯一值时使用 a (请注意 的使用final):

// set is final, compiles

final citiesSet = {

‘London’,

‘Paris’,

‘Rome’,

‘London’, // Two elements in a set literal shouldn’t be equal

};

上面的代码生成一个警告,因为London被包含了两次。如果我们尝试对constset执行相同的操作,则会收到错误并且我们的代码无法编译:

// set is const, doesn’t compile

const citiesSet = {

‘London’,

‘Paris’,

‘Rome’,

‘London’, // Two elements in a constant set literal can’t be equal

};

当我们与台合作,我们能够获得有用的API,如uniondifferenceintersection

citiesSet.union({‘Delhi’, ‘Moscow’});

citiesSet.difference({‘London’, ‘Madrid’});

citiesSet.intersection({‘London’, ‘Berlin’});

底线:当你创建一个集合时,问问自己你是否希望它的项目是独一无二的,并考虑使用一个集合。

13.如何使用try、on、catch、rethrow、finally


try并且catch在使用基于 Future 的 API 时非常理想,如果出现问题,这些 API 可能会引发异常。

这是一个完整的示例,展示了如何充分利用它们:

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\nStack trace: $st’);

rethrow;

} finally {

print(‘Done’);

}

}

一些注意事项:

前端框架

前端框架太多了,真的学不动了,别慌,其实对于前端的三大马车,Angular、React、Vue 只要把其中一种框架学明白,底层原理实现,其他两个学起来不会很吃力,这也取决于你以后就职的公司要求你会哪一个框架了,当然,会的越多越好,但是往往每个人的时间是有限的,对于自学的学生,或者即将面试找工作的人,当然要选择一门框架深挖原理。

以 Vue 为例,我整理了如下的面试题。

Vue部分截图

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注前端)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
ck trace: $st’);

rethrow;

} finally {

print(‘Done’);

}

}

一些注意事项:

前端框架

前端框架太多了,真的学不动了,别慌,其实对于前端的三大马车,Angular、React、Vue 只要把其中一种框架学明白,底层原理实现,其他两个学起来不会很吃力,这也取决于你以后就职的公司要求你会哪一个框架了,当然,会的越多越好,但是往往每个人的时间是有限的,对于自学的学生,或者即将面试找工作的人,当然要选择一门框架深挖原理。

以 Vue 为例,我整理了如下的面试题。

Vue部分截图

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注前端)
[外链图片转存中…(img-SNgo6H0i-1713586235193)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 26
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值