【问题标题】:Drawing Tic Tac Toe grid with nested loops in Flutter在 Flutter 中绘制带有嵌套循环的井字游戏网格
【发布时间】:2021-02-26 02:45:01
【问题描述】:

我的问题如下。

我开始画出井字游戏网格,其中包含从行小部件开始的 noughts 和 crosss。然后我使用循环创建三列作为该行的子级。在我创建的每一列中 - 再次使用循环 - 三个容器。这些容器应该包含代表五角星和十字架的图标。到目前为止,一切都很好。请看下面的代码:

Row(mainAxisAlignment: MainAxisAlignment.center, children: [
          for (var i = 0; i < 3; i++)
            Column(mainAxisAlignment: MainAxisAlignment.center, children: [
              for (var j = 0; j < 3; j++)
                Container(
                  child: Icon(
                    iconlist[i][j],
                    color: Colors.pink,
                    size: 60,
                    semanticLabel:
                        'Text to announce in accessibility modes',
                  ),
                  padding: const EdgeInsets.all(30),
                  decoration: BoxDecoration(
                      border: Border.all(color: Colors.blue, width: 4)),
                ),
            ])
        ])

如您所见,我有一个名为 iconlist 的列表(它自然位于小部件树之外)。该列表实际上是一个嵌套列表:它具有三个列表作为元素。这些元素也是列表:这些子列表表示行,并且它们具有三个图标(IconData 类型),每个图标作为元素。列表的代码是:

    List iconlist = <List>[
  <IconData>[Icons.clear, Icons.radio_button_unchecked, Icons.clear],
  <IconData>[Icons.clear, Icons.radio_button_unchecked, Icons.clear],
  <IconData>[Icons.clear, Icons.radio_button_unchecked, Icons.clear]
];

非常合乎逻辑且可行的解决方案,您可能会这么想(我也是这么想的),但 Flutter 根本不喜欢这种结构。当我尝试运行此应用程序时,出现以下错误(红色背景上的黄色文本):

NoSuchMethodError:类“IconData”没有实例方法“[]”。 接收方:“IconData”实例尝试调用:另请参阅: https://flutter.dec/docs/testing/errors

“有趣”的地方在于,例如 iconlist[i + j] 可以完美运行。出于某种奇怪的原因,我无法通过下标列表来获取 IconData,即 iconlist[i][j]。

我做错了什么,有解决方法吗?

【问题讨论】:

    标签: list flutter dart


    【解决方案1】:

    我复制了您的代码,它可以正常工作,没有任何错误。请尝试运行以下代码:

        import 'package:flutter/material.dart';
        
        final Color darkBlue = Color.fromARGB(255, 18, 32, 47);
        
    List<List<IconData>> iconlist = [
      <IconData>[Icons.clear, Icons.radio_button_unchecked, Icons.clear],
      <IconData>[Icons.clear, Icons.radio_button_unchecked, Icons.clear],
      <IconData>[Icons.clear, Icons.radio_button_unchecked, Icons.clear]
    ];
    
        void main() {
          runApp(MyApp());
        }
        
        class MyApp extends StatelessWidget {
          @override
          Widget build(BuildContext context) {
            return MaterialApp(
              theme: ThemeData.dark().copyWith(scaffoldBackgroundColor: darkBlue),
              debugShowCheckedModeBanner: false,
              home: Scaffold(
                body: Center(
                  child: MyWidget(),
                ),
              ),
            );
          }
        }
        
        class MyWidget extends StatelessWidget {
          @override
          Widget build(BuildContext context) {
            
            return Row(mainAxisAlignment: MainAxisAlignment.center, children: [
                  for (var i = 0; i < 3; i++)
                    Expanded(child:Column(mainAxisAlignment: MainAxisAlignment.center, children: [
                      for (var j = 0; j < 3; j++)
                        Container(
                          child: Icon(
                            iconlist[i][j],
                            color: Colors.pink,
                            size: 60,
                            semanticLabel:
                                'Text to announce in accessibility modes',
                          ),
                          padding: const EdgeInsets.all(30),
                          decoration: BoxDecoration(
                              border: Border.all(color: Colors.blue, width: 4)),
                        ),
                    ]))
                ]);
        }
        }
    

    【讨论】:

    • 这越来越有趣了。我试图运行你的代码,得到了同样的错误信息:NoSuchMethodError: Class 'IconData' has no instance method '[]'。接收者:“IconData”实例尝试调用:另见:flutter.dec/docs/testing/errors 这种情况让我认为我的配置可能有问题,我试图在 DartPad 中运行两个代码(你的和我的)(dartpad.dev ):两个代码都运行没有任何错误,并且输出符合预期。 DartPad 有 Flutter:1.23.0-18.1.pre,我也有!任何想法,我应该如何开始解决这个问题?
    • 问题可能出在您的 lint 规则上。尝试将 iconlist 声明为 List> iconlist 或只是 var iconlist;我已经更新了上面的代码,请重新检查是否有效。
    • 我启用了 web:flutter config --enable-web ...然后我输入了 flutter run -d chrome ...在 Chrome 中运行一个网络版本,它工作了。在此之后也开始在 Android 模拟器中工作。这确实很奇怪。但它现在无论如何都在工作。 :S 我必须强调,我之前已经重新启动了 Android 模拟器,甚至重新启动了我的电脑,这最初并没有帮助。 :|
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-10
    • 2014-09-01
    • 2015-07-18
    • 2015-04-04
    • 1970-01-01
    相关资源
    最近更新 更多