flutter - Flutter app:根据ApplicationState值隐藏appBar动作
问题描述
我对 Flutter 很陌生,我想我还没有理解 Providers 状态管理背后的所有逻辑。我有以下小部件:
class App extends StatelessWidget {
List<IconButton> navigationActions(BuildContext context) {
return
Consumer<ApplicationState>(builder: (context, appState, _) {
if (appState.loginState == 'loggedIn') {
return [IconButton(
icon: const Icon(Icons.logout),
tooltip: 'Logout',
onPressed: () {
context.read<ApplicationState>().signOut();
},
)];
}
})
;
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('FOO'),
actions: navigationActions(context)
),
body: ListView(
.........
)
)
}
我想根据在 ApplicationState 中设置的标志loginState显示/隐藏 AppBar 操作
void main() {
runApp(
ChangeNotifierProvider(
create: (context) => ApplicationState(),
builder: (context, _) => App(),
),
);
}
class ApplicationState extends ChangeNotifier {
ApplicationState() {
init();
}
String _loginState = 'loggedOut';
String get loginState => _loginState;
}
我不确定如何实现功能navigationActions。哪个应该是返回类型?由于我没有在 else 分支中返回数据,因此我不确定如何管理该类型。也许有更聪明的解决方案,我还不知道.. 有人曾经用 Providers 实现过类似的逻辑吗?
解决方案
navigationActions
必须返回List<IconButton>
,但您返回的结果Consumer
是 a Widget
。您可以使用其他方法获取ApplicationState
. 这是执行您想要的示例代码:
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class ApplicationState extends ChangeNotifier {
String _loginState = 'loggedIn';
set loginState(String state) {
_loginState = state;
}
get loginState => _loginState;
void toggleState() {
if (loginState == 'loggedIn')
loginState = 'loggedOut';
else
loginState = 'loggedIn';
notifyListeners();
}
void signOut() {}
}
class ActionTest extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider(
create: (context) => ApplicationState(),
child: ActionApp(),
);
}
}
class ActionApp extends StatelessWidget {
List<IconButton> navigationActions(BuildContext context) {
final appState = Provider.of<ApplicationState>(context);
if (appState.loginState == 'loggedIn') {
return [
IconButton(
icon: const Icon(Icons.logout),
tooltip: 'Logout',
onPressed: () {
appState.signOut();
},
)
];
} else {
return [];
}
}
@override
Widget build(BuildContext context) {
final appState = Provider.of<ApplicationState>(context);
return Scaffold(
appBar: AppBar(title: Text('FOO'), actions: navigationActions(context)),
body: Container(),
floatingActionButton: FloatingActionButton(
onPressed: () {
appState.toggleState();
},
child: Icon(appState.loginState == 'loggedIn'
? Icons.toggle_off
: Icons.toggle_on),
),
);
}
}
推荐阅读
- firebase - 数据库规则中随机生成的键的变量
- javascript - 从 unicode 生成表情符号然后提取 unicode 会给出不同的 unicode
- c++ - 什么是 libCDS 中最快的卡,前提是它应该能够扩展和擦除数据?
- python - Why is my Pygame sprite rotating like a collision box?
- tsql - SQL Server 在合并期间我可以将源表值存储到变量中吗
- google-sheets - 需要 AppSheet 指导
- javascript - 在 chrome 中打开包含特定内容的新标签页
- regex - 如何将网站从 www 重定向到非 www
- html - HTMLInputElement event.target.value 输出字符串事件,尽管它是范围元素(打字稿)
- llvm - 如何使用 llvm::cl::ParseCommandLineOptions> - 链接错误