实现PreferredSizeWidget用作Appbar

chr*_*788 2 flutter

我正在尝试构建一个可用于标识列表视图中的两列的组件。我希望能够将该标题栏实现为Scaffold中的appbar,以便可以在Scaffold的主体部分中实现ListView。我想这样做是因为我想在我的整个应用程序中多次使用此模式,并且不希望每次都实施粗略的标题栏。

因为AppBar组件所需的全部是PreferredSizeWidget的实现,所以我认为这应该非常简单:

import 'package:flutter/material.dart';

class ListTitleBar extends StatefulWidget implements PreferredSizeWidget {

  final String _left;
  final String _right;

  ListTitleBar(this._left, this._right);

  @override
  State<StatefulWidget> createState() => new ListTitleBarState(_left, _right);

  @override
  Size get preferredSize {
    new Size.fromHeight(20.0);
  }

}

class ListTitleBarState extends State<ListTitleBar> {

  String _leftTitle;
  String _rightTitle;

  ListTitleBarState(this._leftTitle, this._rightTitle);

  @override
  Widget build(BuildContext context) {

return new Container(

  decoration: new BoxDecoration(
    color: Colors.redAccent,
    border: new Border.all(color: Colors.black),
  ),

  child: new Row(
    mainAxisAlignment: MainAxisAlignment.spaceEvenly,
    children: <Widget>[

      ///Left Column Title
      new Column(
        children: <Widget>[
          new Container(
            color: Colors.redAccent,
            padding: const EdgeInsets.all(10.0),
            child: new Text(_leftTitle,
              style: new TextStyle(
                  color: Colors.white,
                  fontSize: 18.0
              ),
            ),
          )
        ],
      ),

      ///Right Column Title
      new Column(
        children: <Widget>[
          new Container(
            color: Colors.redAccent,
            padding: const EdgeInsets.all(10.0),
            child: new Text(_rightTitle,
              style: new TextStyle(
                  color: Colors.white,
                  fontSize: 18.0
              ),
            ),
          )
        ],
      ),

    ],
  ),
);

}

@override
void initState() {
  super.initState();
}

 @override
 void dispose() {
   super.dispose();
 }

}
Run Code Online (Sandbox Code Playgroud)

我的问题是要成功实现PreferredSizeWidget或完成我的目标还需要什么?现在,我得到以下堆栈跟踪,这似乎表明我忽略了实现的几个方面:

??? 小工具图书馆的例外情况???????????????????????????????????????????????? ??????????????? I / flutter(9130):抛出以下NoSuchMethodError来构建Scaffold(脏,状态:I / flutter(9130):ScaffoldState#7c75d(tickers:跟踪1个股票)):I / flutter(9130):getter'height'被调用为null。I / flutter(9130):接收方:空I / flutter(9130):尝试调用:高度I / flutter(9130):I / flutter(9130):引发异常时,这是堆栈:I / flutter( 9130):#0 Object.noSuchMethod(dart:core / runtime / libobject_patch.dart:46:5)I / flutter(9130):#1 ScaffoldState.build(package:flutter / src / material / scaffold.dart:1447: 57)I / flutter(9130):#2 StatefulElement.build(package:flutter / src / widgets / framework.dart:3713:27)I / flutter(9130):#3 ComponentElement。

Gir*_*ldi 6

我认为您忘了您的return帐单中的声明preferredSize。应该是这样的:

Size get preferredSize { return new Size.fromHeight(20.0); }

  • 或者将其写为: ```@override Size get PreferredSize =&gt; Size.fromHeight(20.0);``` 箭头语法不需要 `return` 语句。 (2认同)