gpt4 book ai didi

Flutter - 当不在具有构建方法的类中时如何获取上下文

转载 作者:行者123 更新时间:2023-12-05 07:07:40 26 4
gpt4 key购买 nike

我正在为 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.

]);

在数据行类中。

因此,我在 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但是对于简单的事情来说,这不是矫枉过正吗? (但只是在逃避我?)

最佳答案

我正在处理同样的事情,而且我找到了解决方法。您可以在 DataTableSource 实现类中声明一个 BuildContext 属性。

    class EventData extends DataTableSource {
final BuildContext context;
EventData({required this.context});
final List<Map<String, dynamic>> _data = List.generate(
200,
(index) => {
"price": Random().nextInt(1000),
});

@override
DataRow? getRow(int index) {
return DataRow(cells: [
DataCell(Center(
// We can know use the context in this method.
child: Text("${_data[index]['price']} €",
style: Theme.of(context)
.textTheme
.headline6!
.copyWith(fontWeight: FontWeight.bold)),
)),
]);
}

@override
bool get isRowCountApproximate => false;

@override
int get rowCount => _data.length;

@override
int get selectedRowCount => 0;
}

此属性必须由您的 UI 提供,现在可以在 DataTableSource 类的方法中使用。

class PaginatedExample extends StatelessWidget {
const PaginatedExample({super.key});

@override
Widget build(BuildContext context) {
return PaginatedDataTable(
source: EventData(context: context), //The context can be provided here.
columns: const [
DataColumn(label: Text('Price')),
],
);
}
}

此解决方案的缺点是 EventData 类将在每次 UI 重建时重新实例化。

关于Flutter - 当不在具有构建方法的类中时如何获取上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62054100/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com