You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter Web多TextField切换时触发scheduler库空值异常

问题原因与修复方案

1. 核心问题根源

你的代码逻辑存在明显的不规范操作,是触发异常的主要原因:

  • 你在build方法中重复给TextEditingController添加监听,每次页面重绘都会新增一个updateAllTexts监听回调,不仅会导致内存泄漏、回调多次触发,还会打乱输入框的状态同步逻辑。
  • 你在build方法中强制给控制器的text属性赋值,这个操作会覆盖输入框的光标位置,切换焦点时Flutter触发重绘,赋值操作会打断输入框语义层的状态更新,直接触发空值异常。
  • 你没有给控制器做销毁处理,会产生内存泄漏隐患。

另外该空值报错在2.0早期版本的Flutter Web上确实存在相关语义层的框架bug,修复代码逻辑后如果还出现报错,升级到Flutter 3.0以上稳定版本即可解决。

2. 修复后可运行代码

import 'package:flutter/material.dart';
class TextExample extends StatefulWidget {
  const TextExample({Key? key}) : super(key: key);

  @override
  _TextExampleState createState() => _TextExampleState();
}

class _TextExampleState extends State<TextExample> {
  List<String> texts = ["", "", ""];
  List<TextEditingController> controllers = [];

  @override
  void initState() {
    super.initState();
    // 控制器初始化和监听绑定只执行一次
    for (int i = 0; i < 3; i++) {
      controllers.add(TextEditingController(text: texts[i]));
      controllers[i].addListener(() {
        texts[i] = controllers[i].text;
        setState(() {});
      });
    }
  }

  @override
  void dispose() {
    // 页面销毁时销毁所有控制器释放资源
    for (var controller in controllers) {
      controller.dispose();
    }
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("Text eingeben"),
      ),
      body: Padding(
        padding: const EdgeInsets.all(12.0),
        child: Column(
          children: [
            TextField(controller: controllers[0],),
            Text(texts[0]),
            TextField(controller: controllers[1],),
            Text(texts[1]),
          ],
        ),
      ),
    );
  }
}

内容的提问来源于stack exchange,提问作者Thomas W.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 10:15:04