Flutter 文本字段,每第二次点击它时发生“xxx被处理为具有活动的Ticker”,

7d7tgy0s  于 5个月前  发布在  Flutter
关注(0)|答案(1)|浏览(62)

我按顺序处理控制器,我真的不知道这个错误是怎么发生的。
=小部件库捕获到异常=
_McCountingTextState通过其TickerProviderStateMixin创建了一个Ticker,但在mixin上调用dispose()时,该Ticker仍然处于活动状态。在调用super.dispose()之前,必须处理所有Ticker。
AnimationController使用的代码应该通过调用AnimationController本身的dispose()来释放。否则,代码会泄漏。

import 'package:flutter/material.dart';
import 'package:landlore/model/roomInfo.dart';

class RoomEditScreen extends StatefulWidget {
  final RoomInfo roomInfo;
  RoomEditScreen({super.key, required this.roomInfo});

  @override
  State<RoomEditScreen> createState() => _RoomEditScreenState();
}

class _RoomEditScreenState extends State<RoomEditScreen> {
  RoomInfo? roomInfo;
  TextEditingController c1 = TextEditingController();

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: TextField(
        controller: c1,
        onChanged: (value) {
          print(value);
        },
      ),
    );
  }

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

字符串

pw136qt2

pw136qt21#

查找小部件中的任何AnimationController示例。它可能位于同一个_RoomEditScreenState类中,或者位于属于同一屏幕或导航流的另一个小部件中。
确保在State类的dispose()方法中调用AnimationController上的dispose()。这应该在调用super.dispose()之前完成。它应该看起来像这样:

AnimationController _animationController;

@override
void dispose() {
  _animationController.dispose(); // Dispose the controller
  super.dispose();
}

字符串
确保AnimationController在initState()方法中初始化,并且仅在状态的生命周期内使用。如果在_RoomEditScreenState中找不到AnimationController,请检查属于同一屏幕或导航流的其他小部件。
请记住,每个AnimationController都应该被释放,以防止内存泄漏和其他副作用,比如您遇到的副作用。

相关问题