如何在函数中获取上下文?
How to get a context in a function?
我需要为我的 Navigator 推送获取上下文,我的函数 _navigate 上有这个 Navigator。我尝试了类似 _navigate(BuildContext context) 的方法,但我收到类似“type (BuildContext) => dynamic is not a subtype of type() => void. It's the first context of 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,
).animate(
CurvedAnimation(parent: controller, 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, _close,
color: Color(0xFF29B6F6), icon: FontAwesomeIcons.clipboard),
_buildButton(120, _close,
color: Color(0xFF29B6F6), icon: FontAwesomeIcons.chartBar),
_buildButton(180, _close,
color: Color(0xFF29B6F6), icon: FontAwesomeIcons.book),
_buildButton(240, _close,
color: Color(0xFF29B6F6),
icon: FontAwesomeIcons.arrowsAltV),
_buildButton(300, _navigate,
color: Color(0xFF29B6F6), icon: FontAwesomeIcons.phoneAlt),
_buildButton(360, _close,
color: Color(0xFF29B6F6),
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,
backgroundColor: Color(0xFF29B6F6)),
),
]));
});
}
_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()));
}
}
它不起作用,因为你没有给函数方法的上下文参数。我想是的
_buildButton(300, _navigate(context),
color: Color(0xFF29B6F6), icon: FontAwesomeIcons.phoneAlt),
Try out below example for more idea:-
_buildButton(300, _navigate(context), // Added Context here,It will contains context of build function
color: Color(0xFF29B6F6), icon: FontAwesomeIcons.phoneAlt),
_navigate(BuildContext context) {
Navigator.push(
context, new MaterialPageRoute(builder: (context) => Assistance()));
}
引用时需要将BuildContext传递给_navigate函数。您可以使用匿名函数来执行此操作。 _buildButton(300,(context) => _navigate(context), ...
我认为这是因为您在调用 _buildButton
时丢失了 context
参数。
/// By writing your Function parameter like this you will pass the
/// BuildContext parameter needed.
_buildButton(
300,
() => _navigate(context),
color: Color(0xFF29B6F6),
icon: FontAwesomeIcons.phoneAlt
),
调用你的函数时 _buildButton
你必须将 _navigate
函数包装到另一个函数中,因为它需要你当前的上下文才能工作
试试这个
_buildButton(300, () {
_navigate(context);
}, color: Color(0xFF29B6F6), icon: FontAwesomeIcons.phoneAlt),
我需要为我的 Navigator 推送获取上下文,我的函数 _navigate 上有这个 Navigator。我尝试了类似 _navigate(BuildContext context) 的方法,但我收到类似“type (BuildContext) => dynamic is not a subtype of type() => void. It's the first context of 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,
).animate(
CurvedAnimation(parent: controller, 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, _close,
color: Color(0xFF29B6F6), icon: FontAwesomeIcons.clipboard),
_buildButton(120, _close,
color: Color(0xFF29B6F6), icon: FontAwesomeIcons.chartBar),
_buildButton(180, _close,
color: Color(0xFF29B6F6), icon: FontAwesomeIcons.book),
_buildButton(240, _close,
color: Color(0xFF29B6F6),
icon: FontAwesomeIcons.arrowsAltV),
_buildButton(300, _navigate,
color: Color(0xFF29B6F6), icon: FontAwesomeIcons.phoneAlt),
_buildButton(360, _close,
color: Color(0xFF29B6F6),
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,
backgroundColor: Color(0xFF29B6F6)),
),
]));
});
}
_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()));
}
}
它不起作用,因为你没有给函数方法的上下文参数。我想是的
_buildButton(300, _navigate(context),
color: Color(0xFF29B6F6), icon: FontAwesomeIcons.phoneAlt),
Try out below example for more idea:-
_buildButton(300, _navigate(context), // Added Context here,It will contains context of build function
color: Color(0xFF29B6F6), icon: FontAwesomeIcons.phoneAlt),
_navigate(BuildContext context) {
Navigator.push(
context, new MaterialPageRoute(builder: (context) => Assistance()));
}
引用时需要将BuildContext传递给_navigate函数。您可以使用匿名函数来执行此操作。 _buildButton(300,(context) => _navigate(context), ...
我认为这是因为您在调用 _buildButton
时丢失了 context
参数。
/// By writing your Function parameter like this you will pass the
/// BuildContext parameter needed.
_buildButton(
300,
() => _navigate(context),
color: Color(0xFF29B6F6),
icon: FontAwesomeIcons.phoneAlt
),
调用你的函数时 _buildButton
你必须将 _navigate
函数包装到另一个函数中,因为它需要你当前的上下文才能工作
试试这个
_buildButton(300, () {
_navigate(context);
}, color: Color(0xFF29B6F6), icon: FontAwesomeIcons.phoneAlt),