SetState Flutter 导致错误:“int”类型不是“String”类型的子类型
Posted
技术标签:
【中文标题】SetState Flutter 导致错误:“int”类型不是“String”类型的子类型【英文标题】:SetState Flutter causing error : type 'int' is not a subtype of type 'String' 【发布时间】:2020-09-10 21:01:04 【问题描述】:我正在使用 Flutter 制作一个应用,我想在其中显示用户的购买,并有一个按钮来隐藏和显示有关购买的图表。整个应用程序连接到 Firebase Cloud Firestore 后端,因此我使用 Provider 来处理状态管理。每当我在任何变量上调用 setState 时,在主页 (UserPage) 中,没有将它链接到其他任何东西,我都会收到错误消息:
type 'int' 不是 type 'String' 的子类型
相关的导致错误的小部件是
采购清单
我试过只运行一个 setState 函数,里面没有任何代码,像这样:
onPressed: () 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"]'),
],
),
);
,
),
),
);
非常感谢您的帮助,谢谢
【问题讨论】:
【参考方案1】:在 Firebase 控制台中仔细检查您的数据类型。例如,您的userID
可能是一个字符串,您可以将其与userI.id
进行比较。添加.toString()
应该可以解决问题。
【讨论】:
【参考方案2】:所以错误是因为它期望的参数是 int 值并且它正在获取 String,检查参数类型或只是将 int 转换为 String
【讨论】:
which 参数,即使只是调用 setState(()) 参数函数内没有代码也会导致错误【参考方案3】:只要这样做,我就从 firestore 检索了我的手机号码,该号码是 int 值
Text(document["mobileNo"].toString())
【讨论】:
以上是关于SetState Flutter 导致错误:“int”类型不是“String”类型的子类型的主要内容,如果未能解决你的问题,请参考以下文章
[踩坑]Flutter使用setState出错call setState() on a State object for a widget that no longer appears in th
[踩坑]Flutter使用setState出错call setState() on a State object for a widget that no longer appears in th
Flutter:在构建错误期间调用了 setState() 或 markNeedsBuild()
Flutter 错误 - 在构建期间调用了 setState() 或 markNeedsBuild()