Flutter -2

115 阅读7分钟

基础

1、Flutter State 生命周期:构建动态用户界面的关键

Flutter 中,State 对象的生命周期与 StatefulWidget 紧密相关,它决定了 State 对象何时创建、更新和销毁,以及如何管理 widget 的状态。

**State 生命周期主要包含以下几个阶段:**

1.  **创建 (createState):**

-   当 StatefulWidget 第一次插入 widget 树时,框架会调用其 createState() 方法,创建一个新的 State 对象。
-   在这个阶段,可以进行初始化操作,例如设置初始状态、加载数据、注册监听器等。

1.  **初始化 (initState):**

-   当 State 对象创建完成后,框架会调用其 initState() 方法。
-   这是进行一次性初始化操作的最佳时机,例如启动动画、初始化定时器等。
-   注意,在这个阶段,widget 树尚未构建完成,因此无法访问 widget 的上下文。

1.  **构建 (build):**

-   当 widget 的配置发生变化或 State 对象调用 setState() 方法时,框架会调用 build() 方法重新构建 widget 树。
-   在这个阶段,可以根据当前状态构建 widget 树,并返回要渲染的 widget。

1.  **更新 (didChangeDependencies):**

-   当 State 对象所依赖的对象发生变化时,框架会调用 didChangeDependencies() 方法。
-   常见依赖对象包括 InheritedWidget,例如 Theme 或 MediaQuery。
-   在这个阶段,可以更新依赖于这些对象的 State。

1.  **更新 (didUpdateWidget):**

-   当 StatefulWidget 的配置发生变化时,框架会调用 didUpdateWidget() 方法。
-   这个方法会传入旧的 widget 配置,可以在这里比较新旧配置并进行相应的更新操作。

1.  **销毁 (deactivate):**

-   当 State 对象从 widget 树中移除时,框架会调用 deactivate() 方法。
-   在这个阶段,可以进行清理工作,例如取消定时器、注销监听器等。

1.  **处理 (dispose):**

-   当 State 对象被永久销毁时,框架会调用 dispose() 方法。
-   这是进行最终清理工作的时机,例如释放资源、关闭连接等。


**总结:**

理解 State 生命周期对于构建动态用户界面至关重要。 通过正确地使用 State 生命周期方法,可以有效地管理 widget 的状态,并确保应用的性能和稳定性。


createState(): 可进行初始化操作,初始化状态、加载数据、注册监听器。。。
initState(): 进行一次初始化的最佳时机,启动动画、初始化定时器。。。
build(): 构建widget树。。。 * widget配置发生变化,或state对象调用了setStā te()
didChangeDependencise(): 更新依赖这些对象的state。。。 * 依赖对象发生变化时
didUpdateWidget(): 比较新旧配置,并进行相应的更新操作。。。 * 依赖对象发生变化时
deactivate(): 清理工作,取消定时器、注销监听器。。。 * state对象从widget树中移除
dispose(): 最后的清理机会,释放资源、关闭连接。。。 * state对象被永久销毁时

State 生命周期图示:

┌───────┐  ┌─────────────┐  ┌──────────────┐  ┌──────────────┐
  │       │  │             │  │              │  │              │
  │createState│──>│initState   │──>│didChangeDependencies│──>│build        │─┐
  │       │  │             │  │              │  │              │  │
  └───────┘  └─────────────┘  └──────────────┘  └──────────────┘  │
                                                          │
                                      ┌──────────────┐   │  ┌─────────────┐
                                      │             │<──┘  │             │
                                      │didUpdateWidget│       │deactivate   │
                                      │             │       │             │
                                      └──────────────┘       └─────────────┘
                                                          │
                                                          ▼
                                                      ┌─────────────┐
                                                      │             │
                                                      │dispose      │
                                                      │             │
                                                      └─────────────┘
  • 比较 setState() 和 setSharedState() 的区别。
-   **比较 setState() 和 setSharedState() 的区别。**

setState() 和 setSharedState() 都是用于更新 Widget 的 State 的方法,但它们之间存在以下区别:

-   **作用范围:**  setState() 只能更新当前 widget 的 State,而 setSharedState() 可以更新子 widget 树中所有 widget 的 State。
-   **性能:**  setState() 会触发当前 widget 的重新构建,而 setSharedState() 不会触发子 widget 树中所有 widget 的重新构建,因此性能更高。


-   **细述 State 的概念及其管理方式。**

State 用于管理 Widget 的可变状态。State 的生命周期与 Widget 的生命周期相同。Flutter 提供了以下两种主要的状态管理方式:

-   **setState():**  setState() 方法用于更新 Widget 的 State,并触发 Widget 的重新构建。
-   **BLoC 架构:**  BLoC 架构是一种基于事件驱动和状态流的状态管理模式。

2、StatelessWidget 的应用场景:静态 UI 的构建块

StatelessWidget 是 Flutter 中的一种无状态 Widget,它的 UI 仅由其配置参数决定,并且在参数不变的情况下不会发生变化。以下是一些常见的 StatelessWidget 应用场景:

**1. 展示静态内容:**

-   用于显示文本、图片、图标等静态内容。
-   例如,Text、Image、Icon 等 Widget 都是 StatelessWidget。

**2. 布局结构:**

-   用于构建应用程序的布局结构,例如 Row、Column、Stack、Container 等。
-   这些 Widget 不需要维护状态,只需要根据配置参数进行布局。

**3. 组合其他 Widget:**

-   可以将多个 StatelessWidget 组合在一起,创建更复杂的 Widget。
-   例如,可以使用 Row 和 Column 来组合多个 Text 和 Image Widget,创建一个列表项。

**4. 接收外部数据:**

-   StatelessWidget 可以通过构造函数参数接收外部数据,并在 build() 方法中使用这些数据来构建 UI。
-   例如,可以将数据从父 Widget 传递给子 StatelessWidget,并在子 Widget 中显示。

**5. 避免不必要的 State 管理:**

-   使用 StatelessWidget 可以避免不必要的 State 管理,从而简化代码并提高性能。
-   如果 Widget 的 UI 不需要动态更新,则应该优先使用 StatelessWidget。

示例:

// 一个显示标题的 StatelessWidget
class MyTitle extends StatelessWidget {
  final String title;

  const MyTitle({Key? key, required this.title}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Text(
      title,
      style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
    );
  }
}

// 一个显示头像的 StatelessWidget
class MyAvatar extends StatelessWidget {
  final String imageUrl;

  const MyAvatar({Key? key, required this.imageUrl}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return CircleAvatar(
      backgroundImage: NetworkImage(imageUrl),
    );
  }
}

content_copyUse code with caution.Dart

总结:

StatelessWidget 是构建 Flutter 应用程序的重要组成部分,它适用于显示静态内容、构建布局结构、组合其他 Widget 和避免不必要的 State 管理。 在开发 Flutter 应用程序时,应该根据 Widget 的需求选择合适的类型。

3、Flutter 路由选择:寻找最佳方案

Flutter 提供了多种路由管理方案,选择合适的方案取决于应用的复杂性和需求。以下是几种常用的路由方案:

**1. 基本路由 (Basic Routes):**

-   **特点:**  使用 MaterialPageRoute 或 CupertinoPageRoute 直接创建路由对象,并使用 Navigator 进行页面切换。
-   **优点:**  简单易用,适合简单的页面切换场景。
-   **缺点:**  无法集中管理路由,代码容易分散。

**2. 命名路由 (Named Routes):**

-   **特点:**  使用名称标识路由,并定义路由表 (routes),方便进行路由跳转和参数传递。
-   **优点:**  集中管理路由,代码结构清晰,方便维护。
-   **缺点:**  对于复杂的路由逻辑,配置可能变得繁琐。

**3. onGenerateRoute:**

-   **特点:**  使用 onGenerateRoute 回调函数动态生成路由,可以根据路由名称和参数创建不同的路由对象。
-   **优点:**  灵活性和扩展性强,可以处理复杂的路由逻辑。
-   **缺点:**  代码复杂度较高,需要手动处理路由参数和跳转逻辑。

**4. 第三方路由库:**

-   **Fluro:**  提供了更强大的路由功能,例如路由拦截、过渡动画等。
-   **Get:**  一款轻量级状态管理和路由库,提供简单的路由 API 和依赖注入功能。
-   **AutoRoute:**  基于代码生成的路由库,可以自动生成路由表和导航代码。

**选择建议:**

-   **简单应用:**  使用基本路由或命名路由即可。
-   **中等复杂应用:**  使用命名路由或 onGenerateRoute,根据需要选择。
-   **复杂应用:**  考虑使用第三方路由库,例如 Fluro 或 Get,以获得更强大的路由功能和更好的代码组织。

**其他因素:**

-   **嵌套导航:**  如果应用需要嵌套导航,例如在 TabBar 中嵌套多个页面,需要考虑如何处理嵌套路由。
-   **深层链接:**  如果需要支持深层链接,例如从外部 URL 跳转到特定页面,需要选择支持深层链接的路由方案。
-   **路由动画:**  可以使用 PageRouteBuilder 或第三方库来创建自定义路由动画,增强用户体验。

**总结:**

选择合适的路由方案需要考虑应用的复杂性和需求。 基本路由和命名路由适用于简单的页面切换场景,onGenerateRoute 和第三方路由库可以处理更复杂的路由逻辑。 开发者需要根据具体情况进行选择,并考虑嵌套导航、深层链接和路由动画等因素。

4、flutter架构

juejin.cn/post/684490…

5、渲染机制

cloud.tencent.com/developer/a…