Flutter 设置状态颤振导致错误:类型';int';不是类型为';字符串';

Flutter 设置状态颤振导致错误:类型';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函数,如下所示: 按下

我正在使用flatter制作一个应用程序,我想在其中显示用户的购买情况,并有一个按钮隐藏和显示有关购买情况的图表。整个应用程序都连接到Firebase Cloud Firestore后端,所以我使用提供商来处理状态管理。在主页(UserPage)中,每当我对任何变量调用setState时,如果没有将其链接到任何其他变量,我都会得到错误:

类型“int”不是类型“String”的子类型

导致错误的相关小部件已被删除

采购清单

我尝试过在没有任何代码的情况下运行setState函数,如下所示:

按下时:(){setState((){});}

但仍然会得到相同的错误

main.dart

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((){}),也会导致错误