Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 颤振提供程序:如何在类字段中侦听类字段的更改?_Flutter_Dart_Provider_Flutter Change Notifier - Fatal编程技术网

Flutter 颤振提供程序:如何在类字段中侦听类字段的更改?

Flutter 颤振提供程序:如何在类字段中侦听类字段的更改?,flutter,dart,provider,flutter-change-notifier,Flutter,Dart,Provider,Flutter Change Notifier,给定以下省道/颤振等级结构: 导入“包装:颤振/材料.省道”; 具有ChangeNotifier的类A{ B_元素1; B_元素2; B get element1=>_element1; B get element2=>u element2; 设置元素1(B值){ _元素1=值; notifyListeners(); } 设置元素2(B值){ _元素2=值; notifyListeners(); } } B类{ 字符串x; 弦y; } 我正在尝试侦听a.element1.x的更改,但问题是,类

给定以下省道/颤振等级结构:

导入“包装:颤振/材料.省道”;
具有ChangeNotifier的类A{
B_元素1;
B_元素2;
B get element1=>_element1;
B get element2=>u element2;
设置元素1(B值){
_元素1=值;
notifyListeners();
}
设置元素2(B值){
_元素2=值;
notifyListeners();
}
}
B类{
字符串x;
弦y;
}
我正在尝试侦听
a.element1.x
的更改,但问题是,类B的setter无法调用类a的
notifyListeners()
,因此,要么我正在侦听a并且不会注意到更改,要么我正在侦听B并且我正在将上下文丢失给a

我在我的flatter项目中使用Provider包。但我不确定,我是否误解了提供者包或ChangeListeners的概念。不管怎样,我都无法找到一个优雅的解决方案

是否有可能从a类覆盖B类的setter?
显然,我可以为每个element1和element2字段(x,y)实现一个函数。但我想这不是一种好的代码风格。

下面是一个如何使用回调函数的示例。如果没有回调,A将不会调用
notifyListeners
,您的
Home
小部件也不会重新生成。下面是一段关于什么是
VoidCallback
的简短视频:

主要功能和简单的
主页
视图:

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

import 'a.dart';

void main() {
  runApp(
    ChangeNotifierProvider<A>(
      create: (context) => A(),
      child: MaterialApp(
        home: Home(),
      ),
    )
  );
}

class Home extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Consumer<A>(
      builder: (context, model, child) {
        return Scaffold(
          body: Container(
            child: Center(
              child: Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: <Widget>[
                  Text('${model.element1.x}'),
                  RaisedButton(
                    child: Text("Set x of element1."),
                    onPressed: () {
                      Provider.of<A>(context, listen: false).element1.setX = 'Set to new value';
                    },
                  ),
                ],
              ),
            ),
          )
        );
      },
    );
  }
}
B类:

import 'package:flutter/cupertino.dart';

class B {
  String x = "";
  String y = "";
  VoidCallback callback;

  B({
    this.callback
  });

  set setX(String newValueX) {
    x = newValueX;
    if(callback != null) callback();
  }

  void setY(String newValueY) {
    y = newValueY;
    if(callback != null) callback();
  }
}

解决这个问题有多种方法:可以在类B中注册回调,然后调用类a的函数,这样类a就知道什么时候由于B中的更改而通知侦听器。或者使用由B公开并由a侦听的流。但最好的方法可能是查看ProxyProvider包。我没有这方面的经验,但我认为它可以适合您的用例。下面是一个例子。你能帮我解决一下回调函数吗?我不太熟悉回调函数。我看了这篇文章,但找不到解决我这个问题的办法。我也查阅了文档,但不知道如何使用ProxyProvider来解决我的问题。这就是回调在A中调用
notifyListeners
的方式。我不确定这是否比只在A上调用方法更好,后者在B上设置属性并直接调用
notifyListeners
import 'package:flutter/cupertino.dart';

class B {
  String x = "";
  String y = "";
  VoidCallback callback;

  B({
    this.callback
  });

  set setX(String newValueX) {
    x = newValueX;
    if(callback != null) callback();
  }

  void setY(String newValueY) {
    y = newValueY;
    if(callback != null) callback();
  }
}