如何解决如何在函数中获取上下文?
我需要为我的导航器推送获取上下文,我的函数 _navigate 上有这个导航器。我尝试了类似 _navigate(BuildContext context) 之类的东西,但是我得到了一个错误,比如“type (BuildContext) => dynamic 不是 type() => void 的子类型。这是 Navigator.push 的第一个上下文我不知道如何得到它。
import 'package:Flutter/material.dart';
import 'package:pandora_etna/assistance.dart';
import 'dart:math';
import 'package:vector_math/vector_math.dart' show radians;
import 'package:font_awesome_Flutter/font_awesome_Flutter.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
backgroundColor: Color(0xFFB3E5FC),body: SizedBox.expand(child: RadialMenu())),);
}
}
class RadialMenu extends StatefulWidget {
createState() => _RadialMenuState();
}
class _RadialMenuState extends State<RadialMenu>
with SingleTickerProviderStateMixin {
AnimationController controller;
void initState() {
super.initState();
controller =
AnimationController(duration: Duration(milliseconds: 900),vsync: this);
}
Widget build(BuildContext context) {
return RadialAnimation(controller: controller);
}
}
class RadialAnimation extends StatelessWidget {
RadialAnimation({Key key,this.controller})
: scale = Tween<double>(
begin: 1.5,end: 0.0,).animate(
CurvedAnimation(parent: controller,curve: Curves.fastOutSlowIn),),translation = Tween<double>(
begin: 0.0,end: 100.0,curve: Curves.linear),rotation = Tween<double>(begin: 0.0,end: 360.0).animate(
CurvedAnimation(
parent: controller,curve: Interval(
0.0,0.7,curve: Curves.decelerate,)),super(key: key);
final AnimationController controller;
final Animation<double> scale;
final Animation<double> translation;
final Animation<double> rotation;
build(context) {
return AnimatedBuilder(
animation: controller,builder: (context,builder) {
return Transform.rotate(
angle: radians(rotation.value),child: Stack(alignment: Alignment.center,children: [
_buildButton(0,_close,color: Color(0xFF29B6F6),icon: FontAwesomeIcons.chartBar),_buildButton(60,icon: FontAwesomeIcons.clipboard),_buildButton(120,_buildButton(180,icon: FontAwesomeIcons.book),_buildButton(240,icon: FontAwesomeIcons.arrowsAltV),_buildButton(300,_navigate,icon: FontAwesomeIcons.phoneAlt),_buildButton(360,icon: FontAwesomeIcons.compressAlt),Transform.scale(
scale: scale.value - 1.5,child: FloatingActionButton(
child: Icon(FontAwesomeIcons.timesCircle),onpressed: _close,backgroundColor: Color(0xFF29B6F6)),Transform.scale(
scale: scale.value,child: FloatingActionButton(
child: Icon(FontAwesomeIcons.solidDotCircle),onpressed: _open,]));
});
}
_buildButton(double angle,Function callback,{Color color,IconData icon}) {
final double rad = radians(angle);
return Transform(
transform: Matrix4.identity()
..translate(
(translation.value) * cos(rad),(translation.value) * sin(rad)),child: FloatingActionButton(
child: Icon(icon),backgroundColor: color,onpressed: callback));
}
_open() {
controller.forward();
}
_close() {
controller.reverse();
}
_navigate(BuildContext context) {
Navigator.push(
context,new MaterialPageRoute(builder: (context) => Assistance()));
}
}
解决方法
我认为这是因为您在调用 useEffect(()=>{
if(userData){
props.handleUserData(userData)
}
},[userData])
时丢失了 context
参数。
_buildButton
,
引用时需要将 BuildContext 传递给 _navigate 函数。您可以使用匿名函数执行此操作。 _buildButton(300,(context) => _navigate(context),...
它不起作用,因为您没有提供函数方法的上下文参数。我猜是
_buildButton(300,_navigate(context),color: Color(0xFF29B6F6),icon: FontAwesomeIcons.phoneAlt),
,
Try out below example for more idea:-
_buildButton(300,// Added Context here,It will contains context of build function
color: Color(0xFF29B6F6),
_navigate(BuildContext context) {
Navigator.push(
context,new MaterialPageRoute(builder: (context) => Assistance()));
}
,
调用您的函数 _buildButton
时,您必须将 _navigate
函数包装到另一个函数中,因为它需要您当前的上下文才能工作
试试这个
_buildButton(300,() {
_navigate(context);
},
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。