我希望能够搜索来自API的列表中的数据,并使用选择的值来显示详细信息页面。
我正在使用Provider package
。
我有一个更改通知程序,可以获取所需数据:
class NotifierClass with ChangeNotifier {
List<Map> _contentList = <...some api call...>;
List<Map> _filteredContent = _contentList;
List<Map> get filteredContent => _filteredContent;
void createFilterContent(String query) {
_filteredContent = _contentList;
if (query.isNotEmpty && query != null && query != '') {
_filteredContent = _filteredContent
.where((i) => i.title.toLowerCase().contains(query.toLowerCase()))
.toList();
}
notifyListeners();
}
}
即如果查询为空,则返回完整列表。否则,什么都不做。
我将我的应用包装在一个多提供程序中,因为它将有其他提供程序:
void main() => runApp(
MultiProvider(
providers: [
ChangeNotifierProvider(
create: (_) => NotifierClass(),
)
],
child: MyApp(),
),
);
MyApp具有以下嵌套:
|__Home (StatefulWidget)
| |__Screen 1 (StatelessWidget)
| |__Screen 2 (StatefulWidget)
| |__search (widget)
| |__content (widget)
|__ContentDetail (StatelessWidget)
...
我希望search
在键入内容时呼叫createFilterContent
我希望content
成为Selector
的开头{{1}更改时filteredContent
的{{1}}
我尝试了很多事情。我唯一尝试过的方法是在MyApp中声明一个contentNotifier,然后将其向下推到小部件树中:
在MyApp版本中声明:
search
一直推到屏幕2:
NotifierClass contentNotifier = Provider.of<NotifierClass >(context);
这使我可以访问NotifierClass中的函数。然后,我定义了一个搜索控制器:
class ScreenTwoPage extends StatefulWidget {
ScreenTwoPage (NotifierClass contentNotifier , {Key key}) : super(key: key);
@override
_ScreenTwoPageState createState() => _ScreenTwoPageState();
}
class _ScreenTwoPageState extends State<ScreenTwoPage > {
NotifierClass contentNotifier ;
_ScreenTwoPageState(this.contentNotifier);
...
使用文本字段的final searchController = TextEditingController();
方法调用onchanged
函数,其中createFilterContent
为searchController.text
。这将重建整个窗口小部件树,为我提供一个新的query
列表以构建我的filteredContent
列表视图。
我使用content
中的数据,
Screen 2
从我的Navigator.of(context)
.pushNamed('/contentDetail', arguments: contentList[index]);
内部进入详细信息页面
它可以满足我的要求,但是每次我与listview builder
上的小部件进行交互时都会引发此错误:
Screen 2
此外,这似乎很混乱,通过将════════ Exception caught by foundation library ════════════════════════════════
setState() or markNeedsBuild() called during build.
════════════════════════════════════════════════════════════════════════════════
推到小部件树下似乎违反了contentNotifier
包的目的。
我是新手。非常感谢您提供任何帮助。