【问题标题】:Force rebuild of a stateful child widget in flutter在颤动中强制重建有状态的子小部件
【发布时间】:2021-11-01 04:10:02
【问题描述】:

假设我有一个主屏幕(有状态小部件),其中有一个变量 count 作为状态。在这个主屏幕中有一个按钮和另一个有状态的小部件(我们称之为MyListWidgetMyListWidget 根据count 变量的值在initState 中初始化它自己的小部件。显然,如果你改变count 并调用SetStateMyListWidget 不会发生任何事情,因为它会在initState 中创建值。如何强制重建MyListWidget? 我知道在这个例子中,我们可以将我们在initState 中所做的事情转移到build 方法中。但在我真正的问题中,我无法在initState 方法中移动我在build 中所做的事情。

这是完整的代码示例:

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MyHomePage(),
    );
  }
}

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

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

class _MyHomePageState extends State<MyHomePage> {
  int count = 5;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        body: Row(
      children: [
        Expanded(
          child: MaterialButton(
            child: Text('Click me'),
            color: Colors.red,
            onPressed: () {
              setState(() {
                count++;
              });
            },
          ),
        ),
        MyListWidget(count),
      ],
    ));
  }
}

class MyListWidget extends StatefulWidget {
  final int count;

  const MyListWidget(this.count, {Key? key}) : super(key: key);

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

class _MyListWidgetState extends State<MyListWidget> {
  late List<int> displayList;

  @override
  void initState() {
    super.initState();
    displayList = List.generate(widget.count, (int index) => index);
  }

  @override
  Widget build(BuildContext context) {
    return Expanded(
      child: ListView.builder(
        itemBuilder: (BuildContext context, int index) => ListTile(
          title: Text(displayList[index].toString()),
        ),
        itemCount: displayList.length,
      ),
    );
  }
}

【问题讨论】:

    标签: flutter dart stateful


    【解决方案1】:

    使用这个:

    class _MyHomePageState extends State<MyHomePage> {
      int count = 5;
      MyListWidget myListWidget = MyListWidget(5);
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
            body: Row(
          children: [
            Expanded(
              child: MaterialButton(
                child: Text('Click me'),
                color: Colors.red,
                onPressed: () {
                  setState(() {
                     count++;
                     myListWidget = MyListWidget(count);
                   });
                },
              ),
            ),
            myListWidget,
          ],
        ));
      }
    }
    

    【讨论】:

    • 谢谢,原来这么简单!
    猜你喜欢
    • 2020-08-06
    • 1970-01-01
    • 2020-04-20
    • 1970-01-01
    • 2018-03-14
    • 2020-08-01
    • 2020-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多