【问题标题】:A TextEditingController was used after being disposed处置后使用了 TextEditingController
【发布时间】:2020-06-18 16:59:19
【问题描述】:

我创建了一个容器输入的表单。 我遍历输入列表以创建表单。 我的变量是:

List fields = [
    {
        'label': Strings.firstName,
        'controller': _fnameController,
        'validator': (val) => Validation.mustFilled(val),
    },
    {
        'label': Strings.lastName,
        'controller': _lnameController,
        'validator': (val) => Validation.mustFilled(val),
    },
    {
        'label': Strings.phoneNumber,
        'controller': _mobileController,
        'validator': (val) => Validation.mobile(val),
    },
];

和我的 TextEditingController 定义:

static TextEditingController _fnameController = TextEditingController();
static TextEditingController _lnameController = TextEditingController();
static TextEditingController _mobileController = TextEditingController();

我从前一个屏幕获取输入值并在 initState 中设置输入:

@override
void initState() {
    super.initState();
    _fnameController.text = widget.userProfile.firstName;
    _lnameController.text = widget.userProfile.lastName;
    _mobileController.text = widget.userProfile.phoneNumber;
}

for (var item in fields)
    Container(
        margin: EdgeInsets.symmetric(vertical: 10.0),
        child: Input(
            controller: item['controller'],
            label: item['label'],
            validator: item['validator'],
        ),
    ),

和我的输入小部件:

class Input extends StatelessWidget {
  final String label;
  final VoidFunc validator;
  final TextEditingController controller;
  Input({this.label, this.validator, this.controller});
  @override
  Widget build(BuildContext context) {
    return TextFormField(
      autovalidate: true,
      controller: controller,
      textAlignVertical: TextAlignVertical.center,
      cursorColor: ColorPalette.secondary_3_5,
      decoration: InputDecoration(
        filled: true,
        labelText: label,
      ),
      validator: (value) => validator(value),
    );
  }
}

最后将它们处理掉:

@override
void dispose() {
    _fnameController.dispose();
    _lnameController.dispose();
    _mobileController.dispose();
    super.dispose();
}

一切正常,但是当我导航到上一个屏幕(使用后退按钮)然后再次来到此屏幕时,我收到此错误:

A TextEditingController was used after being disposed.

Once you have called dispose() on a TextEditingController, it can no longer be used.
The relevant error-causing widget was

【问题讨论】:

    标签: flutter


    【解决方案1】:

    请从TextEditingController 中删除static 关键字
    变化自

    static TextEditingController _fnameController = TextEditingController();
    static TextEditingController _lnameController = TextEditingController();
    static TextEditingController _mobileController = TextEditingController();
    

    TextEditingController _fnameController = TextEditingController();
    TextEditingController _lnameController = TextEditingController();
    TextEditingController _mobileController = TextEditingController();
    

    我使用以下完整代码重现此错误。

    import 'package:flutter/material.dart';
    
    void main() {
      runApp(MaterialApp(
        title: 'Navigation Basics',
        home: FirstRoute(),
      ));
    }
    
    class FirstRoute extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text('First Route'),
          ),
          body: Center(
            child: RaisedButton(
              child: Text('Open route'),
              onPressed: () {
                Navigator.push(
                  context,
                  MaterialPageRoute(builder: (context) => SecondRoute()),
                );
              },
            ),
          ),
        );
      }
    }
    
    class SecondRoute extends StatefulWidget {
      @override
      _SecondRouteState createState() => _SecondRouteState();
    }
    
    class _SecondRouteState extends State<SecondRoute> {
      static TextEditingController _fnameController = TextEditingController();
    
      @override
      void dispose() {
        _fnameController.dispose();
        super.dispose();
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text("Second Route"),
          ),
          body: Center(
            child: RaisedButton(
              onPressed: () {
                Navigator.pop(context);
              },
              child: Text('Go back!'),
            ),
          ),
        );
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2020-10-31
      • 1970-01-01
      • 2021-06-15
      • 1970-01-01
      • 1970-01-01
      • 2021-11-23
      • 2020-04-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多