Flutter-试图从reducer获取小部件上下文的支架

时间:2018-09-06 11:38:53

标签: android ios mobile dart flutter

由于要尝试使用化简器中的小部件的上下文(在异步操作完成后调用小吃栏),所以我碰到了墙。

我曾经尝试过使用GlobalKey,但是当我得到这样的密钥并且尝试使用它的上下文调用窗口小部件Scaffold时,它会抛出一个错误,表明实际上没有此类上下文的Scaffold。

很遗憾,我无法提供该代码,因为该代码是针对客户的,因此无法显示该代码,但是如果需要,我可以为您提供详细信息。

小吃栏/吐司本身并不那么重要,但是如果是小部件的上下文 无法从减速器上得到解决,这将是未来的重要问题。

谢谢

编辑: 这是@GünterZöchbauer建议的代码重现:

-密钥文件

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(),
      ),
    )
   );

  }
}

2 个答案:

答案 0 :(得分:0)

我有点了解您的问题。您在显示小吃吐司时遇到问题,因此我拥有共享代码来实现小吃店。

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,
)}

答案 1 :(得分:0)

最后,我决定遵循@GünterZöchbauer的建议,并将脚手架放入商店存储区,以便在商店更新时,我检查商店的价值并因此更改页面。