@override
Widget build(BuildContext context) => MaterialApp(
title: ‘Flutter TextField Key Binding Demo’,
home: Scaffold(body: UnforgivingTextField()),
);
}

/// A text field that clears itself if the user tries to back up or correct
/// something.
class UnforgivingTextField extends StatefulWidget {
@override
State createState() => _UnforgivingTextFieldState();
}

class _UnforgivingTextFieldState extends State {
// The text editing controller used to clear the text field.
late TextEditingController controller;

@override
void initState() {
super.initState();
controller = TextEditingController();
}

@override
Widget build(BuildContext context) => Shortcuts(
shortcuts: <LogicalKeySet, Intent>{
// This overrides the left arrow key binding that the text field normally
// has in order to move the cursor back by a character. The default is
// created by the MaterialApp, which has a DefaultTextEditingShortcuts
// widget in it.
LogicalKeySet(LogicalKeyboardKey.arrowLeft): const ClearIntent(),

// This binds the delete and backspace keys to also clear the text field.
// You can bind any key, not just those already bound in
// DefaultTextEditingShortcuts.
LogicalKeySet(LogicalKeyboardKey.delete): const ClearIntent(),
LogicalKeySet(LogicalKeyboardKey.backspace): const ClearIntent(),
},
child: Actions(
actions: <Type, Action>{
// This binds the intent that indicates clearing a text field to the
// action that does the clearing.
ClearIntent: ClearAction(controller: controller),
},
child: Center(child: TextField(controller: controller)),
),
);
}

/// An intent that is bound to ClearAction.
class ClearIntent extends Intent {
const ClearIntent();
}

/// An action that is bound to ClearIntent that clears the TextEditingController
/// passed to it.
class ClearAction extends Action {
ClearAction({required this.controller});

final TextEditingController controller;

@override
Object? invoke(covariant ClearIntent intent) {
controller.clear();
}
}

自动滚动行为

实际显示滚动条时 Android 和 iOS 的逻辑是相同的,而对于桌面应用程序,当内容大于容器时通常会自动显示滚动条,这需要添加 Scrollbar 作为父 Widget为了在手机或 PC 上都能正常,此版本Scrollbar 会在必要时会自动添加

例如下面所示的无滚动条的代码:

import ‘package:flutter/material.dart’;

void main() => runApp(App());

class App extends StatelessWidget {
@override
Widget build(BuildContext context) => MaterialApp(
title: ‘Automatic Scrollbars’,
home: HomePage(),
);
}

class HomePage extends StatelessWidget {
@override
Widget build(BuildContext context) => Scaffold(
body: ListView.builder(
itemCount: 100,
itemBuilder: (context, index) => Text(‘Item $index’),
),
);
}

在桌面上运行它时,将显示一个滚动条:

如果你不喜欢滚动条的外观或始终显示滚动条的逻辑,可以设置一个 ScrollBarTheme,则可以在整个应用范围内或在特定实例上,通过设置来更改它 ScrollBehavior 来完成修改

鼠标光标在文本范围内

在 Flutter 的早期版本中,开发者可以在任何窗口小部件上添加鼠标光标(如指示可点击内容的手),而实际上 Flutter 本身在大多数情况下会添加这些鼠标光标,例如:在所有按钮上添加一个手形鼠标光标。

但是如果要运行带有不同文本跨度,且具有各自样式并且可能足够长的自动换行的格式丰富的文本,那么TextSpan 就不会是一个 Widget,因此不能用作鼠标光标的可视范围…而从此版本开始,当拥有 TextSpan 带有手势识别器的时将自动获得相应的鼠标光标

import ‘package:flutter/gestures.dart’;
import ‘package:flutter/material.dart’;
import ‘package:url_launcher/url_launcher.dart’ as urlLauncher;

void main() => runApp(App());

class App extends StatelessWidget {
static const title = ‘Flutter App’;
@override
Widget build(BuildContext context) => MaterialApp(
title: title,
home: HomePage(),
);
}

class HomePage extends StatelessWidget {
@override
Widget build(BuildContext context) => Scaffold(
appBar: AppBar(title: Text(App.title)),
body: Center(
child: RichText(
text: TextSpan(
style: TextStyle(fontSize: 48),
children: [
TextSpan(
text: 'This is not a link, ',
style: TextStyle(color: Colors.black),
),
TextSpan(
text: ‘but this is’,
style: TextStyle(color: Colors.blue),
recognizer: TapGestureRecognizer()
…onTap = () {
urlLauncher.launch(‘https://flutter.dev’);
},
),
],
),
),
),
);
}

现在可以拥有所需的自动换行文字跨度,并且其中任何带有识别器的文字都将获得适当的鼠标光标。

在此版本中,TextSpan 还支持 onEnteronExit ,并且对应的拥有 mouseCursor

Flutter 2.2 更新预览

除了可用于生产的新功能外,Flutter 2.2 还提供了许多预览功能,包括 **iOS 着色

《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》

【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享

器编译器性能改进,Android 延迟组件支持,Flutter 桌面更新以及 Sony 的 ARM64 Linux 主机支持**。

预览:iOS着色器编译改进

用图形渲染术语来说,“着色器” 是要在最终用户设备上可用的 GPU 编译并运行的程序。自成立以来 Flutter 一直在底层 Skia 图形库中使用着色器,以其自身的高质量图形效果(包括颜色,阴影,动画等)提供本机性能。

由于 Flutter API 的灵活性,着色器可以实时生成和编译,并与需要它们的帧工作负载同步,所以当编译着色器的时间超出框架预算时,体验结果对于用户来说会很明显。

为了避免出现问题,Flutter 提供了在运行期间训练缓存着色器的功能,然后将它们打包并捆绑到应用程序中,并在 Flutter Engine 启动时在第一帧之前进行编译。这意味着预编译的着色器不必在帧工作负载期间进行编译,也不会造成垃圾回收,但是 Skia 最初仅为 OpenGL 实现了此功能。

因此当我们默认情况下在 iOS 上启用 Metal 以响应 Apple 弃用 OpenGL 时,根据我们的基准测试,渲染帧时间增加了,而用户报告的产生的垃圾也增加了。

我们的测量数据表明,这些报告通常是由于着色器编译时间增加,Skia 为 Metal 后端生成的着色器数量,增加以及已编译的着色器无法在各次运行之间缓存,而使得 jank 持续到第一次运行之外而导致的一个应用程序。

因此直到现在,在 iOS 上避免这种麻烦的唯一方法是简化场景和动画,但这并不理想。

但是,现在在 dev 通道上是 Skia 中对 Metal 的着色器预热的新支持的预览,通过 Skia,Flutter 现在可以在第一帧工作负载开始之前编译带捆绑的着色器。

但是,此解决方案有一些警告:

  • Skia 仍然需要为 Metal 生成比 OpenGL 后端更多的着色器;
  • 最终的着色器对机器代码的编译仍需要与框架工作负载同步发生,但这比在框架渲染时间中进行整个着色器生成和编译要快;
  • 首次运行应用程序后,将缓存生成的机器代码,直到重新启动设备为止;

如果想在应用程序中利用此新支持,可以按照 flutter.dev 上的说明进行操作。

但是,我们还没有完成这项工作。在 Android 和 iOS 上此实现都有一些缺点:

  • 部署的应用程序的大小较大,因为它包含捆绑的着色器;
  • 应用程序启动等待时间更长,因为捆绑的着色器需要预先编译;
  • 开发人员暗示了我们对这种实现所带来的体验不满意;

我们认为最后一个问题最重要,特别是查看了执行培训运行的过程,并推理了因应用程序大小和应用程序启动延迟而带来过于繁琐的折衷。

因此我们将继续研究,消除不依赖此实现的着色器编译垃圾以及所有垃圾的方法。特别是我们正在与 Skia 团队合作,以减少响应 Flutter 的要求而生成的着色器的数量,并研究使用 Flutter Engine 捆绑的一小套静态定义的着色器实现。

可以在Flutter 中关注该项目,以了解我们的进度:github.com/flutter/flu…

Android 延迟加载组件

对于 Android 版本,使用 Dart 的拆分 AOT 编译功能,允许 Flutter 应用程序在运行时下载包含提前编译的代码和 assets 的模块。

将这些可安装拆分的模块称为延迟组件,通过仅在需要时才推迟下载代码和 assets ,可以大大减小初始安装大小,例如我们实施了 Flutter Gallery 版本初始安装尺寸减少了 46 %

在启用延迟组件的情况下进行构建时,Dart 会将仅使用 deferred 关键字导入的代码编译到单独的共享库中,这些共享库与 assets 一起打包到延迟组件中

目前延迟组件仅在 Android 上可用,并且此功能作为早期预览版提供,在 flutter.dev 上新的Deferred components 页面中了解如何实现延迟的组件。

flutter.dev/docs/perf/d…

github.com/flutter/flu…

Flutter Windows UWP Alpha

Flutter 的另一个更新是针对 PC 的,对Windows UWP 的支持已在移至了 alpha。UWP 允许将Flutter 应用程序带到无法运行标准 Windows 应用程序的设备(包括Xbox)。

要进行尝试首先需要设置 UWP 先决条件。然后切换到 dev 通道并启用 UWP 支持:

$ flutter channel dev
$ flutter upgrade
$ flutter config — enable-windows-uwp-desktop

启用后,创建 Flutter 应用程序将包括一个新 winuwp 文件夹,该文件夹可让在 UWP 容器中构建和运行应用程序:

$ flutter create uwp_fun
$ cd uwp_fun
$ flutter pub get
$ flutter run -d winuwp

因为要构建 Windows UWP 应用程序在 Windows 的沙箱环境中运行,所以在开发过程中需要在本地主机上的应用程序防火墙上打一个洞,以启用诸如热重载和调试器断点之类的功能。

可以按照 Flutter 桌面文档页面 checknetisolation 上的说明使用命令执行此操作,完成此操作后可以在 Windows 上看到 Flutter 应用程序作为 UWP 应用程序运行。

当然也可以运行更多有趣的UWP应用,例如在 Xbox 上运行的 Flutter 应用。

请查看flutter.dev/desktop/#windows-uwp。

索尼对 ARM64 Linux 主机的支持

Flutter 社区的另一项杰出成就来自 Sony 的软件工程师 HidenoriMatsubayashi,他为针对ARM64 Linux 的支持做出了贡献,通过此 PR 可以在 ARM64 Linux 上构建和运行 Flutter 应用程序。

github.com/flutter/flu…

Flutter 生态系统和工具更新

Flutter Engine 和 Framework 只是整个 Flutter 生态的一部分,软件包生态系统和工具的更新对 Flutter 开发人员来说同样重要。

在生态系统方面,本次将发布许多新的 Flutter Favorite 软件包,以及 FlutterFire(Flutter对 Firebase 的支持)的一些更新,其中 FlutterFire 支持新的 Firebase App Check 预览,因此 Flutter 开发人员可以马上就用到它。

在工具方面,Flutter DevTools 进行了新的更新以优化应用程序的内存占用,并为提供程序包增加了一个新选项卡,另外 VS Code 和 Android Studio / IntelliJ 的 IDE 插件都有显着更新,并且如果是针对 Flutter 的内容作者,则可以采用全新的方式将 DartPad 集成到作品中。

最后有一个名为 FlutterFlow 的新的低代码应用程序设计和构建工具,该工具针对 Flutter 并在Web上运行,因为它本身是由 Flutter 构建的。

Flutter 最受欢迎的更新

作为该版本的一部分,Flutter 生态系统委员会认证了 24 个新的 Flutter Favorite 软件包,这是我们迄今为止最大的扩展,新标记的 Flutter 收藏夹包括:

  • FlutterFire :cloud_firestorecloud_functionsfirebase_authfirebase_corefirebase_crashlyticsfirebase_messagingfirebase_storage

firebase.flutter.dev/

  • 社区 plus 包:android_alarm_manager_plusandroid_intent_plusbattery_plusconnectivity_plusdevice_info_plusnetwork_info_pluspackage_info_plussensors_plusshare_plus

plus.fluttercommunity.dev/

  • googleapis
  • win32
  • intlcharacters
  • Sentry packages :sentrysentry_flutter
  • infinite_scroll_paginationflutter_native_splash

所有这些软件包都已迁移到空安全的状态,并视情况支持 Android,iOS 和 Web 。

例如:firebase_crashlytics 上没有底层 SDK,android_alarm_manager_plus 是专门为Android 设计的。

社区 plus 提供从 Flutter 团队包的超集。例如自 Flutter 最初发行之前,Flutter 团队就由Google 的电池组提供了 bettery package,并且已迁移至零安全状态,但仅在 Android 和 iOS 上受支持,而 battery_plus 包另一方面它支持所有六个 Flutter 平台,包括 Web,Windows,macOS 和 Linux

九个 “plus” 软件包都获得了 Flutter 受欢迎的奖项,这代表了 Flutter 整个社区在成熟度上迈出的一大步。

googleapis 插件提供了约 185 个 Google API 的自动生成的 Dart 包装器,可在客户端或服务器端 Dart应 用程序(包括Flutter应用程序)中使用。

win32 程序包是工程学的奇迹,它使用 Dart FFI 封装了大多数常用的 Win32 API 调用,以使 Dart 代码可以直接访问它们,而无需使用 C 编译器或 Windows SDK 。

随着 Flutter 在 Windows 平台上的流行,该 win32 软件包已成为许多流行插件(包括path_provider)最流行的插件的关键依赖项。作为完整性的测试,作者 timsneath 使用原始 Dart 在原始 Win32 中做了一些有趣的事情,例如实现记事本,蛇和俄罗斯方块:

该 win32 软件包绝对值得一试,看看你是否能够在 Windows 上使用 Dart 或 Flutter 进行了任何操作。

FlutterFire 更新和 Firebase 应用程序检查

FlutterFire 是 Flutter 对 Firebase 的支持,是 Flutter 上最受欢迎的插件集合之一。

Invertase 在 Flutter 2 版本上投入生产以来一直在进行改进方面做得非常出色。实际上自FlutterFire 首次发布以来,Invertase 处理了 79 %的未解决问题,并将未完成的 PR 数减少了88%。

此外他们不仅在生产质量插件方面做得很好,而且还将 Beta 质量插件迁移到了零安全性,并使其在同一内核上构建和运行,以便开发者可以混合和匹配。

此外,Invertase 继续为 FlutterFire 插件添加新功能,其中包括对该版本 Flutter 进行的 Flutter 与 Cloud Firebase 集成的许多更新:

  • Typesafe 用于读取和写入数据的API
  • 支持 Firebase 本地仿真器套件;
  • 使用数据包优化数据查询

最后 FlutterFire 支持新 Firebase 产品的 Beta 版本:Firebase App Check

Firebase App Check 可保护您的后端资源(如 Cloud Storage )免受计费欺诈或网络钓鱼之类的滥用,借助 App Check 运行 Flutter 应用程序的设备,会使用应用程序身份证明提供程序来证明它确实是您的真实应用程序,并且还可以检查它是否在未受干扰的真实设备上运行。

firebase.flutter.dev/docs/app-ch…

Flutter DevTools 更新

Flutter DevTools 在此版本中进行了许多值得注意的更新,包括两项内存跟踪改进以及一个仅用于 provider 插件的全新标签

此版本的 DevTools 中的第一个内存跟踪改进功能,提供了跟踪对象分配位置的功能,让开发者在代码中查找内存泄漏的位置非常方便。

第二种是将自定义消息注入到内存时间轴的功能,这样开发者就可以提供特定于应用程序的标记,例如在完成一些占用大量内存的工作之前和之后,以便可以检查自己是否清理正确

随着 Flutter 应用的规模越来越大,我们将继续确保 Flutter 开发人员拥有跟踪和修复各种内存泄漏和运行时问题所需的工具。

在使用要跟踪的 Flutter 框架时,不仅是运行时问题,而且还存在一些其他问题:有时开发者也想跟踪与软件包有关的问题

pub.dev 上有超过 15,000 个与 Flutter 兼容的软件包和插件,应用随着时间的推移使用更多软件包的可能性越来越大。考虑到这一点,我们一直在尝试向 Flutter DevTools 添加新的 “Provider”选项卡。

事实上,这个标签是由 Remi Roussel 创建,provider 包维护人员。如果你正在运行最新版本的Flutter DevTools,并且正在调试使用 provider 插件的 Flutter 应用程序,则将自动获得新的“Provider” 选项卡。

“Provider”选项卡向开发者显示与每个提供程序相关的数据,包括在运行应用程序时的实时更改,它可以让您直接更改数据,以测试应用程序的主要情况!

这只是此发行版中Flutter DevTools中一些很酷的新功能,有关完整列表,请在此处查看各个公告:

  • Flutter DevTools 2.1 :groups.google.com/g/flutter-a…
  • Flutter DevTools 2.2.1 :groups.google.com/g/flutter-a…
  • Flutter DevTools 2.2.3 :groups.google.com/g/flutter-a…

IDE插件更新

Flutter 的 Visual Studio Code 和 IntelliJ / Android Studio IDE 扩展也已在此版本中更新,例如 Visual Studio Code 扩展现在支持两个附加的 Dart 代码重构:内联方法和内联局部变量

在 Android Studio / IntelliJ 扩展中,我们添加了使用选项将所有堆栈跟踪打印到控制台的功能

DartPad workshops

为了确保我们能够在迅速发展的 Flutter 开发人员社区中准备好文档,Dart 和 Flutter 团队一直在寻找改进和扩展创建教育内容的方法。

在此版本中,我们为 DartPad 添加了一个新的分步 UI,开发人员可以使用该 UI 跟随讲师指导的讲习班。

通过直接向 DartPad 添加说明,我们可以为 I/O 提供指导性的工作室体验,但是我们不只是为自己的工作室构建它;如果你想在 Dart 或 Flutter Workshop 中使用它,可以按照 DartPad Workshop 创作指南进行操作。

github.com/dart-lang/d…

这样的主旨在于利用 DartPad 共享代码,并在自己的网站中嵌入 DartPad 。

社区聚焦:FlutterFlow

FlutterFlow 是一款“低代码”应用程序设计和开发工具,可以通过浏览器中构建所有应用程序,它提供了一种所见即所得的环境,可以使用 Firebase 的真实数据跨多个页面布置你的应用程序。

低代码工具的目标是轻松完成大多数常见的事情,从而开发者可以编写尽可能少的自定义代码行。实际上作为演示,他们构建了一个完整的多页移动应用程序,用于在不到一个小时的时间内,你可以在YouTube 上看到整个过程。
的工作室构建它;如果你想在 Dart 或 Flutter Workshop 中使用它,可以按照 DartPad Workshop 创作指南进行操作。

github.com/dart-lang/d…

这样的主旨在于利用 DartPad 共享代码,并在自己的网站中嵌入 DartPad 。

社区聚焦:FlutterFlow

FlutterFlow 是一款“低代码”应用程序设计和开发工具,可以通过浏览器中构建所有应用程序,它提供了一种所见即所得的环境,可以使用 Firebase 的真实数据跨多个页面布置你的应用程序。

低代码工具的目标是轻松完成大多数常见的事情,从而开发者可以编写尽可能少的自定义代码行。实际上作为演示,他们构建了一个完整的多页移动应用程序,用于在不到一个小时的时间内,你可以在YouTube 上看到整个过程。

Flutter 2(1),还在等机会相关推荐

  1. 知乎热榜第一破10w阅读-Android不行了?2021程序员的风口又要来了,你还不抓紧机会....

    为什么都说Android不行了 我的看法 1.Android 是不是真的不行了? 从大的行业环境来看,裁员是事实,资本市场对互联网行业的热度降低也是事实 从Android生态来看,因为Android的 ...

  2. Google大佬自述:天才程序员竟也有不为人知的秘密,还在等机会

    如果你已经是一个程序员的话,我想你的回答应该和大多数人是一致的.我们希望我们能更多地独立完成一些事情,也不喜欢像是code review这样繁文缛节的环节,我们自己保证代码的质量就可以了嘛,为什么非常 ...

  3. 还在等机会?教你一种更清晰的Android架构!详细的Android学习指南

    前言 今天我给大家再次分享一下,我最近的一些读书的感想,思考起来,确实能够给自己带来一些真实的帮助和启发,希望大家在平时的工作学习中,也能够认清楚学习的一些本质. 如果我们的学习是在不断掌握应对具体工 ...

  4. 让阿里告诉你, iOS开发者为什么要学 Flutter !

    2019 年无疑是 Flutter 技术如火如荼发展的一年.每一个移动开发者都在为 Flutter 带来的"快速开发.富有表现力和灵活的 UI.原生性能"的特色和理念而痴狂,从超级 ...

  5. Flutter 正在被悄悄放弃吗?

    转自前端之巅 作者 | 邓艳琴 采访嘉宾 | 于佳.高飞 日前,Flutter 2 的发布,给 Flutter 社区注入了新的活力.但在国内,其实围绕着 Flutter 还有着许多争议.有人在纠结 F ...

  6. Flutter 正式推出 Windows 平台支持

    作者 / Tim Sneath, Product Manager for Flutter and Dart, Google 自 Flutter 推出以来,我们一直专注于为出色的.拥有定制体验的应用提供 ...

  7. Kotlin vs Flutter,我到底应该怎么选?

    本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 郭霖 即可关注,每个工作日都有文章更新. 在移动应用开发方面,Kotlin和Flutter是目前比较火热的两门技术.其中,Kotlin ...

  8. Android高级架构工程师:2019年火爆全网的flutter,今年真的凉了吗?你是怎么看的

    作者:阿里巴巴淘系技术 链接:https://www.zhihu.com/question/374113031/answer/1252582543 前言 去年,2019 年无疑是 Flutter 技术 ...

  9. Flutter我来啦

    结缘Flutter 都知道Flutter是Google推出的,做为一名安卓开发者也不列外,从Java到Kotlin.从MVC到MVP再到MVVM,以及让人头疼的RX系列.还有kotlin协程,自己虽不 ...

最新文章

  1. 《LeetCode力扣练习》第56题 合并区间 Java
  2. linux shell 输出文件 指定行
  3. 设备服务器停止运行吗,服务器已停止响应是怎么回事
  4. AS 3.0小事件处理 八
  5. 2017-10-03 前端日报
  6. 55exception对象
  7. Mendix发布全球低代码报告,中国软件与低代码发展远超全球
  8. 【Kafka】KafkaConsumer is not safe for multi-threaded access
  9. 梅创社c语言答案,c语言程序设计第2版) 教学课件 作者 梅创社答案 第四章答案.docx...
  10. AchartEngine的柱状图属性设置
  11. CVS update常用技巧
  12. svn钩子自动化同步代码提交任务
  13. Hibernate入门详细教程
  14. Centos7修改系统默认启动项
  15. 上线啦,可以定时周期性提醒群成员的机器人
  16. 《IT项目经理成长手记》读后感
  17. mc服务器怎么回到床的位置,《我的世界》MC床的功能居然跟这四个指令有关系?很多人不知道!...
  18. 微信小程序支付(1)Uni-app平台API接口
  19. 中国电信CTWing物联网平台接入指南(一)之开发流程
  20. 带你初步了解药物设计中的生物信息学

热门文章

  1. Win7 SP1 旗舰版
  2. 做电商网站如何选购云服务器?
  3. Cover Letter 写作技巧
  4. 1949-2020年全国31省铁路里程数据
  5. node+express+mongodb初体验
  6. 石英晶振为何应用于风扇
  7. 计算机毕业设计Java桌游店会员管理系统(源码+系统+mysql数据库+Lw文档)
  8. 正交矩阵(orthogonal matrix)
  9. rpmbuild SPEC文件的语法
  10. 深度学习入门笔记(四):向量化