Flutter: setState () недопустим для типа списка - PullRequest
0 голосов
/ 08 февраля 2020

мои братья! Извините, мой Engli sh ужасен, я надеюсь, что вы можете понять.

Я не могу использовать setState((){}) для обновления переменной типа List! Я пытаюсь исправить это долгое время, но мне не удалось.

Это мой демонстрационный код, вы можете запустить это:

import 'package:flutter/material.dart';

void main() => runApp(TestListUpdate()) ;

class TestListUpdate extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: TestListUpdatePage(),
    );
  }
}

class TestListUpdatePage extends StatefulWidget {
  TestListUpdatePage({Key key}) : super(key: key);

  @override
  _TestListUpdatePageState createState() => _TestListUpdatePageState();
}

class _TestListUpdatePageState extends State<TestListUpdatePage> {
  int _counter = 0;
  List<Widget> _list = [];

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  void _addPic() {

    setState(() {
      _list.add(
        ClipRRect(
            borderRadius: BorderRadius.circular(5),
            child: Image.network(
              'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1581151314271&di=6d55b078b319acc55d081685e3208b6c&imgtype=0&src=http%3A%2F%2Fimg-download.pchome.net%2Fdownload%2F1k1%2Fe0%2F32%2Fol8r6m-1sqx.jpg',
              fit: BoxFit.cover,
            )),
      );
    });
    print(_list.length);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Test'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.display1,
            ),
            Container(
                height: 100,
                child: GridView.count(
                  physics: NeverScrollableScrollPhysics(),
                  crossAxisCount: 4,
                  crossAxisSpacing: 5,
                  mainAxisSpacing: 5,
                  children: _list,
                ))
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          _incrementCounter();
          _addPic();
        },
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ), // This trailing comma makes auto-formatting nicer for build methods.
    );
  }
}


, когда я нажимаю кнопку добавления, номер изменился , Но данные сетки не меняются ..

Пожалуйста, помогите мне! Спасибо тебе!

Ответы [ 2 ]

0 голосов
/ 08 февраля 2020

Вы можете использовать «GridView.builder». Ваш "setState" работает. Не работает "GridView.count".

Container(
  height: 100,
  child: GridView.builder(
    itemBuilder: (context, index) {
      return _list[index];
    },
    itemCount: _list.length,
    physics: NeverScrollableScrollPhysics(),
    gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
      crossAxisCount: 4,
      crossAxisSpacing: 5,
      mainAxisSpacing: 5,
    ),
  ),
),
0 голосов
/ 08 февраля 2020

переместить инициализацию списка в функцию initState

изменить:

List<Widget> _list = [];

на:

List<Widget> _list;

инициализировать список в функции initState:

@override
void initState() {
 super.initState();
 _list = [];
}
...