gpt4 book ai didi

flutter 提供程序 : How do I listen to a change of a class field inside a class field?

转载 作者:行者123 更新时间:2023-12-03 03:35:15 26 4
gpt4 key购买 nike

鉴于以下 Dart/Flutter 类结构:

import 'package:flutter/material.dart';

class A with ChangeNotifier {
B _element1;
B _element2;

B get element1 => _element1;
B get element2 => _element2;

set element1(B value) {
_element1 = value;
notifyListeners();
}

set element2(B value) {
_element2 = value;
notifyListeners();
}
}

class B {
String x;
String y;
}

我正在尝试聆听 A.element1.x 的更改但问题是,B 类的 setter 不能调用 notifyListeners() A 类,所以要么我在听 A 并且不会注意到变化,要么我在听 B 而我正在失去 A 的上下文。

我在 Flutter 项目中使用了 Provider 包。但我不确定,如果我误解了 Provider 包或 ChangeListeners 的概念。无论哪种方式,我都无法找到优雅的解决方案。

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

最佳答案

这是一个关于如何使用回调函数的示例。没有回调,A 不会调用 notifyListeners和您的 Home小部件没有得到重建。这是一个关于什么是 VoidCallback 的简短视频是:https://www.youtube.com/watch?v=fWlPwj1Pp7U

主要功能和一个简单的Home看法:

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';
},
),
],
),
),
)
);
},
);
}
}

然后是A类:
import 'package:flutter/material.dart';
import 'package:tryout/b.dart';

class A extends ChangeNotifier {
B _element1 = B();
B _element2 = B();

B get element1 => _element1;
B get element2 => _element2;

A() {
_element1.callback = () => notifyListeners();
_element2.callback = () => notifyListeners();
}

set element1(B value) {
_element1 = value;
_element1.callback = () => notifyListeners();
notifyListeners();
}

set element2(B value) {
_element2 = value;
_element2.callback = () => notifyListeners();
notifyListeners();
}
}

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

关于 flutter 提供程序 : How do I listen to a change of a class field inside a class field?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61509468/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com