文章

Flutter学习知识点记录

1. StatelessWidgets和StatefulWidget

在 UIKit 中,要更新视图,可以直接修改它们。而在 Flutter 中,组件是不可变的,不能直接更新。你需要操作组件的状态。

这就引出了有状态组件和无状态组件的概念。有状态组件StatelessWidget顾名思义,就是一个没有附加任何状态的组件。

StatelessWidgets当您描述的用户界面部分仅依赖于小部件中的初始配置信息时,这种方法非常有用。

例如,在 UIKit 中,这类似于放置一个UIImageView 带有您徽标的元素image。如果徽标在运行时不会改变,请StatelessWidget在 Flutter 中使用。

如果你想根据发出 HTTP 请求后收到的数据动态地改变 UI,可以使用 StatefulWidget.。HTTP 请求完成后,告诉 Flutter 框架该组件的 .State已更新,以便它可以更新 UI。

无状态组件和有状态组件之间最重要的区别在于,StatefulWidget有状态组件有一个State对象来存储状态数据,并在树重建时将其传递下去,因此不会丢失。

如果您不确定,请记住这条规则:如果一个组件在build方法外部发生变化(例如,由于运行时用户交互),则它是有状态的。如果组件在构建后从未发生变化,则它是无状态的。但是,即使组件是有状态的,如果包含它的父组件本身不响应这些变化(或其他输入),它仍然可以是无状态的。

2.聆听生命周期事件

在 UIKit 中,你可以重写方法来ViewController 捕获视图自身的生命周期方法,或者在 onView 中注册生命周期回调。在 Flutter 中,你没有这两种概念,但你可以通过挂钩到观察者并监听`change` 事件AppDelegate来监听生命周期事件。 WidgetsBindingdidChangeAppLifecycleState()

可观察的生命周期事件包括:

inactive

该应用程序处于非活动状态,未接收任何数据。

用户输入。此事件仅适用于 iOS,因为 Android 上没有对应的事件。

paused

该应用程序目前对用户不可见。

不响应用户输入,但正在后台运行。

resumed

应用程序可见,并能响应用户输入。

suspending

应用程序暂时中止。

iOS平台没有类似的事件。

有关这些状态含义的更多详细信息,请参阅 AppLifecycleState文档。

3.显示列表视图

UITableView在 UIKit 中,您可以使用 <div><div> 来显示列表UICollectionView。在 Flutter 中,您可以使用 <div> 实现类似的功能ListView。在 UIKit 中,这些视图具有代理方法,用于确定行数、每个索引路径对应的单元格以及单元格的大小。

由于 Flutter 的不可变组件模式,您可以将组件列表传递给您的组件ListView,Flutter 会负责确保滚动快速流畅

import 'package:flutter/material.dart';

void main() {
  runApp(const SampleApp());
}

class SampleApp extends StatelessWidget {
  const SampleApp({super.key});

  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return const MaterialApp(title: 'Sample App', home: SampleAppPage());
  }
}

class SampleAppPage extends StatefulWidget {
  const SampleAppPage({super.key});

  @override
  State<SampleAppPage> createState() => _SampleAppPageState();
}

class _SampleAppPageState extends State<SampleAppPage> {
  List<Widget> _getListData() {
    final List<Widget> widgets = [];
    for (int i = 0; i < 100; i++) {
      widgets.add(
        Padding(padding: const EdgeInsets.all(10), child: Text('Row $i')),
      );
    }
    return widgets;
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Sample App')),
      body: ListView(children: _getListData()),
    );
  }
}

4.在应用程序中捆绑图像

iOS 将图片和资源视为不同的项目,而 Flutter 应用只有资源。在 iOS 中放置在 <image>Images.xcasset文件夹中的资源,在 Flutter 中则放置在 <assets> 文件夹中。与 iOS 一样,资源可以是任何类型的文件,而不仅仅是图片。例如,你可能在 <assets>my-assets文件夹中放置了一个 JSON 文件:

my-assets/data.json


在文件中声明资产pubspec.yaml

assets:
 - my-assets/data.json

然后通过代码使用冒号 (:) 访问它AssetBundle

import 'dart:async' show Future;
import 'package:flutter/services.dart' show rootBundle;

Future<String> loadAsset() async {
  return await rootBundle.loadString('my-assets/data.json');
}

对于图像,Flutter 遵循类似 iOS 的基于密度的简单格式。图像资源可以是 <p>、`<p>` 、 1.0x<p> 或任何其他倍数。Flutter 的 <p> 表示单个逻辑像素中物理像素的比例。 2.0x3.0xdevicePixelRatio

资源文件可以位于任意文件夹中——Flutter 没有预定义的文件夹结构。您只需在pubspec.yaml文件中声明资源文件(及其位置),Flutter 就会自动查找它们。

例如,要向my_icon.pngFlutter 项目中添加名为 image 的图像,您可以将其存储在一个名为 image 的文件夹中images。将基础图像(1.0x)放在该images文件夹中,并将其他变体放在以相应比例倍数命名的子文件夹中:

images/my_icon.png       // Base: 1.0x image
images/2.0x/my_icon.png  // 2.0x image
images/3.0x/my_icon.png  // 3.0x image

接下来,在pubspec.yaml文件中声明这些图像:

assets:
 - images/my_icon.png

您现在可以使用以下命令访问您的图片AssetImage

image: AssetImage('images/a_dot_burr.png'),

链接地址

https://docs.flutter.dev/get-started/flutter-for/uikit-devs

License:  CC BY 4.0