颤动倍数if-statement

Flutter multiple if-statement

我的 flutter 应用程序中有以下倍数 if-statement:

        Text(text1).toString()==Text('Info and Comms').toString()?(snapshot.data.documents[8]['desc'].toString()).replaceAll("/n", "\n"):
        Text(text1).toString()==Text('Media').toString()?(snapshot.data.documents[10]['desc'].toString()).replaceAll("/n", "\n"):
        Text(text1).toString()==Text('Utilities').toString()?(snapshot.data.documents[16]['desc'].toString()).replaceAll("/n", "\n"):
        Text(text1).toString()==Text('Education').toString()?(snapshot.data.documents[4]['desc'].toString()).replaceAll("/n", "\n"):
        Text(text1).toString()==Text('Repairs').toString()?(snapshot.data.documents[13]['desc'].toString()).replaceAll("/n", "\n"):
        Text(text1).toString()==Text('Domestic Help').toString()?(snapshot.data.documents[3]['desc'].toString()).replaceAll("/n", "\n"):
        Text(text1).toString()==Text('Transport').toString()?(snapshot.data.documents[15]['desc'].toString()).replaceAll("/n", "\n"):
        Text(text1).toString()==Text('Manufacturing').toString()?(snapshot.data.documents[9]['desc'].toString()).replaceAll("/n", "\n"):
        Text(text1).toString()==Text('Mining').toString()?(snapshot.data.documents[11]['desc'].toString()).replaceAll("/n", "\n"):
        Text(text1).toString()==Text('Supply Chain').toString()?(snapshot.data.documents[14]['desc'].toString()).replaceAll("/n", "\n"):
        Text(text1).toString()==Text('Government').toString()?(snapshot.data.documents[6]['desc'].toString()).replaceAll("/n", "\n"):
        Text(text1).toString()==Text('Financial and Business Services').toString()?(snapshot.data.documents[5]['desc'].toString()).replaceAll("/n", "\n"):
        Text(text1).toString()==Text('Construction').toString()?(snapshot.data.documents[2]['desc'].toString()).replaceAll("/n", "\n"):
        Text(text1).toString()==Text('Agriculture').toString()?(snapshot.data.documents[1]['desc'].toString()).replaceAll("/n", "\n"):
        Text(text1).toString()==Text('Wholesale and Retail Trade').toString()?(snapshot.data.documents[17]['desc'].toString()).replaceAll("/n", "\n"):
        Text(text1).toString()==Text('Accomodation').toString()?(snapshot.data.documents[0]['desc'].toString()).replaceAll("/n", "\n"):
        Text(text1).toString()==Text('Health Social and Personal').toString()?(snapshot.data.documents[7]['desc'].toString()).replaceAll("/n", "\n"):
        Text(text1).toString()==Text('Movement').toString()?(snapshot.data.documents[12]['desc'].toString()).replaceAll("/n", "\n"):
        Text('Data not found').toString(),

在我的移动设备上部署时,它运行完美,但在 Play 商店启动后,它 returns 第一个语句不管怎样。

知道为什么现在坏了以及从哪里开始修复吗?

*****编辑*****

添加了 if-statement 所在的类别页面内容。 原始类别页面代码:

 class CategoryPage extends StatelessWidget {

  final String text1;
  final String text2;
  final String text3;
  CategoryPage(
      {Key key,
      @required this.text1,
      @required this.text2,
      @required this.text3})
      : super(key: key);


  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(text2),
        centerTitle: true,
        backgroundColor: Colors.grey,
      ),
      body: ListView(shrinkWrap: true, children: <Widget>[
        Container(
            child: ListTile(
              title: Text(
                'Current Level ' + text3.toString(),
                style: TextStyle(
                    //color: Colors.red[900],
                    color: Text(text3).toString() == Text("5").toString()
                        ? Colors.red[900]
                        : Text(text3).toString() == Text("4").toString()
                            ? Colors.orange[900]
                            : Text(text3).toString() == Text("3").toString()
                                ? Colors.brown[300]
                                : Text(text3).toString() == Text("2").toString()
                                    ? Colors.blue[300]
                                    : Text(text3).toString() == Text("1").toString()
                                        ? Colors.green[300]
                                        : Colors.black,
                    fontSize: 25,
                    fontWeight: FontWeight.bold),
                textAlign: TextAlign.center,
              ),
            ),
          ),
           Container(
            child: ListTile(
              title: Text(
                text1.toString(),
                style: TextStyle(
                    //color: Colors.red[900],
                    color: Colors.white,
                    fontSize: 20,
                    fontWeight: FontWeight.bold),
                textAlign: TextAlign.center,
              ),
            ),
          ),
        Container(
        alignment: Alignment.topLeft,
        padding: const EdgeInsets.all(8.0),
        child: StreamBuilder(
          stream: Text(text3).toString() == Text('1').toString()
              ? Firestore.instance.collection('Level1').snapshots()
              : Text(text3).toString() == Text('2').toString()
                  ? Firestore.instance.collection('Level2').snapshots()
                  : Text(text3).toString() == Text('3').toString()
                      ? Firestore.instance.collection('Level3').snapshots()
                      : Text(text3).toString() == Text('4').toString()
                          ? Firestore.instance.collection('Level4').snapshots()
                          : Text(text3).toString() == Text('5').toString()
                              ? Firestore.instance
                                  .collection('Level5')
                                  .snapshots()
                              : Firestore.instance
                                  .collection('Level1')
                                  .snapshots(),
          builder: (context, snapshot) {
            if (!snapshot.hasData) {
              return Text('Loading data ...');
            } else {
              return Text(
                //snapshot.data.documents[0]['desc'].toString(),
                Text(text1).toString()==Text('Info and Comms').toString()?(snapshot.data.documents[8]['desc'].toString()).replaceAll("/n", "\n"):
                Text(text1).toString()==Text('Media').toString()?(snapshot.data.documents[10]['desc'].toString()).replaceAll("/n", "\n"):
                Text(text1).toString()==Text('Utilities').toString()?(snapshot.data.documents[16]['desc'].toString()).replaceAll("/n", "\n"):
                Text(text1).toString()==Text('Education').toString()?(snapshot.data.documents[4]['desc'].toString()).replaceAll("/n", "\n"):
                Text(text1).toString()==Text('Repairs').toString()?(snapshot.data.documents[13]['desc'].toString()).replaceAll("/n", "\n"):
                Text(text1).toString()==Text('Domestic Help').toString()?(snapshot.data.documents[3]['desc'].toString()).replaceAll("/n", "\n"):
                Text(text1).toString()==Text('Transport').toString()?(snapshot.data.documents[15]['desc'].toString()).replaceAll("/n", "\n"):
                Text(text1).toString()==Text('Manufacturing').toString()?(snapshot.data.documents[9]['desc'].toString()).replaceAll("/n", "\n"):
                Text(text1).toString()==Text('Mining').toString()?(snapshot.data.documents[11]['desc'].toString()).replaceAll("/n", "\n"):
                Text(text1).toString()==Text('Supply Chain').toString()?(snapshot.data.documents[14]['desc'].toString()).replaceAll("/n", "\n"):
                Text(text1).toString()==Text('Government').toString()?(snapshot.data.documents[6]['desc'].toString()).replaceAll("/n", "\n"):
                Text(text1).toString()==Text('Financial and Business Services').toString()?(snapshot.data.documents[5]['desc'].toString()).replaceAll("/n", "\n"):
                Text(text1).toString()==Text('Construction').toString()?(snapshot.data.documents[2]['desc'].toString()).replaceAll("/n", "\n"):
                Text(text1).toString()==Text('Agriculture').toString()?(snapshot.data.documents[1]['desc'].toString()).replaceAll("/n", "\n"):
                Text(text1).toString()==Text('Wholesale and Retail Trade').toString()?(snapshot.data.documents[17]['desc'].toString()).replaceAll("/n", "\n"):
                Text(text1).toString()==Text('Accomodation').toString()?(snapshot.data.documents[0]['desc'].toString()).replaceAll("/n", "\n"):
                Text(text1).toString()==Text('Health Social and Personal').toString()?(snapshot.data.documents[7]['desc'].toString()).replaceAll("/n", "\n"):
                Text(text1).toString()==Text('Movement').toString()?(snapshot.data.documents[12]['desc'].toString()).replaceAll("/n", "\n"):
                Text('Data not found').toString(),
                style: TextStyle(
                    color: Colors.white,
                    fontSize: 15,
                    fontWeight: FontWeight.normal),
                textAlign: TextAlign.left,
              );
            }
          },
        ),
        decoration: BoxDecoration(border: Border.all(color: Colors.grey[300])),
      ),]
      ));
  }

}

*****更新***** 在按照 Yann39 的建议简化 if-statement 之后 - 从 Visual Code 部署到我的 phone 时,代码在我这边工作得很好,但从 Google Play Store 下载应用程序时仍然不起作用。

已更新类别页面:

class CategoryPage extends StatelessWidget {

  final String text1;
  final String text2;
  final String text3;
  CategoryPage(
      {Key key,
      @required this.text1,
      @required this.text2,
      @required this.text3})
      : super(key: key);


  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(text2),
        centerTitle: true,
        backgroundColor: Colors.grey,
      ),
      body: ListView(shrinkWrap: true, children: <Widget>[
        Container(
            child: ListTile(
              title: Text(
                'Current Level ' + text3.toString(),
                style: TextStyle(
                    //color: Colors.red[900],
                    color: Text(text3).toString() == Text("5").toString()
                        ? Colors.red[900]
                        : Text(text3).toString() == Text("4").toString()
                            ? Colors.orange[900]
                            : Text(text3).toString() == Text("3").toString()
                                ? Colors.brown[300]
                                : Text(text3).toString() == Text("2").toString()
                                    ? Colors.blue[300]
                                    : Text(text3).toString() == Text("1").toString()
                                        ? Colors.green[300]
                                        : Colors.black,
                    fontSize: 25,
                    fontWeight: FontWeight.bold),
                textAlign: TextAlign.center,
              ),
            ),
          ),
           Container(
            child: ListTile(
              title: Text(
                text1.toString(),
                style: TextStyle(
                    //color: Colors.red[900],
                    color: Colors.white,
                    fontSize: 20,
                    fontWeight: FontWeight.bold),
                textAlign: TextAlign.center,
              ),
            ),
          ),
        Container(
        alignment: Alignment.topLeft,
        padding: const EdgeInsets.all(8.0),
        child: StreamBuilder(
          stream: Text(text3).toString() == Text('1').toString()
              ? Firestore.instance.collection('Level1').snapshots()
              : Text(text3).toString() == Text('2').toString()
                  ? Firestore.instance.collection('Level2').snapshots()
                  : Text(text3).toString() == Text('3').toString()
                      ? Firestore.instance.collection('Level3').snapshots()
                      : Text(text3).toString() == Text('4').toString()
                          ? Firestore.instance.collection('Level4').snapshots()
                          : Text(text3).toString() == Text('5').toString()
                              ? Firestore.instance
                                  .collection('Level5')
                                  .snapshots()
                              : Firestore.instance
                                  .collection('Level1')
                                  .snapshots(),
          builder: (context, snapshot) {
            if (!snapshot.hasData) {
              return Text('Loading data ...');
            } else {
              return Text(DocumentUtils.getDocumentDescriptionFromTitle(snapshot, text1.toString()),style: TextStyle(
                     color: Colors.white,
                     fontSize: 15,
                     fontWeight: FontWeight.normal),
                 textAlign: TextAlign.left,);
            }
          },
        ),
        decoration: BoxDecoration(border: Border.all(color: Colors.grey[300])),
      ),]
      ));
  }

}

class DocumentUtils {

  static String getDocumentDescriptionFromTitle(AsyncSnapshot snapshot, String title) {
    var map = {
      'Info and Comms':8,
      'Media':10,
      'Utilities':16,
      'Education':4,
      'Repairs':13,
      'Domestic Help':3,
      'Transport':15,
      'Manufacturing':9,
      'Mining':11,
      'Supply Chain':14,
      'Government':6,
      'Financial and Business Services':5,
      'Construction':2,
      'Agriculture':1,
      'Wholesale and Retail Trade':17,
      'Accomodation':0,
      'Health Social and Personal':7,
      'Movement':12,
    };
    return map[title] != null ? snapshot.data.documents[map[title]]['desc'].toString().replaceAll("/n", "\n") : 'Data not found';
  }

}

*****更新******

经过上述if-statement简化后,显示了正确的类别描述,但现在只有 returns Collection 'Level1' from Firestore :

stream: Text(text3).toString() == Text('1').toString()
              ? Firestore.instance.collection('Level1').snapshots()
              : Text(text3).toString() == Text('2').toString()
                  ? Firestore.instance.collection('Level2').snapshots()
                  : Text(text3).toString() == Text('3').toString()
                      ? Firestore.instance.collection('Level3').snapshots()
                      : Text(text3).toString() == Text('4').toString()
                          ? Firestore.instance.collection('Level4').snapshots()
                          : Text(text3).toString() == Text('5').toString()
                              ? Firestore.instance
                                  .collection('Level5')
                                  .snapshots()
                              : Firestore.instance
                                  .collection('Level1')
                                  .snapshots(),

上面的多个 if-statement 在我的设备上部署应用程序时工作正常,只有当从 Play 商店安装应用程序时,多个 if-statement 才会出现这些问题。

也许它没有直接回答你的问题(评论太长了)但我不确定你为什么直接使用 Text(text1).toString() == Text('text').toString() 而不是 text1 == 'text'

另请注意,Text(text3).toString() 将 return 字符串 "Text(text3)",而不是包含的文本。如果要获取包含的文本,请使用 Text(text3).data。但是,您不必再在这里创建 Text 小部件,text1 == 'text' 应该可以完成这项工作,它更加简单和高效。

我也会将这些 if 重复简化为一个函数,例如(假设您在 snapshot.data.documents 中没有文档标题,那么您将不需要地图来执行映射):

class DocumentUtils {

  static String getDocumentDescriptionFromTitle(AsyncSnapshot<YourObject> snapshot, String title) {
    var map = {
      'Info and Comms':8,
      'Media':10,
      'Utilities':16,
      'Education':4,
      'Repairs':13,
      'Domestic Help':3,
      'Transport':15,
      'Manufacturing':9,
      'Mining':11,
      'Supply Chain':14,
      'Government':6,
      'Financial and Business Services':5,
      'Construction':2,
      'Agriculture':1,
      'Wholesale and Retail Trade':17,
      'Accomodation':0,
      'Health Social and Personal':7,
      'Movement':12,
    };
    return map[title] != null ? snapshot.data.documents[map[title]]['desc'].toString().replaceAll("/n", "\n") : 'Data not found';
  }

}

因此,在您的小部件中,您只需调用 DocumentUtils.getDocumentDescriptionFromTitle(snapshot, text1)

如果您的 snapshot.data.documents 中有文档标题,那么它将类似于:

class DocumentUtils {

  static String getDocumentDescriptionFromTitle(AsyncSnapshot<YourObject> snapshot, String title) {
    return snapshot.data.documents.firstWhere((Document d) => d.title == title)['desc'].replaceAll("/n", "\n");
  }

}