【发布时间】: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"]}'),
],
),
);
},
),
),
);
}
}
非常感谢您的帮助,谢谢
【问题讨论】:
标签: flutter dart google-cloud-firestore setstate flutter-provider