如何解决将文本表单字段输入添加到列表
List<Item> tags = <Item>[
Item(
"name",Colors.red,),Item(
"Cooking",Item(
"Sport",];
和一个 TextFormField
TextFormField(
controller: tagController
如何将我在表单域中输入的文本添加到列表中? 它们位于不同的 StatefulWidget 中。
解决方法
Provider 是一个很好的 flutter stateManagement 解决方案,我已经使用 provider 解决了你的问题。请仔细按照以下步骤操作,以确保正确实施。
-
首先将
false
添加到export const StateProvider = ({ children }) => { const initialState = () => { if (typeof window !== 'undefined') { return { basket: window.localStorage.getItem('basket') === null ? [] : window.localStorage.getItem('basket'),viwedItems: [],saved: [],}; } return { basket: [],viewedItems: [],saved: [] }; // Add this so `state` is not undefined on the server-side }; const [state,dispatch] = useReducer(productReducer,initialState()); useEffect(() => { window.localStorage.setItem('basket',state.basket); },[state.basket]); // Accessing `state.basket` will no longer throw an error //... }
Provider
-
创建一个扩展
的通知程序类pubspec.yaml
provider: ^4.3.3
-
把你
ChangeNotifier
包裹在class ItemListNotifier extends ChangeNotifier{ List<Item> tags = <Item>[ Item( "name",Colors.red,),Item( "Cooking",Item( "Sport",]; void add(Item item){ tags.add(item); notifyListeners(); //Rebuilds the Stateful widget on updating list } }
内MaterialApp
-
在您的
ChangeNotifierProvider
中,使用名为class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return ChangeNotifierProvider<ItemListNotifier>( create: (context) => ItemListNotifier(),child: MaterialApp( title: 'Flutter Demo',theme: ThemeData( primarySwatch: Colors.blue,visualDensity: VisualDensity.adaptivePlatformDensity,home: ScreenWithList(),) ); } }
的列表访问通知程序的值,使用statefulWidget
访问通知程序的值,该值在每次列表更新时重建并防止整个屏幕重建。>tags
-
现在通过使用
Consumer
访问class ScreenWithList extends StatefulWidget { @override _ScreenWithListState createState() => _ScreenWithListState(); } class _ScreenWithListState extends State<ScreenWithList> { List<Item> tags = <Item>[ Item( "name",Item( "Cooking",Item( "Sport",]; @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(),body: Center(child: Consumer<ItemListNotifier>( builder: (context,list,child) { print('Rebuilt'); return ListView.builder( itemCount: list?.tags?.length ?? 0,itemBuilder: (context,index) { return Text(list?.tags[index]?.name ?? ''); } ); },) ),floatingActionButton: FloatingActionButton( child: Icon( Icons.arrow_forward,onPressed: () => Navigator.push(context,MaterialPageRoute(builder: (context) => ScreenWithFormField())) ),); } }
的statefulWidget
函数,从Provider
更新您的列表。add
这里发生了什么?
每次使用 ItemListNotifier
FloatingActionButton(
child: Icon(Icons.add),onPressed: () => Provider.of<ItemListNotifier>(context,listen: false).add(Item(tagController.text.trim(),Colors.red)),
方法更新列表时,它都会重建 ItemListNotifier's
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。