我創建了一個用于輸入資料和顯示的螢屏,帶有一個有狀態的小部件 HomeScreen
我在主螢屏中使用了兩個小部件,它們是輸入表單和顯示資料,它們都是無狀態小部件......但是每當我添加記錄時,它都會改變無狀態小部件卡片的顏色,因為我已將其設定為隨機顏色。這意味著即使它是無狀態的,小部件也會重新構建..
是的,因為我不想在輸入每條記錄時改變顏色。
或者看起來我對無狀態和有狀態的概念有錯誤..
我認為設定為無狀態的小部件保持不變......
糾正我如果我錯了..
這是我的 3 個檔案
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')),
],
),
),
),
);
}
}
顯示資料.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),);
}),
);
}
}
``
uj5u.com熱心網友回復:
因此,當一個有狀態的小部件重建時,它會完全重建它的子部件,無論它們是有狀態的還是無狀態的,除非子部件被標記為const(然后子部件的重建不會發生,因為它無論如何都應該保持不變)。
特別是在您的示例中,onPressed觸發_addRecord呼叫setState(). 每當setState使用新引數呼叫父視窗小部件并且因為它的孩子EntryForm(),因為它的子小部件也依賴于必須重建的那些。
希望它能增加你對狀態的理解。
uj5u.com熱心網友回復:
好吧,你是對的,也是錯的。
你的陳述'我認為設定為無狀態的小部件保持不變......' - 這是真的。
所以無狀態小部件是一個不可變的小部件,它不能對狀態變化做出反應并重新渲染,你將不得不使用某種形式的狀態管理。
您只是對 Stateful Widget 有錯誤的概念。當您呼叫 setState() 時,有狀態的小部件將重建整個小部件。如果您在有狀態小部件中具有無狀態小部件,則無關緊要,如果您呼叫 setState(),則將重建整個有狀態小部件。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/489273.html
標籤:扑
上一篇:MediaQuery.of在MaterialApp內拋出例外
下一篇:如何正確匯入彎曲的導航欄?
