Flutter:按下按钮后,只能在初始化程序中访问静态成员

时间:2019-08-12 13:10:16

标签: flutter dart

我有此代码:

class HomePage extends StatefulWidget {
  HomePage({this.auth, this.onSignedOut});

  final BaseAuth auth;
  final VoidCallback onSignedOut;

  State<StatefulWidget> createState() => new _HomePageState();
}

class _HomePageState extends State<HomePage> {
  @override
  void initState() {
    // TODO: implement initState
    super.initState();
  }
  void signOut() async {
    try {
      await widget.auth.signOut();
      widget.onSignedOut();
    } catch (e) {
      print(e);
    }
  }

按下按钮时会触发以下内容:

Container(
      child: new RaisedButton(
        child: new Text('Sign Out'),
          onPressed: signOut,
      ),
    )

但是,我通过onPressed: signOut收到此错误: Only static members can be accessed in initializers.

我想要这样,以便在按钮按下时调用该功能signOut()来运行其中的代码。有什么办法可以做到吗?我认为这与我如何初始化authonSignedOut方法有关。

非常感谢您。

1 个答案:

答案 0 :(得分:1)

您正在使用

Container(
      child: new RaisedButton(
        child: new Text('Sign Out'),
          onPressed: signOut,
      ),
    )

在类主体声明中,您有两种解决方法。

  1. 使用signOut()方法static

  2. build内的方法中使用上述小部件

    @override
    Widget build(BuildContext context) {
    
      var container = Container(
        child: new RaisedButton(
          child: new Text('Sign Out'),
          onPressed: signOut,
        ),
      );
    
      return container;
    }
    

更新

This是一个非常基本的示例。因此,为简单起见,他们使用了List<Widgets>,我用我的示例更新了该示例,您可以看到如何使用_getWidget()方法来解决同一示例。

int _selectedIndex = 0;
static const TextStyle optionStyle = TextStyle(fontSize: 30, fontWeight: FontWeight.bold);
Widget _getWidget(int index) {
  switch(index) {
    case 0: return Text(
      'Index 0: Home',
      style: optionStyle,
    );

    case 1:
      return Text(
        'Index 1: Business',
        style: optionStyle,
      );

    case 2:
      return Text(
        'Index 2: School',
        style: optionStyle,
      );
  }
  return Container();
}

void _onItemTapped(int index) {
  setState(() {
    _selectedIndex = index;
  });
}
@override
Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(title: const Text('BottomNavigationBar Sample')),
    body: Center(child: _getWidget(_selectedIndex)),
    bottomNavigationBar: BottomNavigationBar(
      items: const <BottomNavigationBarItem>[
        BottomNavigationBarItem(
          icon: Icon(Icons.home),
          title: Text('Home'),
        ),
        BottomNavigationBarItem(
          icon: Icon(Icons.business),
          title: Text('Business'),
        ),
        BottomNavigationBarItem(
          icon: Icon(Icons.school),
          title: Text('School'),
        ),
      ],
      currentIndex: _selectedIndex,
      selectedItemColor: Colors.amber[800],
      onTap: _onItemTapped,
    ),
  );
}