有状态窗口小部件定义为在其生命周期内更改其状态的任何窗口小部件.但是StatelessWidget,拥有一个StatefulWidget孩子是一个非常普遍的做法.StatelessWidget如果它有StatefulWidget一个孩子,不会成为有状态的吗?
我尝试将文档作为代码的一部分进行查看StatelessWidget,但无法弄清楚一个StatelessWidget可以Statefulwidget作为其子代的方式并仍然存在StatelessWidget.
Flutter中有状态和无状态小部件之间的关系和区别是什么?
我正在尝试构建我的第一个 Flutter 应用程序,但在将数据传递到无状态小部件时遇到了困难。我有以下课程:
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'App Title',
theme: new ThemeData(
primarySwatch: Colors.green,
),
home: new MainBody(),
);
}
}
class MainBody extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new Scaffold(
body: new Padding(
padding: const EdgeInsets.only(left: 20.0, right: 20.0),
child: new Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
new TimeCheck(),
],
),
),
);
}
}
Run Code Online (Sandbox Code Playgroud)
TimeCheck是一个Stateful Widget。基本上,我希望能够在开始时设置一些值,然后将它们传递给TimeCheck, via MainBody。我读到的所有内容都显示了如何将数据传递到 中Stateful …
当我将值从主页传递到源页面时,它显示一个错误:无法将参数类型“未来”分配给参数类型“void Function()”。(argument_type_not_assignable 在 [强文本] lib\home.dart:15)
我哪里做错了??
主页 -
import 'package:flutter/material.dart';
import 'sourceScreen.dart';
class Home extends StatefulWidget {
int value;
Home({this.value});
@override
_HomeState createState() => _HomeState();
}
class _HomeState extends State<Home> {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: FlatButton(
onPressed: Navigator.push(context, MaterialPageRoute(builder: (context)=>SourceScreen({value:value}))), child: null,
),
),
);
}
}
Run Code Online (Sandbox Code Playgroud)
下面的页面是我想使用主页值的地方-
import 'package:flutter/material.dart';
import 'dart:convert';
import 'package:http/http.dart' as http;
import 'models/model.dart';
import 'models/card.dart';
import 'article.dart';
final API_KEY = '***';
Future<List<Source>> fetchNewsSource() async {
final response …Run Code Online (Sandbox Code Playgroud) 我创建了一个PostUpdaterWidget扩展StatelessWidget,TextEditingControllers用于测试 Bloc 模式的实现。
final _usernameController = TextEditingController();
final _contentController = TextEditingController();
@override
Widget build(BuildContext context) {
return Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
TextField(
controller: _usernameController,
decoration: InputDecoration(hintText: "Post Username"),
),
TextField(
controller: _contentController,
decoration: InputDecoration(hintText: "Post Content"),
),
Container(
height: 16,
),
RaisedButton(
child: Text("Update Post"),
onPressed: () => _updatePost(context),
)
],
);
}
_updatePost(BuildContext context) {
print("Processing Post Update");
String username = _usernameController.text.trim();
String content = _contentController.text.trim();
Post post = new Post();
post.id …Run Code Online (Sandbox Code Playgroud) 在使用 aStatelessWidget和 a 时,性能方面有什么区别function returning a Widget吗?
我很清楚至少在这个flutter 的 repo 问题中指出的差异与性能没有关系。
事实是,我有一些同事声称这functional widgets在性能方面是最差的,但在阅读了一些有关该主题的内容后,我找不到任何可以证明该断言的结论性文件,因此对此事的任何形式的澄清都将是非常欢迎!
据我所知,它们之间的唯一区别是在使用 a 的情况下const Widget,这似乎可以避免重建阶段。
如果我使用的是StatefulWidget,那么我将在initState方法中监听流。在StatelessWidget中,我该在哪里做类似的事情(想将Bloc与流一起用于状态管理)?我可以在build方法中做到这一点,但由于这些都是重复性的,所以我想知道是否有比检查如下所示的现有侦听器更有效的方法。我知道这是一个多余且无用的示例,但这只是为了显示问题。
import "package:rxdart/rxdart.dart";
import 'package:flutter/material.dart';
final counter = BehaviorSubject<int>();
final notifier = ValueNotifier<int>(0);
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
if (!counter.hasListener)
counter.listen((value) => notifier.value += value);
return MaterialApp(
home: Scaffold(
body: Center(
child:FlatButton(
onPressed: () => counter.add(1),
child: ValueListenableBuilder(
valueListenable: notifier,
builder: (context, value, child) => Text(
value.toString()
),
),
)
),
)
);
}
}
Run Code Online (Sandbox Code Playgroud) 我是 flutter 世界的新手,我最近学习了(或者我认为我已经学会了)有状态和无状态小部件,这是 Flutter 小部件的基础。
我们将无状态小部件用于未在显示器上重绘的内容(如文本、按钮等),但有状态小部件可以重绘自己。
所以我的问题是,如果有状态小部件可用于绘制与无状态小部件相同类型的小部件,为什么我们需要无状态小部件?
或者是否有任何特定原因在 flutter 中使用无状态而不是有状态的小部件?或者我们可以一直使用有状态的小部件而不是只能绘制一次内容的无状态小部件吗?
谢谢,对不起,如果这是一个愚蠢的问题。
那么问题不是无状态和有状态之间的区别。我知道其中的区别,但是仅使用有状态小部件有什么影响,因为通过使用它我们还可以实现无状态小部件可以做的大部分事情,那么为什么我们需要无状态小部件?它在颤振环境中的重要性是什么?的应用程序将不时重新绘制?
我总是在这里把代码放在我的问题中,但是这一次是不可能的,因为该错误可能在数千行代码中的任何地方。然而:
我注意到,主屏幕(StatelessWidget)的构建方法是MaterialApp(home属性)的后代,在调试模式下通常被调用一次,而在释放模式下则被调用一次。
在什么情况下会发生这种情况?我已经尝试过多次复制,但是失败了。
编辑:
问题是我将从媒体查询中获得的屏幕尺寸存储为全局变量,以便可以从任何地方访问它。现在,我需要在树的更下方的有状态小部件的init方法内部访问该变量。在调试模式下似乎没有问题,但是在发布模式下,使媒体查询(必须在内部)的窗口小部件的生成方法被怪异地调用了一次,媒体查询的结果为Size(0.0,0.0) ,然后调用该树下方的小部件的init方法,然后再调用两次带有媒体查询的build方法(这次使用正确的屏幕尺寸)。结果是我在init方法中没有正确的屏幕尺寸。
所以我试图重构我的 listView 逻辑。基本上我的 ListView 在 UI 逻辑上变得很麻烦,所以我决定,为什么不将 UI 逻辑的某些部分移到另一个类中
这是我的代码 ListPage.dart
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter/widgets.dart';
import 'package:sample_flutter_works/ListTextArea.dart';
import 'package:sample_flutter_works/Model.dart';
import 'dart:convert';
import 'package:sample_flutter_works/RefreshTableContainer.dart';
class ListPage extends StatefulWidget {
@override
MyListPage createState() => MyListPage();
}
class MyListPage extends State<ListPage> {
MessageList messageList;
List<int> viewTimeInfo;
ScrollController _controller;
_scrollListener() {
}
@override
void initState() {
super.initState();
SystemChrome.setPreferredOrientations(
[DeviceOrientation.portraitUp, DeviceOrientation.portraitDown]);
_controller = ScrollController();
_controller.addListener(_scrollListener);
loadMessages(
completionBlock: (dataSet) => {
setState(() {
messageList = dataSet;
})
});
}
void loadMessages({completionBlock}) async {
var …Run Code Online (Sandbox Code Playgroud) 祝你平安
我正在研究 Flutter 的小部件生命周期,并停在布尔变量的点上this.mounted,它确实直接存在于State类中,它只能与 a 作为子类连接StatefulWidget,而永远不会/不会与 a 连接StatelessWidget。
问题是 ...
我在Flutter中搜索,发现这个挂载变量只在类中,然后我进一步查找,找到了类内部State调用的函数。mount()Element
类StatelessWidget与类相连StatelessElement,类从ComponentElement直接继承自该类的Element类扩展而来。
我现在真的很困惑,也许我误解了这一点,我需要对此的解释!谢谢。
lifecycle application-lifecycle flutter statefulwidget statelesswidget