微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将文本表单字段输入添加到列表

如何解决将文本表单字段输入添加到列表

一个关于我的 Flutter 应用的问题:

我有一个列表:

List<Item> tags = <Item>[
   Item(
     "name",Colors.red,),Item(
     "Cooking",Item(
     "Sport",];

一个 TextFormField

   TextFormField(
     controller: tagController

如何将我在表单域中输入的文本添加到列表中? 它们位于不同的 StatefulWidget 中。

解决方法

Provider 是一个很好的 flutter stateManagement 解决方案,我已经使用 provider 解决了你的问题。请仔细按照以下步骤操作,以确保正确实施。

  1. 首先将 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
  2. 创建一个扩展 pubspec.yaml

    的通知程序类
    provider: ^4.3.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
  4. 在您的 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
  5. 现在通过使用 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 举报,一经查实,本站将立刻删除。