Giter Site home page Giter Site logo

flutter_in_action_2nd's Issues

1.1移动开发技术简介

生态:Flutter 已经有了丰富的生态系统,无论是开发者数量还是第三方组件都已经非常可观。Flutter -->最后多了一个Flutter
国内外有非常基于 Flutter 的成功案例--> 中间少了个字应该

执行同城?

什么是“编译类语言的执行同城”

2. JavaScript 为脚本语言,执行时需要解释执行 (这种执行方式通常称为 JIT,即 Just In Time,指在执行时实时生成机器码),执行效率和编译类语言(编译类语言的执行同城称为 AOT ,即 Ahead Of Time,指在代码执行前已经预先编译为机器码了)仍有差距。

应该是“编译类语言的执行方式通常”吧

Dart 语言简介 函数部分有误

定义函数时,可选的位置参数和命名可选参数,需要再类型前加 ?。或者给参数设置默认值
例子:
void say(name, {int age = 0, double? height = 0.0}) {
print("name is $name, age is $age and height is $height");
}
void sayHello(name, [int? age = 0, double height = 0.0]) {
print("name is $name, age is $age and height is $height");
}

2.2.4 StatelessWidget 代码疑惑

你好,我在学习的过程中,发现在2.2.4 StatelessWidget中,显示Echo这个widget,书中的代码是

 Widget build(BuildContext context) {
  return Echo(text: "hello world");
}

但是这样子不是就没有了"AppBar"这些元素了,是不是缺了哪些上下文?

第二章 2.2 Widget 简介 didChangeDependencies什么时候调用介绍不足

你好,你的文章我觉得写得很好,但是我看到了一些描述,或者文字有出入的地方,还是希望给你指出来:
比如 第二章 2.2 Widget 简介 didChangeDependencies什么时候调,这里只介绍了如下:

didChangeDependencies():当State对象的依赖发生变化时会被调用;例如:在之前build() 中包含了一个InheritedWidget,然后在之后的build() 中Inherited widget发生了变化,那么此时Inherited widget的子 widget 的didChangeDependencies()回调都会被调用

但是对象的didChangeDependencies很常见的是在于对象第一次被创建和挂载的时候(包括重创建)对应的didChangeDependencies也会调用,希望在书里面加上这个最常见的调用形式

我的一偏博客也写到了这个话题 https://www.jianshu.com/p/287e3c6210fb
我的邮箱如下 [email protected] 希望能有交流···

5.2 错字

原文:
下层组件确定自己的大小,然后告诉商城组件,注意下层组件的大小必须符合父组件的约束。

错字:
商城组件

应为:
上层组件

勘误:多了字

在 6.3 章节介绍 ListView 的 prototypeItem 时结尾多了“如果”两个字

第十五章 启动报错

// 代码
void main() => Global.init().then((e) => runApp(MyApp()));
Error: 
Restarted application in 354ms.
[VERBOSE-2:ui_dart_state.cc(209)] Unhandled Exception: Null check operator used on a null value
#0      MethodChannel.binaryMessenger
#1      MethodChannel._invokeMethod
#2      MethodChannel.invokeMethod
#3      MethodChannel.invokeMapMethod
#4      MethodChannelSharedPreferencesStore.getAll
#5      SharedPreferences._getSharedPreferencesMap
#6      SharedPreferences.getInstance
#7      Global.init
#8      main
#9      _runMainZoned.<anonymous closure>.<anon<…>

runApp未被调用前,无法获取SharedPreferences

两个文本缺失

第三章目录
3.1:Widget简介
3.2:状态管理
缺少对应章节

勘误:文字有语病

在“1.1.5 Flutter出世”处有一段文字“国内外有非常基于 Flutter 的成功案例”,这句话有语病

7.7.1 代码出现语法错误

// 弹出对话框
// >>> update <<<
Future<bool?> showDeleteConfirmDialog1(BuildContext context) {
  return showDialog<bool>(
    context: context,
    builder: (context) {
      return AlertDialog(
        title: Text("提示"),
        content: Text("您确定要删除当前文件吗?"),
        actions: <Widget>[
          TextButton(
            child: Text("取消"),
            onPressed: () => Navigator.of(context).pop(), // 关闭对话框
          ),
          TextButton(
            child: Text("删除"),
            onPressed: () {
              //关闭对话框并返回true
              Navigator.of(context).pop(true);
            },
          ),
        ],
      );
    },
  );
}

勘误or疑惑

捕获

tab有height属性吗?我看了我的sdk里面的tab,跟作者比这里少了个height属性,作者是不是重写了tab添加了height属性(我也想给他重写添加个height属性来着QWQ,好控制tabbar的大小,现在是直接进源码改_kTabHeight调整大小,因为sdk是null-safety,而我用的2.7qwq)

6.10.2 代码出现语法错误

typedef SliverHeaderBuilder = Widget Function(
    BuildContext context, double shrinkOffset, bool overlapsContent);

class SliverHeaderDelegate extends SliverPersistentHeaderDelegate {
  // child 为 header
  SliverHeaderDelegate({
    required this.maxHeight,
    this.minHeight = 0,
    required Widget child,
  })  : builder = ((a, b, c) => child),
        assert(minHeight <= maxHeight && minHeight >= 0);

  //最大和最小高度相同
  SliverHeaderDelegate.fixedHeight({
    required double height,
    required Widget child,
  })  : builder = ((a, b, c) => child),
        maxHeight = height,
        minHeight = height;

  //需要自定义builder时使用
  SliverHeaderDelegate.builder({
    required this.maxHeight,
    this.minHeight = 0,
    required this.builder,
  });

  final double maxHeight;
  final double minHeight;
  final SliverHeaderBuilder builder;

  @override
  Widget build(
    BuildContext context,
    double shrinkOffset,
    bool overlapsContent,
  ) {

    /// >>> update <<<
    var child = builder(context, shrinkOffset, overlapsContent);

    //测试代码:如果子组件设置了key,则打印日志
    if (child.key != null) {
      print('${child.key}: shrink: $shrinkOffset,overlaps:$overlapsContent');
    }
    
    // 让 header 尽可能充满限制的空间;宽度为 Viewport 宽度,
    // 高度随着用户滑动在[minHeight,maxHeight]之间变化。
    return SizedBox.expand(
      /// >>> update <<<
      child: child,
    );
  }

  @override
  double get maxExtent => maxHeight;

  @override
  double get minExtent => minHeight;

  @override
  bool shouldRebuild(SliverHeaderDelegate old) {
    return old.maxExtent != maxExtent || old.minExtent != minExtent;
  }
}

勘误:解释执型->解释执行

解释执行是不是更好一点?

程序主要有两种运行方式:静态编译与动态解释。静态编译的程序在执行前程序会被提前编译为机器码(或中间字节码),通常将这种类型称为**AOT** (Ahead of time)即 “提前编译”。而解释执型则是在运行时将源码实时翻译为机器码来执行,通常将这种类型称为**JIT**(Just-in-time)即“即时编译”。

勘误:一个加粗标记的错误

偏后部分的 而术语 **DOM操作 **就是指 应改为 而术语 **DOM操作**就是指

文档对象模型(Document Object Model,简称DOM),是 W3C 组织推荐的处理可扩展标志语言的标准编程接口,一种独立于平台和语言的方式访问和修改一个文档的内容和结构。换句话说,这是表示和处理一个 HTML 或XML 文档的标准接口。简单来说,DOM 就是文档树,与用户界面控件树对应,在前端开发中通常指 HTML 对应的渲染树,但广义的 DOM 也可以指 Android 中的 XML 布局文件对应的控件树,而术语 **DOM操作 **就是指直接来操作渲染树(或控件树), 因此,可以看到其实 DOM 树和控件树是等价的概念,只不过前者常用于 Web 开发中,而后者常用于原生开发中。

加粗标记没有起作用

错误:1.4.1 变量声明

image

image

var t; // 由于没有对 t 进行初始化,此时 t 的类型为:dynamic,所以对后续赋值没有限制
t = "hi wendux"; // 正确(因为 t 是 dynamic 类型的)
t = 1000; // 正确(因为 t 是 dynamic 类型的)
t = true; // 正确(因为 t 是 dynamic 类型的)

场景二:

var t = "hi wendux"; // 由于初始化了 t,此时 t 的类型为 String,不可再用其他类型数据进行赋值
t = "hello wendux"; // 正确(因为 t 是 String 类型的)
t = 1000; // 错误(因为 t 是 String 类型的)
t = true; // 错误(因为 t 是 String 类型的)

版本相关信息:

Flutter 2.5.1 • channel stable • https://github.com/flutter/flutter.git
Framework • revision ffb2ecea52 (12 天前) • 2021-09-17 15:26:33 -0400
Engine • revision b3af521a05
Tools • Dart 2.14.2

"1.4.6 Dart和Java及JavaScript对比"里关于CoffeeScript和Flow的描述有误

  1. CoffeeScript不应该与TypeScript和Flow一同出现, 因为CoffeeScript和类型没有任何关系, 它唯一支持类型的方式是通过注释添加Flow的Type Annotations.
  2. "Flow是否是JavaScript的超集"相关的注释在此无关紧要, 因为"超集"这个说法只是TypeScript的技术营销, 没有实际意义.

勘误:HeroAnimationRoute单独运行错误

坐标:9.4 Hero动画,HeroAnimationRoute作为一个单独页面运行的时候会报错,需要将build下return的根节点改为Scaffold才能运行通过,sdk: flutter2.5

为什么要将-build-方法放在-state-中-而不是放在statefulwidget中

https://book.flutterchina.club/chapter2/first_flutter_app.html#%E4%B8%BA%E4%BB%80%E4%B9%88%E8%A6%81%E5%B0%86-build-%E6%96%B9%E6%B3%95%E6%94%BE%E5%9C%A8-state-%E4%B8%AD-%E8%80%8C%E4%B8%8D%E6%98%AF%E6%94%BE%E5%9C%A8statefulwidget%E4%B8%AD

看完作者的解释还是不能明白,为什么不把state和build都放在widget中?更新状态仍然可以使用setState方法。为了维护状态专门新建一个state类有必要吗?

animatedList code bug

var item = buildItem(context, index);
data.removeAt(index);
print('删除 ${data[index]}');

Should be changed to
var item = buildItem(context, index);
print('删除 ${data[index]}');
data.removeAt(index);

3.2 按钮, 部分组件文字未更新

原文:Material 组件库中提供了多种按钮组件如ElevatedButton、FlatButton、OutlineButton等,它们都是直接或间接对RawMaterialButton组件的包装定制,所以他们大多数属性都和RawMaterialButton一样。

其中的FlatButton 应该改成 TextButton, 然后三个Button是继承ButtonStyleButton.

2.5.0版本很多更新后有改变 很多编译不过去

3.5 FocusScopeNode focusScopeNode;必须初始化 然后RaisdButton在2.5.0版本就被废弃了 。
然后需要一个父组件
The following assertion was thrown building TextField(focusNode: FocusNode#5550e, decoration: InputDecoration(labelText: "input2"), dirty, dependencies: [MediaQuery, UnmanagedRestorationScope], state: _TextFieldState#72f17): No Material widget found.
为控制焦点部分
更新2.5.0版本后很多错误了 希望改正

对2.2.4 StatelessWidget的代码疑惑

你好,我在学习的过程中,发现在2.2.4 StatelessWidget中,显示Echo这个widget,书中的代码是

 Widget build(BuildContext context) {
  return Echo(text: "hello world");
}

但是这样子不是就没有了"AppBar"这些元素了,是不是缺了哪些上下文?或者是这段代码应该写在哪个位置?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.