我正在进行一些重构,以寻找适合我的感觉的颤抖的体系结构/编码样式。我喜欢许多小的独立代码块。因此,例如,我试图对AppBar小部件进行子类化。我遇到的问题是,在子类中,我无法访问最终顶级小部件的BuildContext。在下面的代码段中,我找不到要切换页面的“导航器”,因为我没有上下文可以传递给“ of(context)”。
所以,问题是:当我的后代类需要访问构建上下文时,应该使用什么惯用模式来对有状态的小部件(例如AppBar)进行子类化?
感谢您的帮助。
import 'package:flutter/material.dart';
class MyBaseAppBar extends AppBar {
MyBaseAppBar( { actions, title }) : super( actions: actions, title: title);
}
class MyPageAppBar extends MyBaseAppBar {
static var myPageActions = <Widget>[
IconButton(
icon: Icon(Icons.view_agenda),
onPressed: () =>Navigator.of( context ). pushNamed("agenda"))
];
MyPageAppBar() : super(
title : Text("My App Bar"),
actions : myPageActions
);
}
class MyStatelessWidget extends StatelessWidget {
const MyStatelessWidget({Key key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: MyPageAppBar(),
body: Container() // for example
);
}
}
答案 0 :(得分:0)
在您的情况下,为什么不在AppBar构造函数中传递上下文?您还可以在Stateless类中创建一个方法(该类调用AppBar并将其传递给扩展AppBar的构造函数。dart中的函数是第一类对象,因此您可以将它们存储在变量中。请记住避免使用右括号)作为参数传递时。
class MyBaseAppBar extends AppBar {
MyBaseAppBar( { actions, title, @required navigateTo}) : super( actions: actions, title: title);
}
class MyPageAppBar extends MyBaseAppBar {
final var NavigateTo; //you could use the Navigator Object instead for the Datatype
static var myPageActions = <Widget>[
IconButton(
icon: Icon(Icons.view_agenda),
onPressed: () =>Navigator.of( context ). pushNamed("agenda"))
];
MyPageAppBar({@required this.navigateTo}) : super(
title : Text("My App Bar"),
actions : myPageActions
);
}
class MyStatelessWidget extends StatelessWidget {
const MyStatelessWidget({Key key}) : super(key: key);
NavigateToFunc( Build context context)
{
// Code to route
}
@override
Widget build(BuildContext context) {
return Scaffold
/// You should be able to access the context in the
MyPageAppBar as it has its own build method
appBar: MyPageAppBar(navigateTo: NavigateToFunc),
body: Container() // for example
);
} } 关于模式,很多建议的技术可以解决您的挑战。
看看这个 https://flutter.dev/docs/development/data-and-backend/state-mgmt/options
我倾向于Provider插件。您可以将父窗口小部件包装在ChangeNotifierProvider中,而将在使用者中更改的窗口小部件(子级)或使用Provider.of.context在窗口小部件之间传递值。此外,您可能不需要将有状态窗口小部件与提供程序一起使用。将可更改状态的小部件包装到使用者上
答案 1 :(得分:0)
我仍然觉得仅为了更改页面而必须添加提供程序和服务是非常la脚的,但是这似乎是唯一的方法。