我正在学习颤振,在练习中我构建了一个应用程序,该应用程序很少出现下面提到的错误。
我无法确定返回错误的部分以及为什么我很少收到此错误,其余时间我的应用程序在没有此错误的情况下工作。
请注意,即使我在几秒钟主屏幕呈现后出现此错误,然后应用程序也能正常运行。正因为如此,我觉得错误出在加载部分,我附上了我的 SpinKitRotatingCircle 在容器中,但没有解决问题。
在 MyApp StatelessWidget 中,我将创建 MaterialApp 3 次(一次表示成功,一次表示挂起,一次表示错误)。是他们的一种方式,我可以将它们合并到一个单一的材料应用程序中。
代码:
void main() {
WidgetsFlutterBinding.ensureInitialized();
runApp(MyApp());
}
class MyApp extends StatelessWidget {
// This widget is the root of your application.
final Future<FirebaseApp> _initialization = Firebase.initializeApp();
@override
Widget build(BuildContext context) {
// return MaterialApp(
// home: Wrapper(),
// );
return FutureBuilder(
future: _initialization,
builder: (context, snapshot) {
if (snapshot.hasError) {
return MaterialApp(
home: Scaffold(
backgroundColor: Colors.brown[100],
appBar: AppBar(
backgroundColor: Colors.brown[400],
title: Text('Error Loading Brew Crew'),
centerTitle: true,
),
body: Center(
child: AlertDialog(
title: Text('Error Loading Brew Crew'),
content: Text(snapshot.error.toString()),
actions: <Widget>[
FlatButton(
onPressed: () => exit(0),
child: Text('OK'),
),
],
)),
),
);
}
if (snapshot.connectionState == ConnectionState.done) {
return StreamProvider<User>.value(
value: AuthService().user,
child: MaterialApp(
home: Wrapper(),
),
);
}
//Loading
print('Initializing Flutter');
MaterialApp(
home: Scaffold(
backgroundColor: Colors.brown[100],
appBar: AppBar(
backgroundColor: Colors.brown[400],
title: Text('Loading Brew Crew'),
centerTitle: true,
),
body: Center(
child: SpinKitRotatingCircle(
color: Colors.black,
size: 50.0,
)),
),
);
},
);
}
}
错误:
答案 0 :(得分:1)
你有 if (snapshot.hasError)
和 if (snapshot.connectionState == ConnectionState.done)
返回一些东西。
但是在两个 if
之后,您的 MaterialApp
没有返回。
因此,如果您的快照不能一分为二,则您的代码将不会返回任何内容。
只需将 return
添加到 MaterialApp
下的 print('Initializing Flutter');
。
答案 1 :(得分:1)
Firebase.initializeApp()
是一个异步函数,所以在一段时间内它不会有值。
在此期间,您会看到上述错误。
当 initializeApp
完成并返回 FirebaseApp
对象时,您的 FutureBuilder 将使用该对象重建。
然后执行 FutureBuilder 的这一部分:
if (snapshot.connectionState == ConnectionState.done) {
return StreamProvider<User>.value(
value: AuthService().user,
child: MaterialApp(
home: Wrapper(),
),
);
}
但在此之前,您的 has.error
子句不正确,因此不会运行且不会返回任何内容。
在您的 FutureBuilder 底部,您有:
MaterialApp(
home: Scaffold(
backgroundColor: Colors.brown[100],
appBar: AppBar(
backgroundColor: Colors.brown[400],
title: Text('Loading Brew Crew'),
centerTitle: true,
),
body: Center(
child: SpinKitRotatingCircle(
color: Colors.black,
size: 50.0,
)),
),
);
请注意,您已经创建了一个 MaterialApp,但您还没有return MaterialApp
。
这就是大红色错误屏幕显示的地方和原因,因为您的 FutureBuilder 没有返回任何小部件并且您不允许返回任何内容。
您已多次重复使用 MaterialApp 小部件,这会为您的代码增加一些干扰,而且没有必要。也许尝试这样的事情:
class MyApp extends StatelessWidget {
// This widget is the root of your application.
final Future<FirebaseApp> _initialization = Firebase.initializeApp();
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
backgroundColor: Colors.brown[100],
appBar: AppBar(
backgroundColor: Colors.brown[400],
title: Text('Loading Brew Crew'),
centerTitle: true,
),
body: FutureBuilder(
builder: (context, snapshot) {
if (snapshot.hasError) {
return Center(
child: AlertDialog(
title: Text('Error Loading Brew Crew'),
content: Text(snapshot.error.toString()),
actions: <Widget>[
FlatButton(
onPressed: () => exit(0),
child: Text('OK'),
),
],
));
}
if (snapshot.hasData) {
return StreamProvider<User>.value(
value: AuthService().user,
child: Wrapper(),
);
}
return Center(
child: SpinKitRotatingCircle(
color: Colors.black,
size: 50.0)
);
},
),
),
);
}
}