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(() );

仍然出现同样的错误。

ma​​in.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()

Flutter - 在构建期间调用 setState() 或 markNeedsBuild()

在构建期间调用 setState() 或 markNeedsBuild() - Flutter