【发布时间】:2021-03-02 06:33:06
【问题描述】:
我的应用有一个被计算为 Future 的状态。 例如,它包含主题颜色,因为我想在导航时更改颜色。 我在等待数据时尝试显示进度指示器。
但我不能让它工作。 要么是 Navigator.push 不工作且应用栏丢失,要么我没有进度指示器和路线错误...
这是一个代码 sn-p。
import 'package:flutter/material.dart';
void main() => runApp(Test());
class Test extends StatefulWidget {
@override
State<StatefulWidget> createState() => _TestState();
}
class _TestState extends State<Test> {
Future<Color> color = Model.getColor();
@override
Widget build(BuildContext context) {
return FutureBuilder<Color>(
future: color,
builder: (context, snapshot) {
if (snapshot.hasError) throw snapshot.error;
if (snapshot.connectionState != ConnectionState.done) {
if (false) {
// Navigation not working. App bar missing.
return Material(child: Center(child: CircularProgressIndicator()));
} else {
// Progress not working. Screen flickering.
return MaterialApp(home: _buildWait());
}
}
var app = MaterialApp(
theme: ThemeData(primaryColor: snapshot.data),
home: _buildPage(),
// ERROR: The builder for route "/" returned null.
// routes: {'/': (_) => _buildPage()},
);
return app;
},
);
}
Widget _buildPage() {
return Builder(
builder: (context) {
return Scaffold(
appBar: AppBar(),
body: Center(
child: RaisedButton(
child: Text('Push'),
onPressed: () {
setState(() {
color = Model.getColor();
});
Navigator.push(context, MaterialPageRoute(builder: (context) {
return Scaffold(appBar: AppBar());
}));
},
),
),
);
},
);
}
}
Widget _buildWait() {
return Scaffold(
appBar: AppBar(title: Text('Wait...')),
body: Center(child: CircularProgressIndicator()),
);
}
class Model {
static final _colors = [Colors.red, Colors.green, Colors.amber];
static int _index = 0;
static Future<Color> getColor() {
return Future.delayed(Duration(seconds: 2), () => _colors[_index++ % _colors.length]);
}
}
预期结果:当我按下按钮导航到新路线时,它应该显示一个进度指示器,然后是具有不同主题颜色的新屏幕。
【问题讨论】:
-
您使用了未命名的路线。实际上,每个
named route和unnamed route都应该是MaterialApp的后代,这意味着您不能像以前那样更改MaterialApp,因为所有路由都是从中拆分出来的。在此处查看named route的示例:flutter.dev/docs/cookbook/navigation/named-routes -
@yellowgray 使用命名路线我有错误
The builder for route "/" returned null. -
嗨@Patrick,我从你的问题中了解到,假设你有3个屏幕A、B和C。都有AppBar,你希望每个屏幕都有不同的应用栏颜色。正确的?假设用户从 A 导航到 B,B 将具有不同的 NavBar 颜色、加载小部件和 AppBar 上的后退按钮。对吗?
标签: flutter dart navigation future flutter-navigation