提供程序ValueNotifier侦听在Flutter上的某些页面上不起作用

时间:2020-05-13 12:25:29

标签: flutter dart flutter-provider

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

1 个答案:

答案 0 :(得分:0)

在这个问题上,第三种方式是正确的方式。

onTap: () {
        selectNotifier.value = List.from(selectNotifier.value)..add(widget.productModel);
}