我正在为PaginatedDataTable编写代码,但在尝试使用showDialog()时我迷失了方向。我想要的是,当用户按下DataTable中的一行时,会出现一个对话框,其中包含该行所包含的信息。我遇到的问题是对话框的上下文,因为它需要上下文,而DataRow类本身并没有上下文。
为了识别已选择的行,必须在DataRow类中使用onSelectChanged()。在这里,我试图调用对话框,但必须使用全局导航键。
class CalendarResultsDataSource extends DataTableSource {
final List<CalendarResult> _calendarResults;
CalendarResultsDataSource(this._calendarResults);
@override
DataRow getRow(int index) {
assert(index >= 0);
if (index >= _calendarResults.length) return null;
final CalendarResult calendarResult = _calendarResults[index];
return DataRow.byIndex(
index: index,
selected: calendarResult.selected,
onSelectChanged: (bool value) {
print(value);
print(calendarResult.agency);
Dialogs.showAuditInfo(
navigatorKey.currentState.overlay.context, calendarResult); //<-- this feels hacky
},
cells: <DataCell>[
DataCell(Container(
height: double.infinity,
width: double.infinity,
color: index.isEven
? ColorDefs.colorAlternatingDark
: ColorDefs.colorDarkBackground,
child: Padding(
padding: const EdgeInsets.fromLTRB(6.0, 4.0, 4.0, 4.0),
child: Center(
child: Text('${calendarResult.getDateFormatted()}',
style: ColorDefs.textBodyWhite15)),
))), etc. etc.
]);
在dataRow类别中。
因此,我在main()中创建了一个导航键,如下所示:
final navigatorKey = GlobalKey<NavigatorState>();
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
navigatorKey: navigatorKey,
home: Scaffold(body: AwesomeAppCodeHere())
);
}
}
然后,我在onSelectChanged()方法中引用该键,如下所示:
showDialog<void>(
context: navigatorKey.currentState.overlay.context,
builder: (BuildContext context) {
return AlertDialog(
content: StatefulBuilder(
builder: (BuildContext context, StateSetter setState) {
return DialogInnards();
},
),
);
},
);
我能想到的唯一解决方案是将上下文从PaginatedDataTable小部件传递给DataRow类,但这样我就必须直接修改flutter DataRow小部件。
那么,在没有公开上下文的情况下,在类中获取上下文的最佳方法是什么呢?
我确实看到了“get”包:也许可以...... https://pub.dev/packages/get,但对于一些简单明了的东西来说,这不是矫枉过正吗?(但只是逃避我?)
2条答案
按热度按时间hi3rlvi21#
我正在处理同样的事情,并且我找到了一个解决方法。您可以在DataTableSource实现类中声明一个BuildContext属性。
此属性必须由UI提供,现在可以在DataTableSource类的方法中使用。
此解决方案的缺点是EventData类将在每次UI重建时重新示例化。
6fe3ivhb2#
正如文档中所述,
DataTableSource
是长期存在的对象,应该在PaginatedDataTable
的构建中重用,因此您不应该将上下文传递给DataTableSource
对象IMO。我更喜欢传递回调函数,它将在点击行后被调用。
以下是我在应用程序中使用的内容的简化示例:
PS:如果需要单元格内的上下文,可以将单元格子部件(这里是
Text
部件) Package 在Builder
部件内