这是代码.....
import 'package:flutter/material.dart';
void main() => runApp(new MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'Flutter Demo',
theme: new ThemeData(
primarySwatch: Colors.blue,
),
home: new MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
int number;
EdgeInsets globalMargin = const EdgeInsets.symmetric(horizontal: 20.0, vertical: 20.0);
TextStyle textStyle = const TextStyle(
fontSize: 100.0,
color: Colors.black,
);
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() …Run Code Online (Sandbox Code Playgroud) 我开发了自己的自定义小部件,用于其他视图.在这个自定义小部件中,我有一个存储信息的类属性,假设这是一个获取小部件内新项的列表.现在我想从我的主要小部件的级别获取此列表中的项目.
怎么做?我不想创建这样的变量:var customWidget = MyCustomWidget()然后,获取内部变量customWidget.createState().myList- 我认为这是一个可怕的解决方案(我不确定它是否会起作用).将列表传递给我的自定义小部件的构造函数看起来非常难看.
有没有其他方法来获得其他小部件的状态?
在Flutter文档的“编写您的第一个应用程序”教程中,步骤4名为“步骤4:创建无限滚动ListView”,要求您创建2个变量,显示在此处:
class RandomWordsState extends State<RandomWords> {
final _suggestions = <WordPair>[];
final _biggerFont = const TextStyle(fontSize: 18.0);
...
}
Run Code Online (Sandbox Code Playgroud)
为什么const在第三行使用关键字?我来自C#和JavaScript背景,我不习惯在赋值语句的右侧看到它。我注意到,如果将其删除,它仍然可以按预期工作。您能以拉面语来解释为什么要使用它,什么时候应该这样做?我猜想这太过分了,我不必使用它,但我只是想确定一下。
我不认为这是重复的,因为这篇文章中的答案非常适合解释我的问题,而在另一篇文章中找不到,更不用说另一篇文章是两部分的问题,使用Google时没人会找到。
InheritedWidget 的Flutter文档说
\n\n\n有效地沿树传播信息的小部件的基类。
\n要从构建上下文获取特定类型的继承窗口小部件的最近实例,请使用 BuildContext.inheritFromWidgetOfExactType。
\n当以这种方式引用继承的小部件时,\n当继承的小部件本身更改状态时,将导致使用者重建。
\n
鉴于 Flutter 中的小部件是不可变的,并且在示例代码中..
\nclass FrogColor extends InheritedWidget {\n const FrogColor({\n Key key,\n @required this.color,\n @required Widget child,\n }) : assert(color != null),\n assert(child != null),\n super(key: key, child: child);\n\n final Color color;\n\n static FrogColor of(BuildContext context) {\n return context.inheritFromWidgetOfExactType(FrogColor);\n }\n\n @override\n bool updateShouldNotify(FrogColor old) => color != old.color;\n}\nRun Code Online (Sandbox Code Playgroud)\n颜色属性final因此无法重新分配。假设这个小部件位于树的顶部,就像大多数示例一样,它什么时候会有用。对于要替换的小部件,必须创建一个新实例。
据推测,在完成此操作的情况下,也将创建作为子级传递的任何内容的新实例,从而导致该子级的后代也进行重建,创建其子级的新实例等。
\n无论如何,最终还是重建了整棵树。inheritFromWidgetOfExactType那么,当 InheritedWidget 实例的数据永远不会改变该实例时,使用 using 进行选择性更新是没有意义的?
编辑:
\n这是我不明白的最简单的例子,我可以将它们放在一起。\n在这个例子中,“更改” …
需要了解什么时候应该Bloc模式以及Bloc的生命周期(如何释放持有内存的对象)
我有一个屏幕,我从服务器获取数据,数据将仅用于单个屏幕。我正在使用 Bloc 模式来显示数据。
使用 Bloc 模式时,我有一个正在使用 StatelessWidget 的屏幕。我正在尝试处理“WillPopScope”上的流。一旦被处置,流就不能再使用。因为访问同一屏幕会导致崩溃,因为我用 Bloc 包装了 MaterialApp。
final _leaderBoardList = StreamController<List<dynamic>>.broadcast();
Run Code Online (Sandbox Code Playgroud)
dispose() {
print('_leaderBoardList disposed');
_leaderBoardList.close();
}
Run Code Online (Sandbox Code Playgroud)
LeaderBoardProvider(
child: MaterialApp(
title: 'Table View Fetch',
theme: ThemeData(
primarySwatch: Colors.teal,
),
home: HomeScreen(),
),
);
Run Code Online (Sandbox Code Playgroud)
Widget build(BuildContext context) {
print(' ListView fetch Build called');
final bloc = LeaderBoardProvider.of(context);
bloc.fetchLeaderBoards();
return WillPopScope(
onWillPop: () async {
//bloc.dispose();
return true;
},
child: bodyStack(context, bloc),
);
}
Run Code Online (Sandbox Code Playgroud)
第一个问题,假设我创建一个广播流并删除“WillPopScope”中的代码处理,那么一切都会按预期工作,但我认为,这样,我的 Bloc 就可以为应用程序生命周期保留内存。
第二个问题 …
我注意到在颤振应用程序中经常调用 build 方法。
我知道,如果 statefulWidget 中的页面状态发生变化,则会触发 build 方法。但我也注意到,即使应用程序中没有任何更改,也会调用 build 方法。
考虑到您将应用程序留给自己的情况,构建方法被频繁调用是否正常?如果是这样,为什么以及多久一次?
我错了吗Widget,或者如果我们只想将值传递给树,那Provider是InheritedWidget带有dispose方法的吗?