为啥我的“数据”。“数据”没有使用 ChangeNotifierProvider 在 ChangeNotifier 类中更新?

Posted

技术标签:

【中文标题】为啥我的“数据”。“数据”没有使用 ChangeNotifierProvider 在 ChangeNotifier 类中更新?【英文标题】: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();
  

【问题讨论】:

【参考方案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 小部件中显示的方式进行访问,但请确保它的父小部件具有数据提供者。

以上是关于为啥我的“数据”。“数据”没有使用 ChangeNotifierProvider 在 ChangeNotifier 类中更新?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 SwiftUI 列表没有填充我的所有数据?

知道为啥我的 DbInitializer 中的数据没有填充到我的数据库中

为啥我的 RecyclerView 没有填充来自改造的数据?

为啥我的数据没有在 Flutter for web 中使用 api 从实时数据库中检索

为啥我的数据没有在我的 SQLAlchemy 模型中正确表示?

为啥我的用户数据没有使用资源控制器中的 show 方法传递到页面视图?