【问题标题】:Flutter streambuilder does not update a statefulwidget or statelesswidgetFlutter streambuilder 不会更新 statefulwidget 或 statelesswidget
【发布时间】:2021-12-14 01:18:32
【问题描述】:

我正在尝试构建一个流生成器。
我的问题是streambuilder没有更新streambuilder小部件内的其他statefulWidgets。

这是我的代码:

class ChatPage extends StatefulWidget {
  //pass parm
  var chat_object;
  ChatPage(this.chat_object, {Key? key}) : super(key: key);

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

class _ChatPage extends State<ChatPage> {
  //pass parm
  var chat_object;
  _ChatPage(this.chat_object);

  @override
  Widget build(BuildContext context) {
    // Full screen width and height
    double width = MediaQuery.of(context).size.width;
    double height = MediaQuery.of(context).size.height;

    // Height (without SafeArea)
    var padding = MediaQuery.of(context).padding;
    double height1 = height - padding.top - padding.bottom;

    // Height (without status bar)
    double height2 = height - padding.top;

    // Height (without status and toolbar)
    double height3 = height - padding.top - kToolbarHeight;

    //scaffold
    return Scaffold(
      appBar: customAppBarGoBack('Chat', context),
      body: LimitedBox(
        maxHeight: height3,
        child: Stack(
          children: [
            StreamBuilder<dynamic>(
              stream: FirebaseFirestore.instance
                  .collection('chat')
                  .doc('chat_messages')
                  .collection(chat_object.chat_message_id[0].trim())
                  .orderBy('message_time')
                  .snapshots(),
              builder: (
                BuildContext context,
                AsyncSnapshot<dynamic> snapshot,
              ) {
                if (snapshot.connectionState == ConnectionState.waiting) {
                  return CircularProgressIndicator();
                } else {
                  if (snapshot.hasError) {
                    return const Text('Error');
                  } else if (snapshot.hasData) {
                    //chat room object list
                    var chat_room_object =
                        load_object(snapshot.data, chat_object).first;

                    //chat message object list
                    var message_object =
                        load_object(snapshot.data, chat_object).last;

                    print('message_object: ' + message_object.toString());

                    return Test(chat_room_object, message_object);
                  } else {
                    return const Text('Empty data');
                  }
                }
              },
            ),
          ],
        ),
      ),
      drawer: CustomSideBar(context),
    );
  }
}

//test
class Test extends StatefulWidget {
  //pass parm
  var chat_room_object;
  var message_object;
  Test(this.chat_room_object, this.message_object, {Key? key})
      : super(key: key);

  @override
  _Test createState() => _Test(chat_room_object, message_object);
}

class _Test extends State<Test> {
  //pass parm
  _Test(this.chat_room_object, this.message_object);
  var chat_room_object;
  var message_object;

  @override
  Widget build(BuildContext context) {
    return ListView.builder(
      itemCount: message_object.length,
      itemBuilder: (context, i) {
        return Text(message_object[i].message.toString());
      },
    );
  }
}

如果我在流构建器中构建一个列表,该列表将被更新。 但是,如果我在新小部件内构建列表并将值传递给列表小部件,则该小部件将不会更新

任何人都可以给我一个简单示例如何更新包含在流构建器中的 statefulwidget 中的值?

【问题讨论】:

    标签: flutter stream-builder statefulwidget statelesswidget


    【解决方案1】:

    除了在Test小部件的状态构造函数中传递参数,您可以尝试直接从小部件中访问它们吗?示例如下。

    //test
    class Test extends StatefulWidget {
    //pass parm
    var chat_room_object;
    var message_object;
    
    Test(this.chat_room_object, this.message_object, {Key? key})
      : super(key: key);
    
    @override
    _Test createState() => _Test();
    }
    
    class _Test extends State<Test> {
    //pass parm
    _Test();
    
    @override
    Widget build(BuildContext context) {
    return ListView.builder(
      itemCount: widget.message_object.length,
      itemBuilder: (context, i) {
        return Text(widget.message_object[i].message.toString());
      },
    );
    }
    }
    

    【讨论】:

    • 你好 ACR,谢谢。我从您的示例中得到了解决方案。非常感谢(:
    猜你喜欢
    • 2020-04-06
    • 2020-05-12
    • 2021-09-19
    • 2021-06-24
    • 2020-02-25
    • 2020-10-15
    • 2019-05-24
    • 2019-08-25
    • 2018-12-30
    相关资源
    最近更新 更多