Я использую notifyListner из пакета flutter Provider, но мой пользовательский интерфейс не обновляется

Я использую notifyListner из пакета flutter Provider, но мой пользовательский интерфейс не обновляется всякий раз, когда я набираю буквы в TextField. Я делаю это приложение, чтобы понять, как работает провайдер. Моя панель приложений и текст должны изменяться всякий раз, когда я набираю текст в TextFiled. Вот мой код,

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

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

class MyApp extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider<Data>(
      create: (context) => Data(),
      child: MaterialApp(
        home: Scaffold(
          appBar: AppBar(
            title: MyAppBar(),
          ),
          body: SafeArea(
            child: Column(
              children: [
                MyTextField(),
                Expanded(
                  child: MyTextWidget(),
                ),
              ],
            ),
          ),
        ),
      ),
    );
  }
}

class MyTextField extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Container(
      child: TextField(
        onChanged: (newValue) {
          Provider.of<Data>(context, listen: true).changeString(newValue);
        },
      ),
    );
  }
}

class MyTextWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Container(
      child: Text(Provider.of<Data>(context, listen: true).appName),
    );
  }
}

class MyAppBar extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Text(Provider.of<Data>(context, listen: true).appName);
  }
}

class Data extends ChangeNotifier {
  String appName = 'Understanding Provider';

  void changeString(String newString) {
    appName = newString;
    notifyListeners();
  }
}

Пожалуйста, помогите, спасибо!


person Aditya Komawar    schedule 30.01.2021    source источник


Ответы (1)


Вы не должны слушать своего провайдера, когда обновляете его внутри MyTextField:

class MyTextField extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Container(
      child: TextField(
        onChanged: (newValue) {
          Provider.of<Data>(context, listen: false).changeString(newValue);
        },
      ),
    );
  }
}

Установите listen: false.

person Thierry    schedule 30.01.2021
comment
Спасибо, сработало! - person Aditya Komawar; 30.01.2021