【问题标题】:Why is my "Data"."data" not updated in ChangeNotifier class using ChangeNotifierProvider?为什么我的“数据”。“数据”没有使用 ChangeNotifierProvider 在 ChangeNotifier 类中更新?
【发布时间】:2020-07-26 05:30:20
【问题描述】:

我是新来的颤振。 我想问为什么我的文本字段的 onChange 没有触发:“Provider.ofContext).updateData(newString);”。 我的 Provider.of(context).data 的值没有更新,并且使用 2 个打印语句,始终只打印出 'call1'。

代码如下: 导入“包:颤振/material.dart”; 导入'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();
  }
}

【问题讨论】:

    标签: flutter flutter-provider flutter-change-notifier


    【解决方案1】:

    您试图在您声明的同一个小部件中访问提供者,这是不正确的做法,提供者必须在您正在访问的上面的小部件中声明。

    此外,始终按变量使用提供者数据(如在 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();
      }
    }
    

    【讨论】:

    • 这行得通!谢谢!!所以在每个需要数据提供者的小部件中,我需要始终重新声明数据提供者或至少从父小部件传递它?
    • 不需要传递数据提供者。您可以按照我在 MyTextField 小部件中显示的方式进行访问,但请确保它的父小部件具有数据提供者。
    猜你喜欢
    • 2017-11-13
    • 1970-01-01
    • 1970-01-01
    • 2018-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    相关资源
    最近更新 更多