flutter - 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"),
),
);
}
}
解决方案
问题可能是因为存储在 中的列表的引用在您执行或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);`
推荐阅读
- logging - Kubernetes 日志架构 - NFS 持久卷?
- jenkins - 量角器:尝试在 Jenkins 中运行时找不到命令
- java - 返回过滤元素的新实例
- mongodb - 如何在mongodb中找到两个日期之间的小时差
- c# - 在构建 Xamarin 页面时获取数据的最佳方法是什么?
- pytorch - 如何将 LSTM 中的二元分类器输出/损失张量转换为多类
- amazon-web-services - 仅使用 HTTPS 的应用程序运行状况检查
- javascript - 通过 express 发送带有其父类的对象
- java - 我在 github 中使用 android 图像滑块,但是当运行该应用程序时,它崩溃了
- java - 如何使用 Maven 创建 Stuts2 项目