我遇到了麻烦,因为我正在尝试使用来自 reducer 的小部件的上下文(在异步操作完成时调用 snackbar )。
我尝试过使用 GlobalKey,但是当我获得这样的 key 并尝试使用它的上下文来调用小部件 Scaffold 时,它会抛出一个错误,表示没有此类上下文的 Scaffold,而事实上确实存在。
遗憾的是,我无法提供代码,因为该代码是针对客户的,因此无法显示代码,但如果需要,我可以为您提供详细信息。
snackbar / toast 本身并不那么重要,但是如果小部件的上下文 无法从 reducer 中获取将是 future 的重要问题。
谢谢
编辑: 以下是 @Günter Zöchbauer 建议的代码重现:
- key 文件
import 'package:flutter/widgets.dart';
class Keys {
static final GlobalKey<MyWidgetState> myWidgetStateKey = new
GlobalKey<MyWidgetState>();
}
-小部件文件
import 'package:myapp/keys.dart';
import 'package:flutter/material.dart';
import 'package:flutter_redux/flutter_redux.dart';
class MyPage extends StatefulWidget{
@override
MyPageState createState()=>new MyPageState();
}
class MyPageState extends State<MyPage>{
@override
Widget build(BuildContext conext){
return new Scaffold(
key: Keys.myWidgetStateKey,
appBar:new AppBar(
title:new Text("My app bar")
),
body: new Text("My app body")
);
}
}
-Reducer文件
import 'package:flutter/material.dart';
import 'package:casinoadmiralapp/appState.dart';
import 'package:casinoadmiralapp/actions.dart';
import 'package:casinoadmiralapp/keys.dart';
AppState reducer(AppState state,action){
BuildContext context = Keys.myWidgetStateKey.currentContext;
if(action is TheAction){
Scaffold.of(context).showSnackBar(
new SnackBar(
content:new Text("You have done an action"),
action: new SnackBarAction(
label: "UNDO",
onPressed: () => Scaffold.of( context ).hideCurrentSnackBar(),
),
)
);
}
}
最佳答案
我有点理解你的问题。你在 View 中显示小吃 toast 时遇到问题,所以我有共享代码来实现 snackbar 。
class AprovedScreenState extends State<AprovedScreen> {
BuildContext buildContext;
final key = new GlobalKey<ScaffoldState>();
void navigationPage() {
key.currentState.showSnackBar(new SnackBar(
content: new Text("Sending Message"),
));
在脚手架方法中编写关键代码如下:
@override
Widget build(BuildContext context) {
// TODO: implement build
buildContext = context;
return new Scaffold(
key: key,
)}
关于android - Flutter - 试图从 reducer 获取小部件上下文的脚手架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52203271/