首页 > 解决方案 > 有没有办法为属性 floatingActionButton 返回 2 个值或在变量更改时调用 setState?

问题描述

我是新来的颤振,

所以我正在开发一个 Flutter 应用程序,我的函数和小部件文件名为:'Function'与我的Main分开,但我试图在'Main'中从'Function'中设置状态

我试图在“Function”内的 MyText 类 Widget 中设置一个全局变量并同时导入“Main” ==> Function & Vice Versa,但我似乎无法操作会再次触发的GlobalKey变量setState

(Class & MyText class 已被废弃)

我还尝试将其他文件中的功能设置为按钮,如下所示

floatingActionButton: functions.random()

并且以某种方式能够设置状态(对不起,我忘记了如何),但它一直在运行而没有被按下

'Main.dart'示例代码

String display = "";

class _MyHomePageState extends State<MyHomePage> {
  var currentScreen = display;
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            AutoSizeText(
              currentScreen,
              style: Theme.of(context).textTheme.display1,
            ),
          ],
        ),
      ),
      floatingActionButton: functions.menu(),
    );
  } //Build
}// _MyHomePageState

'Function.dart'示例代码

SpeedDial menu(){
  return SpeedDial(
      SpeedDialChild(
           child: Icon(Icons.autorenew),
           backgroundColor: Colors.lightBlueAccent,
           label: 'New Activity',
           labelStyle: TextStyle(fontSize: 18.0),
           onTap: () => random(),
       ),
)

random(){
...

return someString;
}

预期结果

单击子“新活动”时,将调用 setState,并将变量currentScreen 的状态设置为函数“random()”的结果

先感谢您!

标签: flutterdart

解决方案


我不知道这是否可以解决您的问题,但是该方法与您的方法会有些不同,因为我对 globalsetkey 的工作并不十分熟悉...

所以从我的角度来看,我正在使用 bloc 模式,所以希望这可以给你一些灵感来解决这个问题

类 BLoc.dart

BehaviorSubject<bool> _dialClicked = BehaviorSubject<bool>();

Observable<bool> get dialClicked => _dialClicked.stream;

Function(bool) get dialClickedListener => _dialClicked.sink.add;

main.dart 部分floatingActionButton

floatingActionButton: functions.menu(currentScreen),

Function.dart中

Widget menu(){
final bloc = Provider.of<classBLoc>();
  return StreamBuilder(stream: bloc.dialClicked, initialData: false,builder: (context, snapshot){
return SpeedDial(
      SpeedDialChild(
           child: Icon(Icons.autorenew),
           backgroundColor: Colors.lightBlueAccent,
           label: 'New Activity',
           labelStyle: TextStyle(fontSize: 18.0),
           onTap: () => snapshot.data ? currentScreen : random(), // this used for checking data if have already been clicked or not
       );
}),
);

希望这能给你一些启发它是如何工作的//对不起,如果括号有误


推荐阅读