Flutter 设置状态颤振导致错误:类型';int';不是类型为';字符串';
我正在使用flatter制作一个应用程序,我想在其中显示用户的购买情况,并有一个按钮隐藏和显示有关购买情况的图表。整个应用程序都连接到Firebase Cloud Firestore后端,所以我使用提供商来处理状态管理。在主页(UserPage)中,每当我对任何变量调用setState时,如果没有将其链接到任何其他变量,我都会得到错误: 类型“int”不是类型“String”的子类型 导致错误的相关小部件已被删除 采购清单 我尝试过在没有任何代码的情况下运行setState函数,如下所示: 按下时:(){setState((){});} 但仍然会得到相同的错误 main.dartFlutter 设置状态颤振导致错误:类型';int';不是类型为';字符串';,flutter,dart,google-cloud-firestore,setstate,flutter-provider,Flutter,Dart,Google Cloud Firestore,Setstate,Flutter Provider,我正在使用flatter制作一个应用程序,我想在其中显示用户的购买情况,并有一个按钮隐藏和显示有关购买情况的图表。整个应用程序都连接到Firebase Cloud Firestore后端,所以我使用提供商来处理状态管理。在主页(UserPage)中,每当我对任何变量调用setState时,如果没有将其链接到任何其他变量,我都会得到错误: 类型“int”不是类型“String”的子类型 导致错误的相关小部件已被删除 采购清单 我尝试过在没有任何代码的情况下运行setState函数,如下所示: 按下
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'databaseservice.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: StreamProvider<List<User>>.value(
initialData: [],
value: DatabaseService('AuthenticaionUID').accountUsers,
lazy: false,
child: UserPage(1)),
);
}
}
class UserPage extends StatefulWidget {
final int userID;
UserPage(this.userID);
@override
_UserPageState createState() => _UserPageState(userID);
}
class _UserPageState extends State<UserPage> {
final int userID;
_UserPageState(this.userID);
// String error = '';
bool showChart = true;
@override
Widget build(BuildContext context) {
var usersList = Provider.of<List<User>>(context);
var user;
usersList.forEach((User userI) {
if (userI.id == userID) {
user = userI;
}
});
return Scaffold(
appBar: AppBar(
elevation: 0,
backgroundColor: Colors.red,
title: Text('${user.name}\'s Budget'),
),
body: Padding(
padding: EdgeInsets.fromLTRB(8, 8, 8, 0),
// padding: EdgeInsets.all(8),
child: (user.total == 0)
? Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Expanded(
child: Center(child: Text('No purchases')),
)
],
)
: Column(
children: <Widget>[
showChart
? Container(
child: UserChart(user),
height: 269,
)
: Container(),
PurchaseList(userID),
],
)),
bottomNavigationBar: BottomAppBar(
child: IconButton(
icon: Icon(Icons.insert_chart),
onPressed: () {
setState(() {
showChart = !showChart;
});
}),
),
);
}
}
class PurchaseList extends StatelessWidget {
final int userID;
PurchaseList(this.userID);
@override
Widget build(BuildContext context) {
List<User> usersList = Provider.of<List<User>>(context);
User user;
usersList.forEach((User userI) {
if (userI.id == userID) {
user = userI;
}
});
return Expanded(
child: Container(
child: ListView.builder(
itemCount: user.purchases.length,
itemBuilder: (BuildContext context, int index) {
return Card(
child: Row(
children: <Widget>[
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text(user.purchases[index]['name']),
Text(user.purchases[index]['category']),
Text(user.purchases[index]['date']),
Text(user.purchases[index]['shop'])
]),
// Price
Text('\$${user.purchases[index]["price"]}'),
],
),
);
},
),
),
);
}
}
导入“包装:颤振/材料.省道”;
导入“包:provider/provider.dart”;
导入“databaseservice.dart”;
void main(){
runApp(MyApp());
}
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
主页:StreamProvider.value(
初始数据:[],
值:DatabaseService('AuthenticationUID')。accountUsers,
懒惰:错,
子项:用户页(1)),
);
}
}
类UserPage扩展了StatefulWidget{
最终int用户标识;
UserPage(this.userID);
@凌驾
_UserPageState createState()=>\u UserPageState(用户ID);
}
类_UserPageState扩展状态{
最终int用户标识;
_UserPageState(this.userID);
//字符串错误=“”;
bool showChart=true;
@凌驾
小部件构建(构建上下文){
var usersList=Provider.of(上下文);
var用户;
usersList.forEach((用户userI){
if(userI.id==userID){
user=userI;
}
});
返回脚手架(
appBar:appBar(
海拔:0,
背景颜色:Colors.red,
标题:文本(“${user.name}'s Budget”),
),
主体:填充物(
填充:从LTRB(8,8,8,0)开始的边缘设置,
//填充:边缘设置。全部(8),
子项:(user.total==0)
?立柱(
mainAxisSize:mainAxisSize.min,
儿童:[
扩大(
child:Center(child:Text('No-purchases')),
)
],
)
:列(
儿童:[
展示图
?容器(
子项:UserChart(用户),
身高:269,
)
:Container(),
PurchaseList(用户ID),
],
)),
bottomNavigationBar:BottomAppBar(
孩子:我的钮扣(
图标:图标(图标。插入图表),
已按下:(){
设置状态(){
showChart=!showChart;
});
}),
),
);
}
}
类PurchaseList扩展了无状态小部件{
最终int用户标识;
PurchaseList(this.userID);
@凌驾
小部件构建(构建上下文){
List usersList=Provider.of(上下文);
用户;
usersList.forEach((用户userI){
if(userI.id==userID){
user=userI;
}
});
扩大回报(
子:容器(
子项:ListView.builder(
itemCount:user.purchases.length,
itemBuilder:(构建上下文,int索引){
回程卡(
孩子:排(
儿童:[
纵队(
crossAxisAlignment:crossAxisAlignment.start,
儿童:[
文本(user.purchases[index]['name']),
文本(user.purchases[索引]['category']),
文本(user.purchases[索引]['date']),
文本(user.purchases[索引]['shop'])
]),
//价格
文本(“\$${user.purchases[index][“price”]}”),
],
),
);
},
),
),
);
}
}
非常感谢您的帮助,谢谢您在Firebase控制台中仔细检查您的数据类型。例如,您的
userID
可能是一个字符串,您可以将其与userI.id
进行比较。添加.toString()
应该可以解决这个问题。所以这个错误是因为它所期望的参数是int值,它正在获取字符串,检查参数类型或者只是将int转换为字符串。只要这样做,我就从firestore检索到了我的具有int值的手机号码
Text(document["mobileNo"].toString())
哪一个参数,即使只是在参数函数中没有代码的情况下调用setState((){}),也会导致错误