flutter - 无法在颤动的平面按钮中使用 Provider 将数据添加到列表
问题描述
我在这个颤振代码中使用了提供程序 4.3.2,这是一个简单的颤动应用程序,它有一个文本字段、平面按钮和一个包含文本小部件的列表视图构建器。我创建了一个 ListData 类,它具有列表并使用提供程序显示在列表视图构建器中。这就是问题所在,我在 ListData 类中创建了一个 addData 方法。我使用此方法在平面按钮的 onPressed 方法中使用提供程序将数据添加到列表添加它是抛出错误,无法找到。这个问题的解决方案。这也是我的主要应用程序的简短形式
import 'dart:collection';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
String data;
return ChangeNotifierProvider(
create: (context) => ListData(),
child: MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text("list"),
),
body: Column(
children: [
TextField(
onChanged: (value) => data = value,
),
FlatButton(
child: Text("Add"),
color: Colors.blue,
onPressed: () {
Provider.of<ListData>(context).addData(data);
},
),
Expanded(
child: MyListView(),
),
],
),
),
),
);
}
}
class MyListView extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ListView.builder(
itemBuilder: (context, index) {
return Text(Provider.of<ListData>(context).listData[index]);
},
itemCount: Provider.of<ListData>(context).listCount,
);
}
}
class ListData extends ChangeNotifier {
List _listData = [
'Hello',
"hi",
];
UnmodifiableListView get listData {
return UnmodifiableListView(_listData);
}
int get listCount {
return _listData.length;
}
void addData(String data) {
_listData.add(data);
notifyListeners();
}
}
解决方案
您可以在下面复制粘贴运行完整代码
您需要Builder
和listen: false
代码片段
Builder(builder: (BuildContext context) {
return FlatButton(
child: Text("Add"),
color: Colors.blue,
onPressed: () {
Provider.of<ListData>(context, listen: false).addData(data);
},
);
}),
工作演示
完整代码
import 'dart:collection';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
String data;
return ChangeNotifierProvider(
create: (context) => ListData(),
child: MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text("list"),
),
body: Column(
children: [
TextField(
onChanged: (value) => data = value,
),
Builder(builder: (BuildContext context) {
return FlatButton(
child: Text("Add"),
color: Colors.blue,
onPressed: () {
Provider.of<ListData>(context, listen: false).addData(data);
},
);
}),
Expanded(
child: MyListView(),
),
],
),
),
),
);
}
}
class MyListView extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ListView.builder(
itemBuilder: (context, index) {
return Text(Provider.of<ListData>(context).listData[index]);
},
itemCount: Provider.of<ListData>(context).listCount,
);
}
}
class ListData extends ChangeNotifier {
List _listData = [
'Hello',
"hi",
];
UnmodifiableListView get listData {
return UnmodifiableListView(_listData);
}
int get listCount {
return _listData.length;
}
void addData(String data) {
_listData.add(data);
notifyListeners();
}
}
推荐阅读
- api - 未处理的异常:类型 '_InternalLinkedHashMap
' 不是类型 'List 的子类型 ' 在类型转换中 - javascript - 为什么 getElementsByClassName 不选择我的所有元素?
- python - 将带有特定单词的字符串值传输到数据框 pandas、python 中的其他列
- amazon-web-services - 将线性学习器的输入类型更改为 csv
- python - 如何从这个网页抓取的 HTML 中提取某些元素
- php - 如何为自动图像优化提取图像路径及其推荐的新尺寸?
- amazon-dynamodb - 使用 DynamoDB 二级索引 AWS SDK 2 Java 异常创建 DynamoDbIndex 对象进行查询
- jquery - 数组的 HTML 元素的选择器
- c++ - Character::BeginPlay() 未被调用
- javascript - 如何检查 ReportControl 对象上是否存在 Reportid 或不使用 *ngif?