Почему мои «Данные». «Данные» не обновляются в классе ChangeNotifier с помощью ChangeNotifierProvider? - PullRequest
0 голосов
/ 13 апреля 2020

Я новичок, чтобы трепетать. Я хочу спросить, почему, когда onChange моего текстового поля не сработал: "Provider.ofContext) .updateData (newString);". Значение моего Provider.of (context) .data не обновляется, и с двумя инструкциями печати всегда выводится только 'selected1'.

Вот код: import 'package: flutter / material. дротик '; импорт 'package: provider / provider.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider<Data>(
      create: (_) => Data(),
      lazy: false,
      child: MaterialApp(
        home: Scaffold(
          appBar: AppBar(
            title: Text(Provider.of<Data>(context).data),
          ),
          body: Level2(),
        ),
      ),
    );
  }
}


class Level2 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Column(
      children: <Widget>[
        MyTextField(),
      ],
    );
  }
}

class MyTextField extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return TextField(onChanged: (newString) {
      print('called1');
      Provider.of<Data>(context).updateData(newString);
      print('called2');
    });
  }
}

class Data extends ChangeNotifier {
  String data = '1234567890';

  void updateData(newString) {
    data = newString;
    notifyListeners();
  }
}

1 Ответ

0 голосов
/ 13 апреля 2020

Вы пытаетесь получить доступ к провайдеру в том же виджете, где вы декларируете, что является неправильным способом, провайдер должен объявить в вышеприведенном виджете, к которому вы обращаетесь.

Кроме того, всегда используйте данные провайдера по переменной ( как используется в виджете MyTextField), в противном случае он не будет работать.

Следующий код может помочь вам понять больше.

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: (_) => Data(),
      child: MaterialApp(home: Level1()),
    );
  }
}

class Level1 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(Provider.of<Data>(context).data),
      ),
      body: Level2(),
    );
  }
}

class Level2 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Column(
      children: <Widget>[
        MyTextField(),
      ],
    );
  }
}

class MyTextField extends StatelessWidget {
  var dataprovider;
  @override
  Widget build(BuildContext context) {
    dataprovider = Provider.of<Data>(context);
    return TextField(
      onChanged: (newString) {
        print(dataprovider.data);
        dataprovider.updateData(newString);
        print('called2');
      },
    );
  }
}

class Data extends ChangeNotifier {
  String data = '1234567890';

  void updateData(newString) {
    print("cds");
    data = newString;
    notifyListeners();
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...