Как распорядиться и воссоздать какое-то государство - PullRequest
0 голосов
/ 08 ноября 2018

Пожалуйста, рассмотрите код ниже.

TextController создается во время initState. Если кнопка нажата, другой текстовый контроллер создается внутри setState:

import 'package:flutter/material.dart';

void main() { runApp(Test()); }

class Test extends StatefulWidget {
  TestState createState() => TestState();
}

class TestState extends State<Test> {
  TextEditingController textController;

  void initState() {
    print("initState");
    super.initState();

    textController = TextEditingController(text: "1st textController");
  }

  void dispose() {
    print("dispose");
    textController.dispose();
    super.dispose();
  }

  void onPressed() {
    print("onPressed");

    setState(() {
      print("setState");

      // It breaks if this line is uncommented.
      if (textController != null) textController.dispose();

      textController = TextEditingController(text: "2nd textController");
    });
  }

  Widget build(BuildContext context) {
    print("build");

    var button = MaterialButton(onPressed: onPressed, child: const Text("Click Me"));
    var textField = TextField(keyboardType: TextInputType.number, controller: textController);

    return MaterialApp(
      home: Material(
        child: Padding(
          padding: const EdgeInsets.all(30.0),
          child: Column(children: [button, textField]),
        ),
      ),
    );
  }
}

Это работает. Однако я никогда не избавлялся от старого textController. Я могу сделать это внутри setState, до создания нового textController:

    setState(() {
      print("setState");
      if (textController != null) textController.dispose();
      textController = TextEditingController(text: "2nd textController");
    });

Однако тогда я получаю сообщение об ошибке:

══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞══
I/flutter ( 4645): The following assertion was thrown building             
InputDecorator(decoration: InputDecoration(), isFocused:
I/flutter ( 4645): false, isEmpty: false, state:     
_InputDecoratorState#8195a(tickers: tracking 2 tickers)):
I/flutter ( 4645): A TextEditingController was used after being disposed.
I/flutter ( 4645): Once you have called dispose() on a TextEditingController, it can no longer be used.

Мои вопросы:

1) Почему я получаю эту ошибку? TextControlled все еще используется? Где?

2) Как это исправить?

...