SetState Flutter вызывает ошибку: тип int не является подтипом типа String

Я использую Flutter для создания приложения, в котором я хочу отображать покупки пользователя и иметь кнопку для скрытия и отображения диаграммы покупок. Все приложение подключено к бэкэнду Firebase Cloud Firestore, поэтому я использую Provider для управления состоянием. На домашней странице (UserPage) всякий раз, когда я вызываю setState для любой переменной, без связи с чем-либо еще, я получаю сообщение об ошибке:

тип int не является подтипом типа String

Соответствующий виджет, вызывающий ошибку, был

PurchaseList

Я пробовал просто запустить функцию 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"]}'),
                ],
              ),
            );
          },
        ),
      ),
    );
  }
}

Я бы очень признателен за помощь, спасибо


person Jonathan    schedule 24.05.2020    source источник


Ответы (3)


Дважды проверьте свой тип данных в Firebase Console. Возможно, ваш userID - это, например, строка, которую вы сравниваете с userI.id. Добавление .toString() должно решить проблему.

person Lakshitha Wisumperuma    schedule 24.05.2020

Таким образом, ошибка возникает из-за того, что ожидаемый параметр является значением int, и он получает String, проверяет типы параметров или просто конвертирует int в String

person Sagar Acharya    schedule 24.05.2020
comment
какой параметр, хотя даже простой вызов setState (() {}) без кода внутри функции аргумента вызывает ошибку - person Jonathan; 24.05.2020

просто сделай это, я получил свой номер мобильного телефона, который имеет значение int, из firestore

Text(document["mobileNo"].toString())
person rozin    schedule 19.01.2021