首页 > 解决方案 > valuenotifier 不会在更改数据时重新呈现小部件

问题描述

import 'package:cowin_slot_tracker/Data/expansionbutton.dart';
import 'package:cowin_slot_tracker/src/bypin/menubar.dart';
import 'package:cowin_slot_tracker/src/bypin/textfield.dart';
import 'package:flutter/material.dart';
import '../../Data/Globalvariable.dart' as global;
class Tabbypin extends StatefulWidget {
  // const Tabbypin({ Key key }) : super(key: key);

  @override
  _TabbypinState createState() => _TabbypinState();
}

class _TabbypinState extends State<Tabbypin> {
  @override
  void initState() {
    global.pincode = ValueNotifier<List<String>>(['Select Pin']);
    super.initState();
  }

  @override
  void dispose() {
    global.pincode.dispose();
    super.dispose();
  }
  @override
  Widget build(BuildContext context) {
    Widget kk() {
      return ExpnButton(
        wiget: SizedBox(
          height: MediaQuery.of(context).size.height,
          width: MediaQuery.of(context).size.width - 10,
          child: Padding(
            child: MenuBar(key: UniqueKey(),),
            padding: EdgeInsets.all(19),
          ),
        ),
        upperwig: EnterText(),
      );
    }

    return Column(
      children: [
        Flexible(
          child: ValueListenableBuilder(
            builder: (context, value, _) {
              print('update');
              return kk();
            },
            valueListenable: global.pincode,
          ),
        ),
        TextButton(
          style: TextButton.styleFrom(
            primary: Colors.green,
          ),
          onPressed: () {
            print(global.pincode.value);
          },
          child: Text('find'),
        )
      ],
    );
  }
}

在上面的代码中,我创建了一个文本框,它接受输入,然后将其显示到我的扩展面板中,但是当我在 Global.pincode 中修改我的数据时,它似乎并没有在 valuelistenablebuilder 中重新呈现该部分,我想要的只是每次都在 ValueListnerbuilder 中重新呈现该部分我在 global.pincode 中更改我的数据

我的全球数据

Globalvariable.dart
library project.globals;
import 'package:flutter/foundation.dart';
ValueNotifier<List<String>> pincode = ValueNotifier(['select pin']);

menubar.dart
    import 'package:flutter/material.dart';
import '../../Data/Globalvariable.dart' as global;

class MenuBar extends StatefulWidget {
  const MenuBar({Key key}) : super(key: key);

  @override
  _MenuBarState createState() => _MenuBarState();
}

class _MenuBarState extends State<MenuBar> {
  @override
  void dispose() {
    global.pincode.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return ValueListenableBuilder(
      builder: (context, value, _) {
        print('updated');
        print(value);
        return total();
      },
      valueListenable: global.pincode,
    );
  }
}

Widget total() {
  return ListView.builder(
    itemCount: global.pincode.value.length,
    itemBuilder: (context, index) {
      final item = global.pincode.value[index];
      return Dismissible(
        key: UniqueKey(),
        onDismissed: (direction) {
          global.pincode.value.removeAt(index);
          // });
          ScaffoldMessenger.of(context)
              .showSnackBar(SnackBar(content: Text('$item Removed')));
        },
        background: Container(color: Colors.red),
        child: ListTile(
          title: Text(item),
        ),
      );
    },
  );
}

Textfield.dart
import 'package:flutter/material.dart';
import '../../Data/Globalvariable.dart' as global;

class EnterText extends StatelessWidget {
  // const EnterText({ Key? key }) : super(key: key);
  String pin;
  @override
  Widget build(BuildContext context) {
    return SizedBox(
      height: 80,
      child: TextField(
        onChanged: (value) {
          pin = value;
        },
        maxLength: 6,
        keyboardType: TextInputType.number,
        decoration: InputDecoration(
            icon: Icon(Icons.pin_drop),
            suffix: TextButton(
              style: TextButton.styleFrom(
                primary: Colors.blue,
              ),
              onPressed: () {
                global.pincode.value.add(pin);
                // global.pincode.notifyListeners();
              },
              child: Text('Add'),
            ),
            border: OutlineInputBorder(
              borderRadius: BorderRadius.circular(20.0),
            ),
            hintText: " Enter pin code",
            labelText: "Pin Code"),
      ),
    );
  }
}

在此处输入图像描述

标签: flutterdart

解决方案


问题可能是因为存储在 中的列表的引用在您执行或ValueNotifier时不会改变。.add()remove()

相反,尝试重新影响变量:

global.pincode.value = global.pincode.value.removeAt(index).toList(); // instead of `global.pincode.value.removeAt(index);`

// ...

global.pincode.value = global.pincode.value.add(pin).toList(); // instead of `global.pincode.value.add(pin);`

推荐阅读