1

我想创建一个 ItemsDrawer Stateful Widget,ListTile 应该改变 Item 屏幕的内容,但它没有改变。另外,如何使用 List.builder 创建 ListTile 列表?

创建方法 itemDrawer() 有效,但现在我想将对象传递到抽屉中。

 Drawer itemDrawer(BuildContext context) {
    return Drawer(
  child: ListView(
    children: <Widget>[

      ListTile(
        title: InkWell(
          onTap: () {
            setState(() {
              item = items[0];
              Navigator.of(context).pop();
            });
          },
          child: Text(
            'item1',
            style: TextStyle(fontSize: 20),
          ),
        ),
      ),
      ListTile(
        title: InkWell(
          onTap: () {
            setState(() {
              item= items[1];
            });
            Navigator.of(context).pop();
          },
          child: Text(
            'item2',
            style: TextStyle(fontSize: 20),
          ),
        ),
      ),
      ],
    ),
   );
}

items 是类 Item 的列表。

List<Item> items= [
  item1Data,
  item2Data,
  item3Data,
  item4Data,
  item5Data,
];

我想创建的不是方法 itemDrawer(context):

class ItemsDrawer extends StatefulWidget {

final Item item;

ItemsDrawer({Key key, this.item}) : super(key: key);


@override
_ItemsDrawer State createState() => _ItemsDrawerState();
}

class _ItemsDrawerState extends State<ItemsDrawer> {


 @override
 Widget build(BuildContext context) {

  return Drawer(
   child: ListView(
    children: <Widget>[
      Container(
        decoration: BoxDecoration(),
      ),
      ListTile(
        title: InkWell(
          onTap: () {
            setState(() {
              widget.item= items[0];
              Navigator.of(context).pop();
            });
          },
          child: Text(
            'item1',
            style: TextStyle(fontSize: 20),
          ),
        ),
      ),
.....

在 widget.item 上说:'item' 不能用作设置器,因为它是最终的

更新:显示内容的 ItemScreen:

class ItemScreen extends StatefulWidget {


@override
_ItemScreen State createState() => _ItemScreenState();
}

class _ItemScreentate extends State<ItemScreen> {
Item item;
final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState();

@override
void initState() {
 super.initState();
 item = items[0];
}

@override
Widget build(BuildContext context) {
  return Scaffold(
    key: _scaffoldKey,
    backgroundColor: kcAppBackground,
    appBar: AppBar(
    //App Bar Title
     title: modifiedAppBarTitleText(item.itemTitle),
   ..... 
drawer: ItemDrawer(key: _scaffoldKey, item: item,),
4

1 回答 1

1

你得到的错误是因为你试图改变一些被宣布为最终的东西

添加

class _ItemsDrawerState extends State<ItemsDrawer> {

 Item item

 @override
  void initState() {
    item = widte.item // maybe copy it... or reinit if you need
    super.initState();
  }

但是,如果您想从另一个小部件更新小部件,您可能需要查看这篇文章这篇文章

于 2019-09-02T06:24:40.473 回答