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

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

一、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});

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

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

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

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

  
  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();
      }
    });
  }

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

  
  void dispose() {
    _keywordController.dispose();
    super.dispose();
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值