我试图在注销按钮的 onPressed 方法之后调用 _signOut 函数。但是它没有(识别函数或让我调用它)但是我可以进行调用 widget.Onsignedout,对它的父级回调,一切都按预期工作。除了我在 auth.signout 上注销用户并回电只是为了更新表单。如何从状态类访问 _signOut()?谢谢你
import 'package:flutter/material.dart';
import 'package:login_demo/auth.dart';
import 'package:login_demo/root_page.dart';
class HomePage extends StatefulWidget {
HomePage({this.auth, this.onSignedOut});
final BaseAuth auth;
//To call a function of a parent, you can use the callback pattern
final VoidCallback onSignedOut;
void _signOut() async {
try {
Text('Signing Out here');
await auth.signOut();
onSignedOut;
} catch (e) {
print(e);
}
}
@override
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar( …
Run Code Online (Sandbox Code Playgroud) 我目前正在学习 Flutter。我试图深入了解 Flutter Widget 的生命周期,我想知道为什么StatefulWidget
会这样写:
class Example extends StatefulWidget {
@override
_ExampleState createState() => _ExampleState();
}
class _ExampleState extends State<Example> {
// initState
// setState
// ...
@override
Widget build(BuildContext build) {
...
}
}
Run Code Online (Sandbox Code Playgroud)
但不是 :
class Example extends StatefulWidget {
// initState
// setState
// ...
@override
Widget build(BuildContext build) {
...
}
}
Run Code Online (Sandbox Code Playgroud)
我认为后者使来源变得简单。但我不知道他们为什么使用以前的风格?
我刚刚开始摆弄 Flutter,我无法理解StatefulWidget
. 我在教程等中看到的所有这些小部件都可以实例化 aState<MyWidget>
并让它完成所有工作。
例如,从这个(官方)教程:
class RandomWords extends StatefulWidget {
@override
createState() => new RandomWordsState();
}
class RandomWordsState extends State<RandomWords> {
...
}
Run Code Online (Sandbox Code Playgroud)
我想知道的是为什么要这样构建以及外部类的用途是什么(在我的示例中RandomWords
)。
提前致谢。
在我的配置文件页面中,当使用单击编辑图标时,我具有使用布尔条件的文本选项,将文本窗口小部件更改为文本
widget.isUpdate ? new Flexible(child: new TextField()) : Text("Text Widget")
字段窗口小部件,但当文本字段聚焦时,键盘已打开,此时StatefulWidget重新创建,因此布尔值再次变为false,然后文本字段移至文本窗口小部件。仅当页面具有导航器推入页面(第二页)时,才会发生这种情况
Navigator.push(context,MaterialPageRoute(builder: (context) => UpdateProfile()))
Run Code Online (Sandbox Code Playgroud)
如果此页面为默认主页,则工作正常。我没有犯什么错误。
代码:
import 'package:flutter/material.dart';
class UpdateProfile extends StatefulWidget {
bool isUpdate = false;
@override
State<StatefulWidget> createState() {
// TODO: implement createState
return UpdateProfileState();
}
}
class UpdateProfileState extends State<UpdateProfile> {
@override
Widget build(BuildContext context) {
// TODO: implement build
return Scaffold(
appBar: AppBar(
title: Text("Update"),
elevation: 2.0),
body: Container(
width: double.infinity,
height: double.infinity,
color: Colors.red,
margin: const EdgeInsets.all(10.0),
child: Row(
children: <Widget>[
widget.isUpdate ? new …
Run Code Online (Sandbox Code Playgroud) 我已经建立了一个定制列表。现在我包含一个复选框,如果我选中或取消选中,则会引发以下错误:“在构造函数中调用 setState()”
\n\nclass Lists extends StatefulWidget{ \n @override\n _List createState() => _List();\n}\n\nclass _List extends State<Lists> { \n bool checkedvalue = true;\n @override\nWidget build(BuildContext context) {\n\n return futureBuilder();\n}\n\nWidget futureBuilder(){ \n var futureBuilder = new FutureBuilder(\n future: rest.fetchPost(),\n builder: (BuildContext context, AsyncSnapshot snapshot) {\n switch (snapshot.connectionState) {\n case ConnectionState.none:\n case ConnectionState.waiting:\n return new Text('loading...');\n default:\n if (snapshot.hasError)\n return new Text('Error: ${snapshot.error}');\n else \n return listBuilder(context, snapshot); \n }\n }\n );\n\n return new Scaffold( \n body: futureBuilder,\n );\n}\n\nWidget listBuilder(BuildContext context, AsyncSnapshot snapshot) …
Run Code Online (Sandbox Code Playgroud) 我想创建一个像这样的 BaseScreen Widget 以在我的应用程序中重用:
class BaseScreen extends StatelessWidget {
final Widget child;
BaseScreen({this.child});
@override
Widget build(BuildContext context) {
var safePadding = MediaQuery.of(context).padding.top +
MediaQuery.of(context).padding.bottom;
return Scaffold(
body: LayoutBuilder(
builder: (context, constraint) {
return SingleChildScrollView(
child: SafeArea(
child: ConstrainedBox(
constraints: BoxConstraints(
minHeight: constraint.maxHeight - safePadding),
child: IntrinsicHeight(
child: child,
),
),
),
);
},
),
);
}
}
Run Code Online (Sandbox Code Playgroud)
但我看到的问题是我还想重用此类子级中提供的constraint
属性。LayoutBuilder
目前,我需要在子级中创建一个新的 LayoutBuilder,这听起来像是对引擎进行更多处理,以及更多样板代码。
如果我可以以某种方式扩展这个小部件,以便在孩子中我可以拥有这个:
@override
Widget build(BuildContext context, BoxConstraints constraints) {
}
Run Code Online (Sandbox Code Playgroud)
那太好了。我知道 Flutter 也鼓励组合而不是继承,所以如果我能以其他方式解决它,我也会很感激。
谢谢你!
我正在学习扑腾,我正在使用tabBars,我遇到了保存状态的问题.我在下面提出了一个小问题.基本上,有一个按钮和一个有状态的计数器.当我单击按钮时,我看到文本字段正确更新.但是,当我切换到另一个选项卡并返回时,文本字段将返回零.
我发现如果我在_CounterState之外移动以下行,使其在文件的顶层定义,那么,它可以正常工作.当我切换标签时,当我切换回时,计数器保持正确的计数
int _counter = 0;
Run Code Online (Sandbox Code Playgroud)
我觉得这不是这样做的合适方式,我看到的所有例子都在类中有变量.任何人都可以给我任何见解吗?如果它在课堂内,为什么会重置?我应该把它放在课外吗?以下是简化的完整示例.
import 'package:flutter/material.dart';
void main() {
runApp(new TabBarDemo());
}
class TabBarDemo extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
home: new DefaultTabController(
length: 3,
child: new Scaffold(
appBar: new AppBar(
bottom: new TabBar(
tabs: [
new Tab(icon: new Icon(Icons.directions_car)),
new Tab(icon: new Icon(Icons.directions_transit)),
new Tab(icon: new Icon(Icons.directions_bike)),
],
),
title: new Text('Tabs Demo'),
),
body: new TabBarView(
children: [
new Counter(),
new Icon(Icons.directions_transit),
new Icon(Icons.directions_bike),
],
),
),
),
);
} …
Run Code Online (Sandbox Code Playgroud) 我在有状态小部件中有一个表单,在我的有状态小部件中,我使用提交方法验证我的表单。
在我的应用程序中,我在另一个 dart 文件的另一个页面中显示该表单。
我的表单在新页面和 appbar 操作中可见,我正在调用提交方法,但我不知道如何在新的 dart 文件中调用该提交方法。
我有一个带有 LinkedHashMap 成员的 StatefulWidget 小部件,如下所示:
LinkedHashMap _items = new LinkedHashMap<String, List<dynamic>>();
Run Code Online (Sandbox Code Playgroud)
现在我需要过滤List<dynamic>
Map 项目中的项目。
我使用此代码进行过滤:
function filter(_items) {
return _items.map((day, items) {
return new MapEntry(day, items.where((i) {
return i.stringProperty.contains(widget.filter);
}).toList());
});
}
Run Code Online (Sandbox Code Playgroud)
但我得到了这个主题的错误
类型 '(dynamic) => dynamic' 不是 'test' 类型 '(dynamic) => bool' 的子类型
在我的 Flutter Widget 中,我有一个StreamBuilder
检查snapshot.hasError
并在这种特定情况下它将返回我的ErrorRetryWidget()
.
builder: (context, AsyncSnapshot<MyObject> snapshot) {
...
if (snapshot.hasError) {
return ErrorRetryWidget();
}
}
Run Code Online (Sandbox Code Playgroud)
的ErrorRetryWidget()
只是示出了一个错误消息,并且在重试按钮。当您按下此按钮时,我会用进度指示器替换按钮文本。因此,我需要使这个小部件有状态,因为它的状态包含一个isRetrying
我在 中设置为 false的变量,initState
然后在按下后设置为 true。
当按下按钮时,ErrorRetryWidget
通过 a 告诉父级VoidCallback
重新触发流逻辑。它运作良好,但问题是如果错误再次出现,我StreamBuilder
将ErrorRetryWidget
再次“返回” 。
构造函数被称为新时间,但不是initState
。我怎样才能做到每次重新创建小部件时都会重置状态?因此,isRetrying
已经(或仍然)设置为 true。
我找到的唯一快速解决方案是在我的错误小部件中实现它:
@override
void didUpdateWidget(covariant oldWidget) {
super.didUpdateWidget(oldWidget);
setState(() {
retrying = false;
});
}
Run Code Online (Sandbox Code Playgroud)
不确定这是一个好习惯。