为什么无状态的小部件重建进入新数据

发布于 2025-02-06 15:45:35 字数 2301 浏览 0 评论 0原文

我创建了一个用于输入数据和显示的屏幕, 有了一个有状态的小部件HomeScreen,

我在主屏幕内使用了两个小部件,它们是输入表格和显示数据,两个都是无状态的小部件...但是,每当我添加记录时,它会更改无状态小部件的颜色,因为我将其设置为随机颜色。这意味着小部件也是重建事件的重建事件

或看来我有一个

概念


import 'package:flutter/material.dart';
import 'displaydata.dart';
import 'entryform.dart';
class HomeScreen extends StatefulWidget {
  @override
  State<HomeScreen> createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
  List <double> numbers=[44.43,65.64,35.64,76.64];
  void _addRecord(double num)
  {
   numbers.add(num);
    setState(() {
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('okay'),),
      body: Column(children: [
        EntryForm(_addRecord),
        DisplayData(list: numbers,),
      ],),
    );
  }
}

错误

import 'package:flutter/material.dart';
import 'dart:math';

class EntryForm extends StatelessWidget {
  final Function addrecord;
  EntryForm(this.addrecord);
  final txtname=TextEditingController();

  @override
  Widget build(BuildContext context) {
    return Card(
      color: Color.fromRGBO(Random().nextInt(255), Random().nextInt(255), Random().nextInt(255), 1),
      child: Padding(

        padding: const EdgeInsets.all(14.0),
        child: Container(
          color: Colors.green,
          child: Column(
            children: [
              TextField(
                controller: txtname,
              ),
              SizedBox(height: 10,),
              TextButton(onPressed: (){
                  addrecord(double.parse(txtname.text));
                }, child: Text('Add Record')),
            ],
          ),
        ),
      ),
    );
  }
}

状态

import 'package:flutter/material.dart';

class DisplayData extends StatelessWidget {
  final List<double> list;
  DisplayData({required this.list});
  @override
  Widget build(BuildContext context) {
    return Container(
      height: 400,
      child: ListView.builder(
         itemCount: list.length,
          itemBuilder: (context,index){
             return Text(list[index].toString(),style: TextStyle(fontSize: 30.0),);
          }),
    );
  }
}

``

I have created a screen for entering data and display,
with a stateful widget HomeScreen

I have used two widget inside home screen which are entry form and display data , both are stateless widgets...but Whenever I add records it changes colour of stateless widget's card as I have set as random colour. that means that widget is also rebuild eventhought it is stateless..

Y its happening as I don't want to change colour on entering each records.

or looks like I am having a wrong concept of stateless nd stateful..

I think widget which is set as stateless remains unchanged...

Correct me If I am wrong..

here is my 3 files

HomeScreen.dart


import 'package:flutter/material.dart';
import 'displaydata.dart';
import 'entryform.dart';
class HomeScreen extends StatefulWidget {
  @override
  State<HomeScreen> createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
  List <double> numbers=[44.43,65.64,35.64,76.64];
  void _addRecord(double num)
  {
   numbers.add(num);
    setState(() {
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('okay'),),
      body: Column(children: [
        EntryForm(_addRecord),
        DisplayData(list: numbers,),
      ],),
    );
  }
}

EntryForm.dart

import 'package:flutter/material.dart';
import 'dart:math';

class EntryForm extends StatelessWidget {
  final Function addrecord;
  EntryForm(this.addrecord);
  final txtname=TextEditingController();

  @override
  Widget build(BuildContext context) {
    return Card(
      color: Color.fromRGBO(Random().nextInt(255), Random().nextInt(255), Random().nextInt(255), 1),
      child: Padding(

        padding: const EdgeInsets.all(14.0),
        child: Container(
          color: Colors.green,
          child: Column(
            children: [
              TextField(
                controller: txtname,
              ),
              SizedBox(height: 10,),
              TextButton(onPressed: (){
                  addrecord(double.parse(txtname.text));
                }, child: Text('Add Record')),
            ],
          ),
        ),
      ),
    );
  }
}

DisplayData.dart

import 'package:flutter/material.dart';

class DisplayData extends StatelessWidget {
  final List<double> list;
  DisplayData({required this.list});
  @override
  Widget build(BuildContext context) {
    return Container(
      height: 400,
      child: ListView.builder(
         itemCount: list.length,
          itemBuilder: (context,index){
             return Text(list[index].toString(),style: TextStyle(fontSize: 30.0),);
          }),
    );
  }
}

``

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

夢归不見 2025-02-13 15:45:35

好吧,你是对的,同时是对的。

您的陈述“我认为将无状态的小部件设置为没有变化的……” - 这是事实。

因此,无状态小部件是一个不变的小部件,无法对状态变化和重新渲染反应,您将不得不使用某种形式的状态管理。

您只是有一个错误的状态小部件概念。当您调用setState()时,状态小部件将重建整个小部件。如果您在一个状态的小部件内有无状态的小部件,那么如果您调用setState(),则将重建整个状态小部件。

Well, you are right and wrong both at the same time.

Your statement 'I think widget which is set as stateless remains unchanged...' - This is true.

So Stateless widget is an immutable widget that cannot react to state changes and re-render, you will have to use some form of state management.

You just have the wrong concept of Stateful Widget. Stateful widget will rebuild the whole widget when you call setState(). Does not matter if you have stateless widgets inside a stateful widget, the whole stateful widget will be rebuilt if you call setState().

独夜无伴 2025-02-13 15:45:35

因此,当一个陈述的小部件重建时,无论他们是状态或无状态的,它都会完全与孩子重建,除非儿童小部件被标记为const(然后,孩子的重建不会像这样发生时发生无论如何都将保持不变)。

特别是在您的示例中,onpressed触发父函数_ADDRECORD nath setState()。每当setState带有新参数时,父型小部件重建,并且因为其子女entryform()也取决于它也必须重建的。

希望它会为您对状态的理解增加一些。

So, when a stateful widget rebuilds, it rebuilds entirely with its children included no matter stateful or stateless they are, unless the child widget is marked as const (then rebuild of a child won't happen as it shall remain the same anyway).

Particular in your example, onPressed triggers parent function _addRecord which calls setState(). Parent widget rebuilds whenever setState is called with new parameters and because its child EntryForm() depends on those it has to be rebuilt as well.

Hopes it'll add some to your understanding of state.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文