2

我正在学习 Flutter,但我被困在状态管理上。我看了一下 Riverpod,它看起来很有希望,但我很难超越柜台应用程序来做一些更复杂的事情。

例如,我想要两个收集数字的 TextField,以及另一个 Text 小部件来显示两个 TextField 值的总和。这就是我所拥有的。

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:flutter_hooks/flutter_hooks.dart';

void main() {
  runApp(ProviderScope(
    child: MyApp(),
  ));
}

class MyApp extends HookWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MyHomePage(title: 'Adding two cells'),
    );
  }
}

final cellProvider = StateProvider((_) => <int>[0, 0]);

class MyHomePage extends HookWidget {
  MyHomePage({Key key, this.title}) : super(key: key);
  final String title;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(title),
      ),
      body: Consumer(builder: (context, watch, _) {
        print(watch(cellProvider).state);
        num _sum = watch(cellProvider).state[0] + watch(cellProvider).state[1];
        return Center(
          child: Column(
            children: [
              Row(
                mainAxisAlignment: MainAxisAlignment.center,
                children: [
                  Cell(0),
                  Cell(1),
                ],
              ),
              SizedBox(
                height: 100,
              ),
              Row(
                mainAxisAlignment: MainAxisAlignment.center,
                children: <Widget>[
                  Text('Sum: ${_sum.toString()}'),
                ],
              ),
            ],
          ),
        );
      }),
    );
  }
}

class Cell extends HookWidget {
  Cell(this.index);
  final int index;

  @override
  Widget build(BuildContext context) {
    return Container(
      width: 150,
      padding: EdgeInsets.all(30),
      child: TextField(
        inputFormatters: [FilteringTextInputFormatter.digitsOnly],
        onChanged: (value) {
          context.read(cellProvider).state[index] = num.tryParse(value);
        },
      ),
    );
  }
}

文本小部件不会更新。有什么建议吗?

非常感谢,托尼

4

1 回答 1

1

提供者仅在它提供的对象发生更改时更新,就像 Stream 返回一个最终值一样,您需要更新整个对象 ( List<int>) 以便消费者正确更新,更改可迭代对象的内部值不会触发更新

onChanged: (value) {
   final List<int> myList = context.read(cellProvider).state;
   myList[index] = num.tryParse(value); 
   context.read(cellProvider).state = myList; //update the state with a new list
},
于 2020-11-16T05:45:51.203 回答