我希望能够在Widget完成构建/加载后运行函数,但我不确定如何.我目前的用例是检查用户是否经过身份验证,如果没有,则重定向到登录视图.我不想在之前检查并推送登录视图或主视图,它需要在主视图加载后发生.有什么我可以用来做这个吗?
谢谢
我正在寻找一种在InitState方法上加载异步数据的方法,在构建方法运行之前我需要一些数据.我正在使用GoogleAuth代码,我需要执行构建方法,直到Stream运行.
我的initState方法是:
@override
void initState () {
super.initState();
_googleSignIn.onCurrentUserChanged.listen((GoogleSignInAccount account) {
setState(() {
_currentUser = account;
});
});
_googleSignIn.signInSilently();
}
Run Code Online (Sandbox Code Playgroud)
我将不胜感激任何反馈.
我有一个索引堆栈。第一个子控件的内容是第二个子控件的一半,但第一个子控件的高度与第二个子控件的高度相同。由于设计,这似乎是预期的结果,但它很烦人,因为当我滚动第一个子小部件时,底部有一堆额外的空间。我该如何解决这个问题?
Flutter团队为什么要这样设计呢?为什么不根据小部件而不是根据最大的子部件给小部件子部件高度?
我目前正在尝试在颤振中制作一个自定义小部件。元素列表右侧的一个简单的“A 到 Z 滚动条”,用于跳转到索引。我的问题是实际上我需要使用列表小部件的大小来确定字母的字体大小。
我将列表添加为自定义类的子级,以从上下文中获取它的高度。我尝试在“构建”方法中使用context.size.heigth获取大小,但由于未构建小部件而出现错误。然后我尝试执行一个异步方法,就像我在这里读到的那样:堆栈溢出帖子
我可以在没有错误的情况下获得context.size.height的唯一位置是在我的手势检测器的onVerticalDragUpdate中。
有我的实际代码:
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: new AtoZSlider(child: _builList()),
);
}
}
Widget _builList() { //test list
return ListView.builder(
padding: EdgeInsets.all(8.0),
itemExtent: 20.0,
itemCount: 1000,
itemBuilder: (BuildContext context, int index) {
return Text('entry $index');
},
);
}
class AtoZSlider extends StatefulWidget {
final Widget child;
AtoZSlider({this.child});
@override
_AtoZSlider createState() => new _AtoZSlider();
} …Run Code Online (Sandbox Code Playgroud) 从 Firebase Cloud 加载帖子时显示错误。我在我的应用程序中使用提供程序
\nsetState() or markNeedsBuild() called during build.\nRun Code Online (Sandbox Code Playgroud)\n详细错误
\n\n\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90 Exception caught by foundation library \xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\nThe following assertion was thrown while dispatching notifications for PostFunctions:\nsetState() or markNeedsBuild() called during build.\n\nThis _InheritedProviderScope<PostFunctions> widget cannot be marked as needing to build because the framework is already in the process of building widgets. A widget can be marked as needing to be built during the build phase only if one of its ancestors is currently building. This exception …Run Code Online (Sandbox Code Playgroud) 所以我在颤振中尝试这段代码:
void main() => runApp(MyApp());
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
int _i = 1;
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: Center(
child: MaterialButton(
child: Text('You Pressed Me $_i'),
onPressed: () {
setState(() {
_i++;
print('inside i = $_i');
});
sleep(Duration(seconds: 10));
_i++;
print('outside i = $_i');
}
),
),
),
);
}
}
Run Code Online (Sandbox Code Playgroud)
预期行为(运行并按下按钮一次后):按钮显示文本"You Pressed Me 2",
然后变量_i在不影响视觉效果的情况下增加到 3。
实际行为 …