flutter - 如何重建构建方法
问题描述
单击应用栏中的按钮,它会触发 Controller 类中的 show 方法。在那个 notifyPropertyChangedListeners 触发中,handleControllerValueChange 在 setstate 内将布尔值更改为 true,但它没有触发 build 方法。如何触发构建方法。提前致谢
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
typedef Listener = void Function({String property});
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
bool value = false;
Controller controller = Controller();
@override
void initState() {
controller?.addListener(handleControllerValueChange);
super.initState();
}
@override
void dispose() {
controller?.removeListener(handleControllerValueChange);
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
actions: [
FlatButton(
color: Colors.pink,
onPressed: () {
controller.show();
},
)
],
),
body: Center(
child: Container(
height: 50,
width: 50,
color: Colors.blue,
child: Text(value.toString()),
),
),
);
}
void handleControllerValueChange({String property}) {
if (property == 'show') {
setState(() {
value = true;
});
value = false;
}
}
}
class Controller extends ValueChangeNotifier {
void show() {
notifyPropertyChangedListeners(property: 'show');
}
}
class ValueChangeNotifier {
Listener listener;
final ObserverList<Listener> _listeners = ObserverList<Listener>();
void addListener(Listener listener) {
_listeners.add(listener);
}
void removeListener(Listener listener) {
_listeners.remove(listener);
}
@protected
void notifyPropertyChangedListeners({String property}) {
for (listener in _listeners) {
listener(property: property);
}
}
}
解决方案
我认为构建有效,但我们看不到这一点。您正在调用 setState,然后将值更改为 false。
你能检查你的代码的那部分吗?
if (property == 'show') {
setState(() {
value = true;
});
value = false; // delete here and test again.
}
推荐阅读
- javascript - 通过JS添加类无法正常工作
- amazon-web-services - 使用 AWS Amplify 反应本机身份验证 - 登录时的 Hub.Listen 行为不一致
- python - GDAL 已安装但不会导入到 Jupyter Notebooks 尽管修复了 PATH?[Python]
- php - codeigniter smtp 邮件无法正常工作
- amazon-web-services - 使用 boto3 获取 S3 公共策略
- android - Recompose 方法在 Jetpack Compose 中不起作用
- python - pyinstaller 可执行文件的差异更新(修改嵌入式 PYZ-00.pyz)
- android - 如何使用 Play 应用签名和应用程序包设置 Unity 应用程序并将其部署到 Google Play?
- javascript - 无法在我的网站上显示 Bootstrap Toast
- python - 如何拆分数据之间的时间步长大于 1 秒的 pandas 数据帧?