listen
不起作用。当热重装值更新时。
页面A
@override
Widget build(BuildContext context) {
ValueNotifier<List<ProductModel>> selectNotifier = Provider.of<ValueNotifier<List<ProductModel>>>(context, listen: true);
小工具
Text('${selectNotifier.value.length}'),
页面B
InkWell(
onTap: () {
selectNotifier.value.add(selectProduct);
},
main.dart
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MultiProvider(
providers: [
ChangeNotifierProvider<ValueNotifier<List<ProductModel>>>(
create: (_) => ValueNotifier<List<ProductModel>>([]),
),
],
child: MaterialApp(
theme: CustomTheme.themeData,
onGenerateRoute: Router.generateRoute,
debugShowCheckedModeBanner: false,
),
);
}
版本
provider: ^4.1.2
Flutter版本
1.17.2
我尝试了以下解决此问题的方法。但是我不知道什么是正确的方法(最好的方法)。
第一种方法
将Flutter和Provider降级后,现在可以使用了。为什么呢?
provider: 3.2.0
git checkout v1.12.13-hotfixes
第二种方式
或者它也以这种方式工作。//但在IDE上警告
onTap: () {
selectNotifier.value.add(selectProduct);
selectNotifier.notifyListeners(); //info: The member 'notifyListeners' can only be used within instance members of subclasses of 'package:flutter/src/foundation/change_notifier.dart'.
},
但是添加此ChangeNotifier
后,警告消失了
class _viewState extends State<View> with ChangeNotifier{
添加ChangeNotifier
在最终确定小部件树时引发了以下断言: _CartItemViewState.dispose无法调用super.dispose。
dispose()实现必须始终调用其超类dispose() 方法,以确保小部件使用的所有资源都已完全 已发布。
第三种方式
我没有这种方式的任何问题,但是我在生产应用程序中使用了很多ValueNotifier,所以其他人都不是列表。我不知道如何更改其他类型。
onTap: () {
selectNotifier.value = List.from(selectNotifier.value)..add(widget.productModel);
}
答案 0 :(得分:0)
在这个问题上,第三种方式是正确的方式。
onTap: () {
selectNotifier.value = List.from(selectNotifier.value)..add(widget.productModel);
}