首页 > 其他分享 >Flutter 使用 Key 强制重新渲染小部件

Flutter 使用 Key 强制重新渲染小部件

时间:2023-06-17 21:03:09浏览次数:51  
标签:context 渲染 部件 Key keywordController key Flutter


Flutter 使用 Key 强制重新渲染小部件


文章目录

  • Flutter 使用 Key 强制重新渲染小部件
  • 一、Key 的作用
  • 二、强制重新渲染小部件的步骤
  • 1、 创建一个 Key
  • 2、将 Key 分配给小部件
  • 3、强制重新渲染小部件
  • 三、代码案例


一、Key 的作用

Key 在 Flutter 中是一个抽象类,它有两个主要的子类:LocalKey 和 GlobalKey。LocalKey 只在当前小部件树中唯一,而 GlobalKey 在整个应用程序中是全局唯一的。

Key 的主要作用是标识小部件。当 Flutter 进行小部件树的重建时,它会根据 Key 来判断哪些小部件需要重新创建,哪些小部件可以复用。这样可以提高性能,减少不必要的重建。

二、强制重新渲染小部件的步骤

1、 创建一个 Key

首先,我们需要创建一个 Key 对象。可以使用 GlobalKey 或自定义的 LocalKey。如果想在小部件树中唯一标识该 Key,可以使用 UniqueKey 来生成全局唯一的 Key。

late Key _key = UniqueKey();

2、将 Key 分配给小部件

将创建的 Key 分配给要重新渲染的小部件。可以在创建小部件时通过构造函数传递 Key,或者使用 key 属性将 Key 分配给现有的小部件。

_MyWidget(key: _key)

3、强制重新渲染小部件

当需要强制重新渲染小部件时,可以使用 setState 方法来触发小部件的重建。

setState(() {
    _key = UniqueKey();
});

这将导致 Flutter 重新调用小部件的 build 方法,并根据新的状态重新渲染小部件。

三、代码案例

import 'package:flutter/material.dart';
import 'package:perfect_video/common/global/global_color.dart';
import 'package:perfect_video/common/utils/toast_utils.dart';
import 'package:perfect_video/modules/home/index/film/pages/film_page.dart';

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

  @override
  State<SearchInputPage> createState() => _SearchInputPageState();
}

class _SearchInputPageState extends State<SearchInputPage> {
  // 关键词控制器
  late TextEditingController _keywordController;

  // 是否显示搜索结果
  late bool isShowSearchResult = false;

  // 唯一 key
  late Key _key = UniqueKey();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: _appBar(context),
      body: Visibility(
        visible: isShowSearchResult,
        child: FilmPage(key: _key, name: _keywordController.text),
      ),
    );
  }

  // 标题栏
  _appBar(BuildContext context) {
    return AppBar(
      elevation: 0,
      backgroundColor: Colors.white,
      shape: UnderlineInputBorder(borderSide: BorderSide(color: Theme.of(context).dividerColor)),
      leading: IconButton(
        icon: const Icon(
          Icons.arrow_back_rounded,
          color: GlobalColor.primaryColor,
        ),
        onPressed: () {
          // 返回
          Navigator.pop(context);
        },
      ),
      // titleSpacing: 0,
      title: TextField(
        controller: _keywordController,
        autofocus: true,
        style: const TextStyle(fontSize: 18),
        // 光标颜色
        cursorColor: GlobalColor.primaryColor,
        decoration: const InputDecoration(
          border: InputBorder.none,
          hintText: "请输入关键词",
        ),
        textInputAction: TextInputAction.search,
        // 点击事件
        onSubmitted: (value) {
          _search(context);
        },
      ),
      actions: [
        IconButton(
          icon: const Icon(
            Icons.search_rounded,
            color: GlobalColor.primaryColor,
          ),
          onPressed: () {
            // 搜索
            _search(context);
          },
        ),
      ],
    );
  }

  // 搜索处理
  _search(BuildContext context) {
    if (_keywordController.text.isEmpty) {
      ToastUtils.showMessage(context, "请输入关键词");
      return;
    }
    setState(() {
      if (!isShowSearchResult) {
        isShowSearchResult = true;
      } else {
        _key = UniqueKey();
      }
    });
  }

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

  @override
  void dispose() {
    _keywordController.dispose();
    super.dispose();
  }
}


标签:context,渲染,部件,Key,keywordController,key,Flutter
From: https://blog.51cto.com/u_13272819/6506216

相关文章

  • mybatis 3.x 升级时遇到的keyProperty问题小坑
    背景:有1个项目,原来是用的mybatis3.4.6版本,其中有一些插入mapper是这样写的:IntegerinsertEntitySelectiveShard(@Param("tableSuffix")StringtableSuffix,@Param("entity")XXXEntityentity);对应的xml片段:<insertid="insertEntitySelectiveShard"par......
  • [6] Fast and Practical Secret Key Extraction by Exploiting Channel Response 论文
    摘要摘要写的很清楚,几句话说明了当前密钥发展现状,即使用RSS为基础的密钥生成解决方案的生成速率有待提升,因此本文主打一个高速率;此外本文提出了CGC算法来解决现实生活中的信道互易性差的问题;此外,其能够抵御被认为对RSS技术有害的恶意攻击!但是他的Abstract我有一点不满哈,全文都是......
  • VSCode - Check Keyboard Shortcuts related to commenting
    Clickthegearicon,thenselect'KeyboardShortcuts':Search'comment': ......
  • flutter系列之:做一个图像滤镜
    简介很多时候,我们需要一些特效功能,比如给图片做个滤镜什么的,如果是h5页面,那么我们可以很容易的通过css滤镜来实现这个功能。那么如果在flutter中,如果要实现这样的滤镜功能应该怎么处理呢?一起来看看吧。我们的目标在继续进行之前,我们先来讨论下本章到底要做什么。最终的目标是希......
  • flutter系列之:做一个图像滤镜
    目录简介我们的目标带滤镜的图片打造filter按钮打造可滑动按钮最后要解决的问题简介很多时候,我们需要一些特效功能,比如给图片做个滤镜什么的,如果是h5页面,那么我们可以很容易的通过css滤镜来实现这个功能。那么如果在flutter中,如果要实现这样的滤镜功能应该怎么处理呢?一起来看看......
  • 高德地图 报错 USERKEY_PLAT_NOMATCH
    查过文档后发现    ......
  • 2023-06-15:说一说Redis的Key和Value的数据结构组织?
    2023-06-15:说一说Redis的Key和Value的数据结构组织?答案2023-06-15:全局哈希表Redis使用哈希表作为保存键值对的数据结构,通过哈希函数将Key映射为哈希表中的一个索引位置,使得Key-Value可以在O(1)时间复杂度内被快速访问。在Redis中,哈希表是由多个哈希桶(也称为槽位/数组元素)组成......
  • @MapKey is required
    @MapKeyisrequired 这就是mybatis的annotation的一个提醒,可以直接忽略,不影响代码编译;为啥出现这种情况,因为我们很烂,sql中返回的对象不愿意定义一个 resultMap,select默认就是返回list,不指定resultMap或者resultType,默认就是组装为map对象返回;注意:一定要指定 resultType="......
  • 实时渲染常用纹理技术总结:视差映射
    【USparkle专栏】如果你深怀绝技,爱“搞点研究”,乐于分享也博采众长,我们期待你的加入,让智慧的火花碰撞交织,让知识的传递生生不息!一、概述视差映射(ParallaxMapping)是一种类似于法线贴图的纹理技术,它们都能显著增强模型/纹理表面细节并赋予其凹凸感,但法线贴图所带来的凹凸感不会......
  • pr怎么渲染导出最小体积的高清视频?
    导出视频主要设置分辨率、帧率、 格式和比特率这4大项目。其中分辨率和帧率是在设置序列的时候就决定了,而格式和比特率是在导出的时候才设置的,其中比特率的设置最为关键,决定了文件大小和清晰度,比特率需要根据分辨率的大小来设置,下面我们就来看看premiere渲染导出体积小又高清视频......