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();
}
}