Listful不会使用StatefulWidget

时间:2018-05-31 06:36:02

标签: dart flutter

我正在制作一个用于学习目的的演示。在该演示中,我刚刚添加了ListView,当我点击ListTile时,Icons.favorite我只想做主动和无效。

以下是我的代码。

import 'package:flutter/material.dart';

void main() => runApp(new RandomWordApp());

class RandomWordApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return new MaterialApp(
      title: "Random App",
      home: new RandomWordHome(),
    );
  }
}

class RandomWordHome extends StatefulWidget {
  @override
  createState() => new RandomState();
}

class RandomState extends State<RandomWordHome> {
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return new Scaffold(
      appBar: new AppBar(
        title: new Text("Random Word"),
      ),
      body: setupListView(),
    );
  }

  Widget setupListView() {
    final _arrayOfData = [
      {
        "name": "Amit Patel",
        "address": "Junagadh"
      },
      {"name": "Arjun Jain", "address": "Madhya Pradesh"},
      {"name": "Ajay Shah", "address": "Limbadi"},
      {"name": "Ankur Patel", "address": "Visanagar"},
      {"name": "Soheb Ansari", "address": "Ahmedabad"}
    ];    
    final _arraySelectedRowStatus = List.filled(5, 0);

    return new ListView.builder(
        padding: new EdgeInsets.all(10.0),
        itemCount: _arrayOfData.length,
        itemBuilder: (context, i) {
          return new ListTile(
            title: new Text(_arrayOfData[i]["name"]),
            subtitle: new Text(_arrayOfData[i]["address"]),
            leading: new CircleAvatar(
                backgroundColor: Colors.blue,
                child: new Text(_arrayOfData[i]["name"][0])),
            trailing: new Icon(
              (_arraySelectedRowStatus[i] == 0
                  ? Icons.favorite_border
                  : Icons.favorite),
              color: (_arraySelectedRowStatus[i] == 0 ? null : Colors.red),
            ),
            onTap: () {
              setState(
                () {
                  _arraySelectedRowStatus[i] =
                      (_arraySelectedRowStatus[i] == 0 ? 1 : 0);         
                  Scaffold.of(context).showSnackBar(new SnackBar(
                      content:
                          new Text("You are selecting at " + i.toString())));
                },
              );
            },
          );
        });
  }
}

一切都运作良好,即使我从下面得到预期的输出

print(_arrayOfData[i]["name"] + " - " + _arraySelectedRowStatus[i].toString());

Icon不是更改可能是因为ListView没有重新加载。我哪里出错了?指导我正确的方向。

2 个答案:

答案 0 :(得分:1)

[更新]

这是完整的工作代码。

{{1}}

代码中的一些问题。

  1. 变量_arraySelectedRowStatus被错误地定义为最终
  2. 状态变量应该在状态类而不是方法中声明。
  3. setState((){})就像这样使用。

答案 1 :(得分:1)

您的方法存在一些问题

  1. 要更新UI,必须使用setState()方法。改变变量是不够的。

  2. 您始终在ListView.builder块中创建最终List: final _arraySelectedRowStatus = List.filled(5,0); 然后使用此列表渲染你的用户界面所以_arraySelectedRowStatus将始终包含 0

  3. 以下是可以使用的更新代码

    import 'package:flutter/material.dart';
    
    void main() => runApp(new RandomWordApp());
    
    class RandomWordApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        // TODO: implement build
        return new MaterialApp(
          title: "Random App",
          home: new RandomWordHome(),
        );
      }
    }
    
    class RandomWordHome extends StatefulWidget {
      @override
      createState() => new RandomState();
    }
    
    class RandomState extends State<RandomWordHome> {
      List _arraySelectedRowStatus = List.filled(5, 0);
    
      @override
      Widget build(BuildContext context) {
        // TODO: implement build
        return new Scaffold(
          appBar: new AppBar(
            title: new Text("Random Word"),
          ),
          body: setupListView(),
        );
      }
    
      Widget setupListView() {
        final _arrayOfData = [
          {"name": "Amit Patel", "address": "Junagadh"},
          {"name": "Arjun Jain", "address": "Madhya Pradesh"},
          {"name": "Ajay Shah", "address": "Limbadi"},
          {"name": "Ankur Patel", "address": "Visanagar"},
          {"name": "Soheb Ansari", "address": "Ahmedabad"}
        ];
    
        return new ListView.builder(
            padding: new EdgeInsets.all(10.0),
            itemCount: _arrayOfData.length,
            itemBuilder: (context, i) {
              return new ListTile(
                title: new Text(_arrayOfData[i]["name"]),
                subtitle: new Text(_arrayOfData[i]["address"]),
                leading: new CircleAvatar(
                    backgroundColor: Colors.blue,
                    child: new Text(_arrayOfData[i]["name"][0])),
                trailing: new Icon(
                  (_arraySelectedRowStatus[i] == 0
                      ? Icons.favorite_border
                      : Icons.favorite),
                  color: (_arraySelectedRowStatus[i] == 0 ? null : Colors.red),
                ),
                onTap: () {
                  _arraySelectedRowStatus[i] =
                      (_arraySelectedRowStatus[i] == 0 ? 1 : 0);
                  print(_arrayOfData[i]["name"] +
                      " - " +
                      _arraySelectedRowStatus[i].toString());
    
                  setState(() {
                    _arraySelectedRowStatus = _arraySelectedRowStatus;
                  });
    
                  Scaffold.of(context).showSnackBar(new SnackBar(
                      content: new Text("You are selecting at " + i.toString())));
                },
              );
            });
      }
    }