【问题标题】:How to create 2 buttons in a row in Flutter?如何在 Flutter 中连续创建 2 个按钮?
【发布时间】:2020-09-04 19:55:59
【问题描述】:

我真的不明白哪里出了问题以及如何解决它

我想在屏幕上连续显示 2 个按钮

我有无状态小部件 MainPage:

class MainPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Center(
      child: Row(
        mainAxisAlignment: MainAxisAlignment.spaceBetween,
        children: [
          Person(),
          History()
        ],
      ),
    );
  }
}

我有 2 个按钮:人物和历史 有类 Person 和 History:

class Person extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        body: Container(
          child: RaisedButton(
            child: Container(
              width: 100,
              height: 100,
              child: Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: [
                  Text("Person"),
                  Icon(Icons.person)
                ],
              ),
            ),
          ),
        ),
    );
  }
}
class History extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Container(
        child: RaisedButton(
          child: Container(
            width: 100,
            height: 100,
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                Text("History"),
                Icon(Icons.history)
              ],
            ),
          ),
        ),
      ),
    );
  }
}

但我得到一个错误:A RenderFlex 被右侧的 Infinity 像素溢出。 我哪里错了?

【问题讨论】:

    标签: flutter dart flutter-scaffold


    【解决方案1】:

    好的,我看到很多可能是原因的事情。 首先,脚手架不是在每个无状态的小部件中都使用的,每个屏幕应该只有一个脚手架作为屏幕的根。

    其次,容器的主要功能是避免样板小部件,如果您只使用容器子属性,我会使用 SizedBox,但是在这种情况下,容器是不必要的。

    检查下面的笔,它没有使用2个脚手架,也没有使用那么多容器,看看mainAxisAlignment属性https://codepen.io/ayRatul/pen/gOrXqMw这一行

    另外,尝试将 container 替换为 SizedBox ,如果只使用高度和宽度,SizedBox 效果很好;)

    编辑:如果出于奇怪的原因,您仍想保留原始代码,我会使用

    Row(
         mainAxisSize:MainAxisSize.min,
            mainAxisAlignment: MainAxisAlignment.spaceBetween,
            children: [
              Person(),
              History()
            ],
    

    【讨论】:

      【解决方案2】:
      1. 每个屏幕/页面上只能有一个脚手架。 (reference)
      2. 因此将 Scaffold 从每个按钮移动到 MainPage。
      class MainPage extends StatelessWidget {
        @override
        Widget build(BuildContext context) {
          return Scaffold(
              body: Center(
              child: Row(
                mainAxisAlignment: MainAxisAlignment.spaceBetween,
                children: [
                  Person(),
                  History()
                ],
              ),
            ),
          );
        }
      }
      
      class Person extends StatelessWidget {
        @override
        Widget build(BuildContext context) {
          return Container(
            child: RaisedButton(
              child: Container(
                width: 100,
                height: 100,
                child: Column(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: [
                    Text("Person"),
                    Icon(Icons.person)
                  ],
                ),
              ),
            ),
          );
        }
      }
      class History extends StatelessWidget {
        @override
        Widget build(BuildContext context) {
          return Container(
              child: RaisedButton(
                child: Container(
                  width: 100,
                  height: 100,
                  child: Column(
                    mainAxisAlignment: MainAxisAlignment.center,
                    children: [
                      Text("History"),
                      Icon(Icons.history)
                    ],
                  ),
                ),
              ),
            );
        }
      }
      

      【讨论】:

        【解决方案3】:

        您不应该将Scaffold 放在任何地方。在这里阅读更多:https://api.flutter.dev/flutter/material/Scaffold-class.html

        class Person extends StatelessWidget {
          @override
          Widget build(BuildContext context) {
            return RaisedButton(
              onPressed: null,
              child: Container(
                width: 100,
                height: 100,
                child: Column(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: [Text("Person"), Icon(Icons.person)],
                ),
              ),
            );
          }
        }
        
        class History extends StatelessWidget {
          @override
          Widget build(BuildContext context) {
            return RaisedButton(
              onPressed: null,
              child: Container(
                width: 100,
                height: 100,
                child: Column(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: [Text("History"), Icon(Icons.history)],
                ),
              ),
            );
          }
        }
        

        【讨论】:

          【解决方案4】:

          你不应该嵌套Scaffolds


          为什么要嵌套Scaffolds

          Scaffold 被设计为 MaterialApp 的单一顶级容器,通常不需要嵌套脚手架,这意味着每个页面(更准确地说,每个路线/屏幕)都应该有一个 Scaffold,


          人物小部件

          class Person extends StatelessWidget {
            @override
            Widget build(BuildContext context) {
              return Container(
                child: RaisedButton(
                  child: Container(
                    width: 100,
                    height: 100,
                    child: Column(
                      mainAxisAlignment: MainAxisAlignment.center,
                      children: [Text("Person"), Icon(Icons.person)],
                    ),
                  ),
                ),
              );
            }
          }
          

          历史小工具

          class History extends StatelessWidget {
            @override
            Widget build(BuildContext context) {
              return  Container(
                  child: RaisedButton(
                    child: Container(
                      width: 100,
                      height: 100,
                      child: Column(
                        mainAxisAlignment: MainAxisAlignment.center,
                        children: [Text("History"), Icon(Icons.history)],
                      ),
                  ),
                ),
              );
            }
          }
          

          主页小部件

          class MainPage extends StatelessWidget {
            @override
            Widget build(BuildContext context) {
              return Scaffold(
                body: Center(
                  child: Row(
                    mainAxisAlignment: MainAxisAlignment.spaceBetween,
                    children: [Person(), History()],
                  ),
                ),
              );
            }
          }
          

          结果:

          注意:可以从上面进行一些改进: // 1. 您应该移除 RaisedButton Widget 中的多余容器 示例:

          class Person extends StatelessWidget {
            @override
            Widget build(BuildContext context) {
              return SizedBox(
                width: 100,
                height: 100,
                child: RaisedButton(
                  child: Column(
                    mainAxisAlignment: MainAxisAlignment.center,
                    children: [Text("Person"), Icon(Icons.person)],
                  ),
                ),
              );
            }
          }
          

          【讨论】:

          • 如果我的回答对您原帖中指定的问题有帮助,请采纳。
          猜你喜欢
          • 2021-06-08
          • 2010-10-16
          • 2019-02-25
          • 1970-01-01
          • 2020-01-26
          • 2023-01-12
          • 2022-01-25
          • 2020-02-06
          • 2018-09-23
          相关资源
          最近更新 更多