Вы можете скопировать и вставить полный код ниже, полный код исправит эту проблему
Причина:
Эта строка userProfile.user = snapshot.data;
вызывает ошибку
FutureBuilder
- это данные сборки и получает notifyListeners()
По предложению команды Flutter, https://github.com/flutter/flutter/issues/16218#issuecomment -403995076
builder
FutureBuilder
должен только создавать виджеты, у него не должно быть логики c. Строителей могут вызывать произвольно.
Решение:
В случае пользователя после getUser()
можно напрямую установить UserProfile.user
Шаг 1: удалить final userProfile = Provider.of<UserProfile>(context);
Шаг 2: переместить userProfile.user = snapshot.data;
logi c до futureBuilder
future
FutureBuilder<User>(
future: _future.then((value) =>
Provider.of<UserProfile>(context, listen: false).user = value),
полный код
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
void main() {
runApp(
ChangeNotifierProvider(
create: (context) => UserProfile(),
child: MyApp(),
),
);
}
class StatefulWrapper extends StatefulWidget {
final Function onInit;
final Widget child;
const StatefulWrapper({@required this.onInit, @required this.child});
@override
_StatefulWrapperState createState() => _StatefulWrapperState();
}
class _StatefulWrapperState extends State<StatefulWrapper> {
@override
void initState() {
if (widget.onInit != null) {
widget.onInit();
}
super.initState();
}
@override
Widget build(BuildContext context) {
return widget.child;
}
}
class User {
String name;
User({this.name});
}
Future<User> getUser() async {
print("getUser");
return User(name: "test");
}
class UserProfile with ChangeNotifier {
User _user = User();
get user {
return _user;
}
set user(User user) {
this._user = user;
notifyListeners();
}
}
class HomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
//final authService = Provider.of<AuthService>(context);
//final userProfile = Provider.of<UserProfile>(context, listen: false);
Future _future = getUser();
return StatefulWrapper(
onInit: () {
//FirebaseNotifications().setUpFirebase();
},
child: FutureBuilder<User>(
future: _future.then((value) =>
Provider.of<UserProfile>(context, listen: false).user = value),
builder: (context, AsyncSnapshot<User> snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
if (snapshot.error != null) {
return Text(snapshot.error.toString());
}
if (snapshot.hasData) {
return ListScreen();
} else {
return LoginScreen();
}
} else {
return Scaffold(
appBar: AppBar(),
body: Container(),
);
}
},
));
}
}
class ListScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Text("ListScreen");
}
}
class LoginScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Text("LoginScreen");
}
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: HomePage(),
);
}
}