如何将符合 Material Design 标准的填充应用到我的 Flutter Scaffold?

Posted

技术标签:

【中文标题】如何将符合 Material Design 标准的填充应用到我的 Flutter Scaffold?【英文标题】:How do I apply Material Design-compliant padding to my Flutter Scaffold? 【发布时间】:2017-05-30 11:44:38 【问题描述】:

我编写了一个使用 package:flutter/material.dart 的 Flutter 应用程序。在 ios 模拟器上运行应用程序如下所示。可以看到,一行中的组件之间是没有padding的,组件到达top、bottom、left和right都没有padding/margin/border。我的问题是:

应用符合材料的填充的推荐方法是什么,例如转换为和下拉按钮之间的标签组件间隙。我会将我的组件打包在一个容器中并在那里应用填充吗?

非常感谢您。

这是应用程序代码:

import 'package:flutter/material.dart';
import 'converter.dart';
import 'model.dart';

const _appName = 'Temperature Converter';

void main() 
  runApp(new MyApp());


class MyApp extends StatelessWidget 
  @override
  Widget build(BuildContext context) 
    return new MaterialApp(
      title: _appName,
      theme: new ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: new MyHomePage(title: _appName),
    );
  


class MyHomePage extends StatefulWidget 
  MyHomePage(Key key, this.title) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => new _MyHomePageState();


class _MyHomePageState extends State<MyHomePage> 
  final Model model = new Model();
  var _currentInput = const InputValue();

  @override
  Widget build(BuildContext context) 
    return new Scaffold(
      appBar: new AppBar(
        title: new Text(config.title),
      ),
      body: new Column(children: <Widget>[
        new Row(children: <Widget>[
          new Expanded(
              child: new Input(
                  hintText: 'Temperature',
                  value: _currentInput,
                  onChanged: (input) => _currentInput = input)),
          new DropdownButton(
              items: createUnit(),
              onChanged: (temperatureUnit newValue) 
                setState(() 
                  model.inUnit = newValue;
                );
              ,
              value: model.inUnit)
        ]),
        new Row(children: <Widget>[
          new Text("Convert to"),
          new DropdownButton(
              items: createUnit(),
              onChanged: (temperatureUnit newValue) 
                setState(() 
                  model.outUnit = newValue;
                );
              ,
              value: model.outUnit),
        ]),
        new FlatButton(
            child: new Text('Calculate'),
            onPressed: () 
              setState(() 
                double inTemp = stringToDouble(_currentInput.text);
                model.inTemperature = inTemp;
                model.calculateOutTemperature();
              );
            ),
        new Text(model.outTemperatureAsString)
      ]), // This trailing comma tells the Dart formatter to use
      // a style that looks nicer for build methods.
    );
  

  List<DropdownMenuItem> createUnit() 
    var l = new List<DropdownMenuItem<temperatureUnit>>();
    // degrees Celsius
    l.add(new DropdownMenuItem<temperatureUnit>(
        value: temperatureUnit.degreesCelsius,
        child: new Text(unitDegreesCelsius)));
    // degrees Fahrenheit
    l.add(new DropdownMenuItem<temperatureUnit>(
        value: temperatureUnit.degreesFahrenheit,
        child: new Text(unitDegreesFahrenheit)));
    // Kelvin
    l.add(new DropdownMenuItem<temperatureUnit>(
        value: temperatureUnit.kelvin, child: new Text(unitKelvin)));
    return l;
  

这个问题绝不是暗示 Flutter 遗漏了什么。我只想把它做好。 ;-)

【问题讨论】:

【参考方案1】:

一般来说,我建议使用Block 作为 Scaffold 的子级。它有一个可以设置的padding 值。

您也可以只使用Padding 小部件。

【讨论】:

【参考方案2】:

我只知道ButtonTheme 有一个填充值

ButtonTheme.of(context).padding

所以我认为目前最好的解决方案是拥有恒定值并使用 Container 来应用填充。

也许我错了,但我不知道有任何 Widget 会自动应用任何 Material 填充。

【讨论】:

以上是关于如何将符合 Material Design 标准的填充应用到我的 Flutter Scaffold?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用Material Design在Alert Dialog Fragment中设置按钮样式?

Material Design 开发利器:Android Design Support Library 介绍

Android Material Design系列之RecyclerView和CardView

Material Design组件之FloatingActionButton

如何在本地将 Material Design Iconic Font 托管到 vue 应用中

使用 Material Design 编辑模式时如何选择选项