Search code examples
fluttertextfieldflutter-provider

Need to update TextController with Provider


Currently, I'm learning flutter and can't update one textController when the value in provider changes. Here is the code I tried already:

TextEditingController textController;

  @override
  void initState() {
    TranslateTextProvider myProvider = Provider.of<TranslateTextProvider>(
      context,
      listen: false,
    );

    super.initState();
    textController = TextEditingController(text: myProvider.translated);
  }

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

The provider is updating correctly but textfield doesn't and yes I have set the controller on textfield. I'll be grateful for every tip.


Solution

  • if you need to listen to dependencies updates, you need to use didChangeDependencies ! This is triggered if you are listening to a provider which is updated.

    Here is you example adapted:

    TextEditingController textController;
    
    @override
    void initState() {
      super.initState();
      textController = TextEditingController();
    }
    
    @override
    void didChangeDependencies() {
      textController.text = Provider.of<TranslateTextProvider>(
        context,
        listen: true, // Be sure to listen
      ).text;
      super.didChangeDependencies();
    }
    
    @override
    void dispose() {
      textController.dispose();
      super.dispose();
    }
    

    Of course your Provider has to dispatch the changes, if you are using a ChangeNotifier for example, it would imply calling notifyListeners (if you ChangeNotifier) whenever the text is updated:

    class TranslateTextProvider extends ChangeNotifier {
      String _text = "";
    
      String get text => _text;
    
      set text(String newText) {
        if (newText != text) {
          _text = newText;
          notifyListeners(); // Notify if the text changed
        }
      }
    }