接收错误 "setState() or markNeedsBuild() called during build"
Receiving error "setState() or markNeedsBuild() called during build"
我在此 dart 文件中收到此错误“在构建过程中调用了 setState() 或 markNeedsBuild()”。在这里,我调用 Futurebuilder 获取 getUser() 身份验证信息,基本上我是在检查用户是否已登录,然后我将根据相应屏幕移动。
我粘贴代码以供参考。谢谢
import 'package:flutter/material.dart';
import 'package:mukti/ui_pages/login_signup/login_screen.dart';
import 'package:firebase_auth/firebase_auth.dart' as auth;
import 'package:mukti/ui_pages/main_screen/main_screen.dart';
import 'package:provider/provider.dart';
import 'authService.dart';
class CheckAuthentication extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: FutureBuilder(
future: Provider.of<AuthService>(context, listen: false).getUser(),
builder: (context, AsyncSnapshot<auth.User> snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
if (snapshot.error != null) {
print("error");
return Text(snapshot.error.toString());
}
return snapshot.hasData ? MainScreen(firebaseUser: snapshot.data) : LoginScreen();
} else {
return LoadingCircle();
}
}
)
);
}
}
class LoadingCircle extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Center(
child: Container(
child: CircularProgressIndicator(
backgroundColor: Theme.of(context).colorScheme.primaryVariant,
),
alignment: Alignment(0.0, 0.0),
),
);
}
}
异常消息供参考
════════ Exception caught by foundation library ════════════════════════════════════════════════════
The following assertion was thrown while dispatching notifications for AuthService:
setState() or markNeedsBuild() called during build.
This _InheritedProviderScope<AuthService> 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 is allowed because the framework builds parent widgets before children, which means a dirty descendant will always be built. Otherwise, the framework might not visit this widget during this build phase.
The widget on which setState() or markNeedsBuild() was called was: _InheritedProviderScope<AuthService>
value: Instance of 'AuthService'
listening to value
The widget which was currently being built when the offending call was made was: CheckAuthentication
dirty
When the exception was thrown, this was the stack:
#0 Element.markNeedsBuild.<anonymous closure> (package:flutter/src/widgets/framework.dart:4292:11)
#1 Element.markNeedsBuild (package:flutter/src/widgets/framework.dart:4307:6)
#2 _InheritedProviderScopeElement.markNeedsNotifyDependents (package:provider/src/inherited_provider.dart:496:5)
#3 ChangeNotifier.notifyListeners (package:flutter/src/foundation/change_notifier.dart:226:25)
#4 AuthService.getUser (package:mukti/authentication/authService.dart:18:7)
...
The AuthService sending notification was: Instance of 'AuthService'
════════════════════════════════════════════════════════════════════════════════════════════════════
请尝试使用此代码:
import 'package:flutter/material.dart';
import 'package:mukti/ui_pages/login_signup/login_screen.dart';
import 'package:firebase_auth/firebase_auth.dart' as auth;
import 'package:mukti/ui_pages/main_screen/main_screen.dart';
import 'package:provider/provider.dart';
import 'authService.dart';
class CheckAuthentication extends StatelessWidget {
@override
Widget build(BuildContext context) {
final authService = Provider.of<AuthService>(context, listen: false);
return MaterialApp(
debugShowCheckedModeBanner: false,
home: FutureBuilder(
future: authService.getUser(),
builder: (context, AsyncSnapshot<auth.User> snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
if (snapshot.error != null) {
print("error");
return Text(snapshot.error.toString());
}
return snapshot.hasData ? MainScreen(firebaseUser: snapshot.data) : LoginScreen();
} else {
return LoadingCircle();
}
}
)
);
}
}
class LoadingCircle extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Center(
child: Container(
child: CircularProgressIndicator(
backgroundColor: Theme.of(context).colorScheme.primaryVariant,
),
alignment: Alignment(0.0, 0.0),
),
);
}
}
getUser() 供参考
final auth.FirebaseAuth _auth = auth.FirebaseAuth.instance;
Future<auth.User> getUser() async {
try {
final user = _auth.currentUser;
if (user != null) {
print('User signed in: ${user.email}');
} else {
print('No user signed in');
}
notifyListeners();
return user;
} catch (e) {
print(e);
return null;
}
}
您的问题是在 getUser()
函数中调用 notifyListeners()
。删除该行,错误就会消失。这会尝试构建小部件树,并且 FutureBuilder 正在构建过程中
我在此 dart 文件中收到此错误“在构建过程中调用了 setState() 或 markNeedsBuild()”。在这里,我调用 Futurebuilder 获取 getUser() 身份验证信息,基本上我是在检查用户是否已登录,然后我将根据相应屏幕移动。
我粘贴代码以供参考。谢谢
import 'package:flutter/material.dart';
import 'package:mukti/ui_pages/login_signup/login_screen.dart';
import 'package:firebase_auth/firebase_auth.dart' as auth;
import 'package:mukti/ui_pages/main_screen/main_screen.dart';
import 'package:provider/provider.dart';
import 'authService.dart';
class CheckAuthentication extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: FutureBuilder(
future: Provider.of<AuthService>(context, listen: false).getUser(),
builder: (context, AsyncSnapshot<auth.User> snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
if (snapshot.error != null) {
print("error");
return Text(snapshot.error.toString());
}
return snapshot.hasData ? MainScreen(firebaseUser: snapshot.data) : LoginScreen();
} else {
return LoadingCircle();
}
}
)
);
}
}
class LoadingCircle extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Center(
child: Container(
child: CircularProgressIndicator(
backgroundColor: Theme.of(context).colorScheme.primaryVariant,
),
alignment: Alignment(0.0, 0.0),
),
);
}
}
异常消息供参考
════════ Exception caught by foundation library ════════════════════════════════════════════════════
The following assertion was thrown while dispatching notifications for AuthService:
setState() or markNeedsBuild() called during build.
This _InheritedProviderScope<AuthService> 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 is allowed because the framework builds parent widgets before children, which means a dirty descendant will always be built. Otherwise, the framework might not visit this widget during this build phase.
The widget on which setState() or markNeedsBuild() was called was: _InheritedProviderScope<AuthService>
value: Instance of 'AuthService'
listening to value
The widget which was currently being built when the offending call was made was: CheckAuthentication
dirty
When the exception was thrown, this was the stack:
#0 Element.markNeedsBuild.<anonymous closure> (package:flutter/src/widgets/framework.dart:4292:11)
#1 Element.markNeedsBuild (package:flutter/src/widgets/framework.dart:4307:6)
#2 _InheritedProviderScopeElement.markNeedsNotifyDependents (package:provider/src/inherited_provider.dart:496:5)
#3 ChangeNotifier.notifyListeners (package:flutter/src/foundation/change_notifier.dart:226:25)
#4 AuthService.getUser (package:mukti/authentication/authService.dart:18:7)
...
The AuthService sending notification was: Instance of 'AuthService'
════════════════════════════════════════════════════════════════════════════════════════════════════
请尝试使用此代码:
import 'package:flutter/material.dart';
import 'package:mukti/ui_pages/login_signup/login_screen.dart';
import 'package:firebase_auth/firebase_auth.dart' as auth;
import 'package:mukti/ui_pages/main_screen/main_screen.dart';
import 'package:provider/provider.dart';
import 'authService.dart';
class CheckAuthentication extends StatelessWidget {
@override
Widget build(BuildContext context) {
final authService = Provider.of<AuthService>(context, listen: false);
return MaterialApp(
debugShowCheckedModeBanner: false,
home: FutureBuilder(
future: authService.getUser(),
builder: (context, AsyncSnapshot<auth.User> snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
if (snapshot.error != null) {
print("error");
return Text(snapshot.error.toString());
}
return snapshot.hasData ? MainScreen(firebaseUser: snapshot.data) : LoginScreen();
} else {
return LoadingCircle();
}
}
)
);
}
}
class LoadingCircle extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Center(
child: Container(
child: CircularProgressIndicator(
backgroundColor: Theme.of(context).colorScheme.primaryVariant,
),
alignment: Alignment(0.0, 0.0),
),
);
}
}
getUser() 供参考
final auth.FirebaseAuth _auth = auth.FirebaseAuth.instance;
Future<auth.User> getUser() async {
try {
final user = _auth.currentUser;
if (user != null) {
print('User signed in: ${user.email}');
} else {
print('No user signed in');
}
notifyListeners();
return user;
} catch (e) {
print(e);
return null;
}
}
您的问题是在 getUser()
函数中调用 notifyListeners()
。删除该行,错误就会消失。这会尝试构建小部件树,并且 FutureBuilder 正在构建过程中