【问题标题】:SetState Flutter causing error : type 'int' is not a subtype of type 'String'SetState Flutter 导致错误:“int”类型不是“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"]}'),
                ],
              ),
            );
          },
        ),
      ),
    );
  }
}

非常感谢您的帮助,谢谢

【问题讨论】:

    标签: flutter dart google-cloud-firestore setstate flutter-provider


    【解决方案1】:

    在 Firebase 控制台中仔细检查您的数据类型。例如,您的userID 可能是一个字符串,您可以将其与userI.id 进行比较。添加.toString() 应该可以解决问题。

    【讨论】:

      【解决方案2】:

      所以错误是因为它期望的参数是 int 值并且它正在获取 String,检查参数类型或只是将 int 转换为 String

      【讨论】:

      • which 参数,即使只是调用 setState((){}) 参数函数内没有代码也会导致错误
      【解决方案3】:

      只要这样做,我就从 firestore 检索了我的手机号码,该号码是 int 值

      Text(document["mobileNo"].toString())
      

      【讨论】:

        猜你喜欢
        • 2021-05-10
        • 2020-04-23
        • 1970-01-01
        • 2019-10-15
        • 1970-01-01
        • 2020-04-22
        • 1970-01-01
        • 2022-09-27
        • 2021-02-17
        相关资源
        最近更新 更多