我如何在initState中使用setState?

时间:2019-09-19 14:53:08

标签: flutter dart

我从API获取一些数据,我想在DropdownButton中使用它。当我更改DropdownButton的值时,它在屏幕上不会更改。

我认为这是因为我将setState用作initState,但是我必须将FutureBuilder放入initState以避免多次加载数据。 我该如何解决?

final _formKey = GlobalKey<FormState>();
String _selItem;
FutureBuilder _FBDDB;

void initState() {
  super.initState();

  _FBDDB = FutureBuilder(
    future: getdata(),
    builder: (context, snapshot) {
      if (snapshot.hasData) {
        return DropdownButton<String>(
          value: _selItem,
          onChanged: (v) {
            setState(() {
              _selItem = v;
            });
          },
          items: snapshot.data.items.map((item) {
            return DropdownMenuItem<String>(
                value: item.id, child: Text(item.name));
          }).toList(),
        );
      } else if (snapshot.hasError) {
        alertErr(context, snapshot.error.toString());
      }
      return Container(child: LinearProgressIndicator());
    },
  );
}


@override
Widget build(BuildContext context) {
  return new Scaffold(
    body: Form(
    key: _formKey,
    child: Container(child: _FBDDB,),
  ),
  );
}

2 个答案:

答案 0 :(得分:1)

您的做法不正确,请查看此代码。

@override
final _formKey = GlobalKey<FormState>();
String _selItem;
FutureBuilder _FBDDB;
Future _future; // create this

void initState() {
  super.initState();

  // assign it here
  _future = getData();
}

@override
Widget build(BuildContext context) {
  return new Scaffold(
    body: Form(
      key: _formKey,
      child: Container(
        child: FutureBuilder(
          future: _future, // use it here
          builder: (context, snapshot) {
            if (snapshot.hasData) {
              return DropdownButton<String>(
                value: _selItem,
                onChanged: (v) {
                  setState(() {
                    _selItem = v;
                  });
                },
                items: snapshot.data.items.map((item) {
                  return DropdownMenuItem<String>(
                      value: item.id, child: Text(item.name));
                }).toList(),
              );
            } else if (snapshot.hasError) {
              alertErr(context, snapshot.error.toString());
            }
            return Container(child: LinearProgressIndicator());
          },
        ),
      ),
    ),
  );
}

答案 1 :(得分:0)

您已将整个代码放入initState()中。您不必这样做。只需将更改后需要设置其值的变量以及所有其他代码置于initState()之外即可。