【发布时间】:2021-08-17 04:58:25
【问题描述】:
import 'package:flutter/material.dart';
import '../../Data/Globalvariable.dart' as global;
class MenuBar extends StatefulWidget {
final key = UniqueKey();
// final pin;
// MenuBar({this.pin='112'});
@override
_MenuBarState createState() {
return _MenuBarState();
}
}
class _MenuBarState extends State<MenuBar> {
ValueNotifier<List<String>> st = ValueNotifier(global.pincode);
Widget total() {
return ListView.builder(
itemCount: global.pincode.length,
itemBuilder: (context, index) {
final item = global.pincode[index];
return Dismissible(
key: UniqueKey(),
onDismissed: (direction) {
setState(() {
global.pincode.removeAt(index);
});
ScaffoldMessenger.of(context)
.showSnackBar(SnackBar(content: Text('$item Removed')));
},
background: Container(color: Colors.red),
child: ListTile(
title: Text(item),
),
);
},
);
}
@override
Widget build(BuildContext context) {
return ValueListenableBuilder(
builder: (context, n, menu) {
print(global.pincode);
return total();
},
child: total(),
valueListenable: st,
);
}
}
这是我的主文件我有一个全局文件 我所有的工作变量都在那里
Globalvariable.dart
library project.globals;
List<String> pincode = ['Select Pin','110084','110088'];
现在我将数据添加到 pincode valuenotifier 应该听它并自动更新小部件但它没有这样做我验证使用调试控制台它会在我调用 setstate 时得到更新,这没问题,但我想更新小部件为我将数据添加到我的列表中
这是为了证明我在上面所说的 wigdet 在移除时更新,而不是在添加时更新
【问题讨论】:
-
使用 st.notifyListeneres() 代替 setState !
-
我认为您必须以某种方式在
ValueListenableBuilderbuilder中使用st,例如return total(st),否则无论st的值如何,它都会返回相同的结果。 -
这是我第三次看到这种误解,你的
ValueNotifier<List<SomeType>>不会知道值什么时候改变了。查看ValueNotifier的来源,它使用了相等运算符==。这不适用于列表,您正在将相同的列表指针与其自身进行比较(即使列表的内容已更改)。在 Dart stackoverflow.com/a/22333042/10830091 的列表比较中查看此答案 -
首先让我们解决这个问题。您不能像
global.pincode.removeAt(index);那样更新您的列表。你必须st而不是st.value.removeAt(index); -
在你解决了这个问题之后。您有 2 个解决方案。 A. 强行告诉 ValueNotifier 其值已更改
st.value = List.from(st.value)..removeAt(index);B. 子类 ValueNotifier 并定义用于在列表中添加/删除元素的方法,在所述方法中手动调用 notifyListeners。